如何使用W25Q32FV SPI FLASH?

时间:2018-05-29 12:37:10

标签: c flash stm32 spi cubemx

当我开始使用来自winbond W25Q32FV和STM32F103RCT6 CORTEX M3的SPI FLASH时。我正面临一个理解事情应该如何运作的真正问题。

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

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

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

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

  1. 这里我直接发送Write enable作为我的第一个命令。我应该首先发送id吗?我的意思是如何启动并让MCU知道他有一个闪存连接到spi引脚。
  2. 2.如何发送24位地址?我开始在flash中写入数据的起始地址是什么?

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

    任何帮助将不胜感激。

    提前谢谢。

0 个答案:

没有答案