[STM32F4] 基于HAL库的SPI读FLASH

[复制链接]
1471|43
 楼主| 原来是wjc 发表于 2021-2-20 23:03 | 显示全部楼层
  1. #define   Read_Status_1  0x05  //写使能指令
 楼主| 原来是wjc 发表于 2021-2-20 23:06 | 显示全部楼层
 楼主| 原来是wjc 发表于 2021-2-20 23:08 | 显示全部楼层
 楼主| 原来是wjc 发表于 2021-2-20 23:08 | 显示全部楼层
  1. /***************flash读取状态等待****************/
  2. void W25X_WaitBusy()
  3. {
  4.     uint8_t tmp;
  5.     while(1)
  6.     {
  7.     FLASH_CS_RESET();//CS拉低使能芯片
  8.     W25X_SPIRWByte(Read_Status_1);//写入指令
  9.     tmp = W25X_SPIRWByte(0xff);
  10.     FLASH_CS_SET();
  11.     if((tmp & 0x01) == 0)
  12.         {
  13.             return;    //可加入超时跳出
  14.         }            
  15.     }
  16.    
  17. }
 楼主| 原来是wjc 发表于 2021-2-20 23:12 | 显示全部楼层
擦除指令: W25X_Erase(uint32_t address) 3195603126061fd41.png
 楼主| 原来是wjc 发表于 2021-2-20 23:13 | 显示全部楼层
 楼主| 原来是wjc 发表于 2021-2-20 23:14 | 显示全部楼层
擦除指令位0x20
  1. #define   Sector_Erase   0x20  //擦除指令
 楼主| 原来是wjc 发表于 2021-2-20 23:15 | 显示全部楼层
与0为0 1163160312766605a9.png
 楼主| 原来是wjc 发表于 2021-2-20 23:16 | 显示全部楼层

  1. /***************flash擦除****************/
  2. //传入一个地址进行擦除
  3. void W25X_Erase(uint32_t address)
  4. {
  5.     FLASH_CS_RESET();//CS拉低使能芯片
  6.     W25X_SPIRWByte(Sector_Erase);//写入指令
  7.     W25X_SPIRWByte((address >> 16) & 0xff);//从高位开始写入24位地址
  8.     W25X_SPIRWByte((address >> 8) & 0xff);//从高位开始写入24位地址  
  9.     W25X_SPIRWByte((address >> 0) & 0xff);//从高位开始写入24位地址   
  10.     FLASH_CS_SET();
  11.    
  12.    
  13. }
 楼主| 原来是wjc 发表于 2021-2-20 23:18 | 显示全部楼层
为什么是(address >> 16) & 0xffFLASH写页操作:W25X_WritePage(uint32_t address, uint8_t *pbuf, uint16_t len);

 楼主| 原来是wjc 发表于 2021-2-20 23:18 | 显示全部楼层
 楼主| 原来是wjc 发表于 2021-2-20 23:20 | 显示全部楼层
  1. #define   Page_Problem   0x02  //写页指令
 楼主| 原来是wjc 发表于 2021-2-20 23:22 | 显示全部楼层
 楼主| 原来是wjc 发表于 2021-2-20 23:23 | 显示全部楼层

  1. /***************flash写页操作****************/
  2. void W25X_WritePage(uint32_t address, uint8_t *pbuf, uint16_t len)
  3. {
  4.     uint16_t i = 0;
  5.     W25X_WriteEnable();
  6.     FLASH_CS_RESET();//CS拉低使能芯片
  7.     W25X_SPIRWByte(Page_Problem);//写入指令
  8.     W25X_SPIRWByte((address >> 16) & 0xff);//从高位开始写入24位地址
  9.     W25X_SPIRWByte((address >> 8) & 0xff);//从高位开始写入24位地址  
  10.     W25X_SPIRWByte((address >> 0) & 0xff);//从高位开始写入24位地址
  11.     for(i = 0; i<len; i++)
  12.     {
  13.         W25X_SPIRWByte(pbuf[i]);
  14.     }
  15.     FLASH_CS_SET();
  16.     W25X_WaitBusy();
  17. }
 楼主| 原来是wjc 发表于 2021-2-20 23:25 | 显示全部楼层
FLASH读操作:W25X_ReadData(uint32_t address, uint8_t *pbuf, uint16_t len);
  1. #define   Read_Data      0x03  //读指令
 楼主| 原来是wjc 发表于 2021-2-20 23:26 | 显示全部楼层
  1. /***************flash读操作****************/
  2. void W25X_ReadData(uint32_t address, uint8_t *pbuf, uint16_t len)
  3. {
  4.     uint16_t i = 0;
  5.     W25X_WriteEnable();
  6.     FLASH_CS_RESET();//CS拉低使能芯片
  7.     W25X_SPIRWByte(Read_Data);//写入指令
  8.     W25X_SPIRWByte((address >> 16) & 0xff);//从高位开始写入24位地址
  9.     W25X_SPIRWByte((address >> 8) & 0xff);//从高位开始写入24位地址  
  10.     W25X_SPIRWByte((address >> 0) & 0xff);//从高位开始写入24位地址
  11.     for(i = 0; i<len; i++)
  12.     {
  13.         pbuf[i] = W25X_SPIRWByte(0xff); //传输任意数
  14.     }
  15.     FLASH_CS_SET();
  16.     W25X_WaitBusy();
  17. }
 楼主| 原来是wjc 发表于 2021-2-20 23:28 | 显示全部楼层
讲解:

比如我要读一组数据,建立一个缓冲区  uint8_t buffer[256]; //准备一个页的缓冲区

向缓冲区写入一组数据:  W25X_WritePage(0, buffer, 256);  //写入缓冲区256个字节

0是起始地址,buffer是写入缓冲区,256是写入字节长度

我要写一组数据则是利用  W25X_ReadData(0, buffer, 256);

我们可以看到,实现FLASH的读写操作仅仅用了一个函数:W25X_SPIRWByte(uint8_t b)

而这个函数仅仅是由HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)这个函数实现的,这个函数实际上就实现了全双工通信,即主机和从机同步传输数据。换种方式来说就是SPI内部有一个移位寄存器,主机发送一个字节到从机,同时会把从机的一位数据移出,移出的数据同时转移给主机,即SPI通信是发送一位接收一位。

这个函数就是实现了发送一个数据同时接收一个数据这样一个功能,比如我接收一个数据只需要W25X_SPIRWByte(0xff),我们向从机发送0xff,这个值是任意的,因为我们只想要接收值,返回的值就是从机的值。那么如果是向从机发送值呢?只要把W25X_SPIRWByte(写上我们想要发送的值就好了)。
 楼主| 原来是wjc 发表于 2021-2-20 23:29 | 显示全部楼层
SPI+DMA处理读写FLASH 8560260312abe0bcca.png 加入DMA之后程序上没什么太大的改动。

木木guainv 发表于 2021-3-3 10:16 | 显示全部楼层
非常简单的操作
drer 发表于 2021-3-3 11:02 | 显示全部楼层
连寄存器都介绍了啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部