正如我从winbond W25Q32FV和STM32F103RCT6 CORTEX M3开始的SPI FLASH一样。我面临着一个真正的问题,即理解事情应该如何运作。
我正在使用 CUBEMX。首先,我选择 RCC 作为晶体/陶瓷谐振器,并将我的时钟配置为 72MHz。然后我将 SPI1 配置为 FULL DUPLEX MASTER。我只有 3 个引脚(PA5 - SCK,PA6- MISO,PA7 - MOSI)所以我将 CS 引脚配置为 PA2 上的 GPIO 输出。
现在写入闪存?我需要做的第一件事是什么?我需要遵循哪些步骤?
只要我首先参考数据表,我就需要启用写入(0x06)。然后我需要发送页面程序(0x02),然后我需要发送 24 位地址。然后我需要发送至少 1 个字节的数据。所有这些过程都会在 CS 为低电平时发生,然后在发送完所有这些 CS 后将变为高电平。
然后我禁用写入启用,即写入禁用(0x04)。
之后我试图从该地址读取数据,所以,我发送读取数据(0x03)和 24 位地址。然后在缓冲区中接收数据。
这是示例代码:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(10);
SPI_TX_BUFF[0] = 0x06;
SPI_TX_BUFF[1] = 0x02;
SPI_TX_BUFF[2] = 0x00;
SPI_TX_BUFF[3] = 0x00;
SPI_TX_BUFF[4] = 0x01;
SPI_TX_BUFF[5] = 0x11;
HAL_SPI_Transmit(&hspi1, SPI_TX_BUFF, 6, 50);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(10);
SPI_TX_BUFF[0] = 0x04;
HAL_SPI_Transmit(&hspi1, SPI_TX_BUFF, 1, 50);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(10);
SPI_TX_BUFF[0] = 0x03;
SPI_TX_BUFF[1] = 0x00;
SPI_TX_BUFF[2] = 0x00;
SPI_TX_BUFF[3] = 0x01;
HAL_SPI_Transmit(&hspi1, SPI_TX_BUFF, 4, 50);
HAL_SPI_Receive(&hspi1, SPI_RX_BUFF, 1, 50);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(100);
此代码不起作用。刷新代码后,我什至无法进入调试模式。它说没有连接目标。我知道我做错了什么,需要一些指导。我只需要知道成功启动、写入和读取 spi flash 所涉及的步骤是什么。
就像我对一些东西感到困惑
- 在这里,我直接发送写入启用作为我的第一个命令。这里我需要先发送 id 吗?我的意思是如何启动并让 MCU 知道他正在将闪存连接到 spi 引脚。
2.如何发送24位地址?我开始在闪存中写入数据的起始地址是什么?
3.什么时候是简单的一闪一闪。MCU 工作正常,但是当我刷新此代码时,为什么会提示 NO TARGET CONNECTED。然后我必须按下重置并删除所有内容。
任何帮助将不胜感激。
先感谢您。