Я использую внешнюю флэш-память W25Q128FW от Winbound с микроконтроллером STM32L4 и пытаюсь заставить их взаимодействовать через шину SPI.
Моя проблема в том, что у меня нет ответа от w25q на мои запросы. Например, когда я отправляю протокол «get_id», предполагается, что он отправляет обратно идентификатор (как сказано в таблице данных), но у меня ничего нет на выводе DO флэш-памяти (поэтому ответа от него нет).
Я использовал STM32CubeMX для настройки контактов (GPIO и SPI), вот их конфигурация:
контакты SPI
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; //312.25 Kbit/s
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
И порты GPIO
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, SPI_HOLD_Pin|SPI_WP_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : FLASH_CS_Pin */
GPIO_InitStruct.Pin = FLASH_CS_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(FLASH_CS_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : SPI_HOLD_Pin SPI_WP_Pin */
GPIO_InitStruct.Pin = SPI_HOLD_Pin|SPI_WP_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
Затем я использую небольшую тестовую функцию в своей основной программе. Я начинаю с инициализации вспышки командами сброса "0x66", чтобы включить сброс, и "0x99", чтобы сбросить устройство.
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET); //chipselect
BufferSendFlash[0]=0x66; //reset enable order
HAL_SPI_Transmit(&hspi1, BufferSendFlash, 1, 1000);
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET); //chip desselect
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET); //chipselect
BufferSendFlash[0]=0x99; //reset devise order
HAL_SPI_Transmit(&hspi1, BufferSendFlash, 1, 1000);
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET); //chipdesselect
мое устройство должно быть инициализировано сейчас. Затем я пытаюсь прочитать идентификатор устройства, отправив команду «0x90», за которой следуют 2 фиктивных байта и 0x00 (как указано в таблице данных), и я должен получить 2 байта вместе с производителем и идентификатором сразу после.
дейтаграмма инструкции ID устройства
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
BufferSendFlash[0]=0x90; //ask for ID instruction
BufferSendFlash[1]=0x00; //dummy
BufferSendFlash[2]=0x00; //dummy
BufferSendFlash[3]=0x00; //end of address
HAL_SPI_Transmit(&hspi1, BufferSendFlash, 4, 1000); //send the order
HAL_SPI_Receive(&hspi1,BufferReceiveFlash, 2, 1000); //read the flash answer
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET);
Вот что я вижу на осциллографе (я использовал подтягивание на выводах MOSI и MISO на STM32):
ввод и вывод данных с флеш-памяти
мы можем видеть, что у меня есть часы и порядок (отправленный с вывода MOSI stm32 на вывод DI вспышки), но мы видим на выводе DO (вывод данных), у нас ничего нет, кроме часов здесь.
Я мог бы забыть шаг инициализации вспышки, но я не могу понять это, так как я следовал за таблицей данных. Я не могу найти что-либо в Интернете, чтобы помочь мне, поэтому, если у кого-то есть решение этой проблемы, пожалуйста, помогите мне, вы действительно здесь! спасибо.