标题: STM32RCt6 SPI与W25Q16源程序 [打印本页]

作者: IceHowe    时间: 2019-7-19 18:23
标题: STM32RCt6 SPI与W25Q16源程序
  1. #include "w25qxx.h"
  2. #include "spi.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. u16 W25QXX_TYPE=W25Q16;        //默认是W25Q16



  6. //初始化SPI FLASH的IO口   SPI CS PA2
  7. void W25QXX_Init(void)
  8. {        
  9.   GPIO_InitTypeDef GPIO_InitStructure;
  10.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );//PORTB时钟使能

  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  // PA2 推挽   
  12.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
  13.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.          GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.          GPIO_SetBits(GPIOA,GPIO_Pin_2);

  16.   W25QXX_CS=1;                                //SPI FLASH不选中
  17.         SPI2_Init();                           //初始化SPI
  18.         SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
  19.         W25QXX_TYPE=W25QXX_ReadID();//读取FLASH ID.

  20. }  

  21. //读取W25QXX的状态寄存器
  22. //BIT7  6   5   4   3   2   1   0
  23. //SPR   RV  TB BP2 BP1 BP0 WEL BUSY
  24. //SPR:默认0,状态寄存器保护位,配合WP使用
  25. //TB,BP2,BP1,BP0:FLASH区域写保护设置
  26. //WEL:写使能锁定
  27. //BUSY:忙标记位(1,忙;0,空闲)
  28. //默认:0x00
  29. u8 W25QXX_ReadSR(void)   
  30. {  
  31.         u8 byte=0;   
  32.         W25QXX_CS=0;                            //使能器件   
  33.         SPI2_ReadWriteByte(W25X_ReadStatusReg); //发送读取状态寄存器命令   
  34.         byte=SPI2_ReadWriteByte(0Xff);          //读取一个字节  
  35.         W25QXX_CS=1;                            //取消片选     
  36.         return byte;   
  37. }
  38. //写W25QXX状态寄存器
  39. //只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!!
  40. void W25QXX_Write_SR(u8 sr)   
  41. {   
  42.         W25QXX_CS=0;                            //使能器件   
  43.         SPI2_ReadWriteByte(W25X_WriteStatusReg);//发送写取状态寄存器命令   
  44.         SPI2_ReadWriteByte(sr);                       //写入一个字节  
  45.         W25QXX_CS=1;                            //取消片选                  
  46. }   
  47. //W25QXX写使能        
  48. //将WEL置位   
  49. void W25QXX_Write_Enable(void)   
  50. {
  51.         W25QXX_CS=0;                                  //使能器件   
  52.     SPI2_ReadWriteByte(W25X_WriteEnable);         //发送写使能  
  53.         W25QXX_CS=1;                                   //取消片选                  
  54. }
  55. //W25QXX写禁止        
  56. //将WEL清零  
  57. void W25QXX_Write_Disable(void)   
  58. {  
  59.         W25QXX_CS=0;                            //使能器件   
  60.     SPI2_ReadWriteByte(W25X_WriteDisable);  //发送写禁止指令   
  61.         W25QXX_CS=1;                            //取消片选                  
  62. }         
复制代码
  1. #include "w25qxx.h"
  2. #include "spi.h"
  3. #include "usart.h"
  4. #include "key.h"
  5. #include "delay.h"
  6. #include "led.h"

  7. #define SIZE sizeof(key0)

  8. int main(void)
  9. {
  10.         u32 FLASH_SIZE=16*1024*1024;//2M字节
  11.         const u8 key0[]={"按下KEY0"};
  12.         const u8 key1[]={"按下KEY1"};
  13.         u8 data[SIZE];
  14.         u8 key;
  15.         
  16.         KEY_Init();
  17.         delay_init();
  18.         LED_Init();
  19.         W25QXX_Init();
  20.         uart_init(115200);
  21.         
  22.         while(W25QXX_ReadID()!=W25Q16)                                                                //检测不到W25Q16
  23.         {
  24.                 printf("未检测到W25Q16\n");
  25.                 delay_ms(1000);
  26.         }
  27.         if(W25QXX_ReadID()==W25Q16)
  28.         {
  29.                 printf("检测到W25Q16\n");
  30.         }
  31.         W25QXX_Erase_Chip();
  32.         while(1)
  33.         {
  34.                 key=KEY_Scan(0);
  35.                 if(key==KEY0_PRES)
  36.                 {
  37.                         W25QXX_Write((u8*)key0,FLASH_SIZE-100,SIZE);                        //从倒数第100个地址处开始,写入SIZE长度的数据
  38.                         printf("%s\n","存储内容为:按下KEY0");
  39.                         PAout(8)=!PAout(8);
  40.                 }
  41.                 else if(key==KEY1_PRES)
  42.                 {
  43.                         W25QXX_Write((u8*)key1,FLASH_SIZE-100,SIZE);                        //从倒数第100个地址处开始,写入SIZE长度的数据
  44.                         printf("%s\n","存储内容为:按下KEY1");
  45.                         PDout(2)=!PDout(2);
  46.                 }
  47.                 else if(key==WKUP_PRES)
  48.                 {
  49.                         W25QXX_Read(data,FLASH_SIZE-100,SIZE);                                        //从倒数第100个地址处开始,读出SIZE个字节
  50.                         printf("读取成功,内容为:%s\n",data);
  51.                         PAout(8)=!PAout(8);
  52.                         PDout(2)=!PDout(2);
  53.                 }
  54.                 else
  55.                 {
  56.                         delay_ms(10);
  57.                 }

  58.         }
  59.         
  60. }

复制代码
全部资料51hei下载地址:
SPI_Flash.7z (185.11 KB, 下载次数: 87)
(新版)MINI-STM32--原理图M.pdf (351.44 KB, 下载次数: 39)


作者: jzdcff    时间: 2019-7-31 12:34
你好,在实际用的时候大部分存储读写的是 32位整数,读写函数只能按照8位传输,请问改如何实现32位整数的读写保存。
作者: ppnnwst    时间: 2021-11-10 09:54
nihao,id读取不对怎么办




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1