找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3092|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32RCt6 SPI與W25Q16源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:570907 發(fā)表于 2019-7-19 18:23 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  1. #include "w25qxx.h"
  2. #include "spi.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. u16 W25QXX_TYPE=W25Q16;        //默認(rèn)是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時(shí)鐘使能

  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);//設(shè)置為18M時(shí)鐘,高速模式
  19.         W25QXX_TYPE=W25QXX_ReadID();//讀取FLASH ID.

  20. }  

  21. //讀取W25QXX的狀態(tài)寄存器
  22. //BIT7  6   5   4   3   2   1   0
  23. //SPR   RV  TB BP2 BP1 BP0 WEL BUSY
  24. //SPR:默認(rèn)0,狀態(tài)寄存器保護(hù)位,配合WP使用
  25. //TB,BP2,BP1,BP0:FLASH區(qū)域?qū)懕Wo(hù)設(shè)置
  26. //WEL:寫使能鎖定
  27. //BUSY:忙標(biāo)記位(1,忙;0,空閑)
  28. //默認(rèn):0x00
  29. u8 W25QXX_ReadSR(void)   
  30. {  
  31.         u8 byte=0;   
  32.         W25QXX_CS=0;                            //使能器件   
  33.         SPI2_ReadWriteByte(W25X_ReadStatusReg); //發(fā)送讀取狀態(tài)寄存器命令   
  34.         byte=SPI2_ReadWriteByte(0Xff);          //讀取一個(gè)字節(jié)  
  35.         W25QXX_CS=1;                            //取消片選     
  36.         return byte;   
  37. }
  38. //寫W25QXX狀態(tài)寄存器
  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);//發(fā)送寫取狀態(tài)寄存器命令   
  44.         SPI2_ReadWriteByte(sr);                       //寫入一個(gè)字節(jié)  
  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);         //發(fā)送寫使能  
  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);  //發(fā)送寫禁止指令   
  61.         W25QXX_CS=1;                            //取消片選                  
  62. }         
復(fù)制代碼
  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字節(jié)
  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);                        //從倒數(shù)第100個(gè)地址處開始,寫入SIZE長度的數(shù)據(jù)
  38.                         printf("%s\n","存儲內(nèi)容為:按下KEY0");
  39.                         PAout(8)=!PAout(8);
  40.                 }
  41.                 else if(key==KEY1_PRES)
  42.                 {
  43.                         W25QXX_Write((u8*)key1,FLASH_SIZE-100,SIZE);                        //從倒數(shù)第100個(gè)地址處開始,寫入SIZE長度的數(shù)據(jù)
  44.                         printf("%s\n","存儲內(nèi)容為:按下KEY1");
  45.                         PDout(2)=!PDout(2);
  46.                 }
  47.                 else if(key==WKUP_PRES)
  48.                 {
  49.                         W25QXX_Read(data,FLASH_SIZE-100,SIZE);                                        //從倒數(shù)第100個(gè)地址處開始,讀出SIZE個(gè)字節(jié)
  50.                         printf("讀取成功,內(nèi)容為:%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. }

復(fù)制代碼
全部資料51hei下載地址:
SPI_Flash.7z (185.11 KB, 下載次數(shù): 87)
(新版)MINI-STM32--原理圖M.pdf (351.44 KB, 下載次數(shù): 39)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:544352 發(fā)表于 2019-7-31 12:34 | 只看該作者
你好,在實(shí)際用的時(shí)候大部分存儲讀寫的是 32位整數(shù),讀寫函數(shù)只能按照8位傳輸,請問改如何實(shí)現(xiàn)32位整數(shù)的讀寫保存。
回復(fù)

使用道具 舉報(bào)

板凳
ID:979665 發(fā)表于 2021-11-10 09:54 | 只看該作者
nihao,id讀取不對怎么辦
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表