正如我从带有STM32F103RCT6 CORTEX M3的winbond W25Q32FV的SPI FLASH开始 . 我正面临一个理解事情如何运作的真正问题 .

我正在使用CUBEMX . 首先,我选择RCC作为晶体/陶瓷谐振器,并将我的时钟配置为72MHz . 然后我将SPI1配置为FULL DUPLEX MASTER . 我只有3个引脚(PA5 - SCK,PA6- MISO,PA7 - MOSI)所以我将CS引脚配置为PA2上的GPIO OUTPUT .

现在要写flash吗?我需要做的第一件事是什么?我需要遵循哪些步骤?

只要我首先参考数据表,我需要启用写入(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的步骤是什么 .

就像我对一些东西感到困惑

  • 这里我直接发送Write enable作为我的第一个命令 . 我应该首先发送id吗?我的意思是如何启动并让MCU知道他有一个连接到spi引脚的闪存 .

2.如何发送24位地址?我开始在flash中写入数据的起始地址是什么?

3.什么时候闪光灯是一个简单的闪光灯 . MCU工作正常,但当我闪存此代码时为什么警报无目标连接 . 然后我必须按复位并清除所有内容 .

任何帮助将不胜感激 .

先感谢您 .