AT25/AT45 + stm32f4

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Товарищи коты, в очередной раз прошу совета:)
AT45db081D не хочет ничего выдавать. На линии SO висит логический 0. Пробовал читать айди, пробовал все подряд адреса в МС слать (в цикле). Все тихо. Купил AT25DF321A - то же самое. Что может быть не так? Схема вроде бы правильно собрана, все сигналы на входах МС имеются (смотрел осциллографом). Reset в высоком, CS на время обмена устанавливаю в 0. Может в инициализации МК что-то не так? Или память сначала нужно как-то хитро инициализировать? *прилагаю кусочек кода, который отвечает за SPI
Спойлер

Код: Выделить всё

void vSPI(void *pvParameters)	{
	SPI_init();
	vTaskDelay(20 / portTICK_RATE_MS);
	for (;;) {
		FLASH_CS_0();

		SPI_I2S_SendData(SPI1, 0x05);
		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
		SPI_I2S_SendData(SPI1, 0x00);
		while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
		

		FLASH_CS_1();
		delay(100);
	}
	vTaskDelete(NULL);
}
Спойлер

Код: Выделить всё

	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;

	// set alternative GPIO function for SPI
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);		// remap

	// SCK, MISO pins init
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_5;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	// CS pin init
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	// MOSI pin init
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	// RESET pin init
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	// Enable SPI1 power
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

	// SPI init
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; 	// (168 / 32) == 5MHz
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_Init(SPI1, &SPI_InitStructure);
	SPI_Cmd(SPI1, ENABLE);

	// Set software NSS
	SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);

    FLASH_RST_0(); // RESET
    FLASH_CS_1();
    delay(100);
    FLASH_RST_1();
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Проблема как-то ушла сама собой:) На осциллографе сигнал на SO появился. Правда потом увидел, что я альтернативную функцию для MOSI неправильно объявил) но оно и так как-то работало
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Реклама
Ответить

Вернуться в «Периферия»