- #include "w25qxx.h"
- #include "spi.h"
- #include "delay.h"
- #include "usart.h"
- u16 W25QXX_TYPE=W25Q16; //默認是W25Q16
- //初始化SPI FLASH的IO口 SPI CS PA2
- void W25QXX_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTB時鐘使能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // PA2 推挽
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_SetBits(GPIOA,GPIO_Pin_2);
-
- W25QXX_CS=1; //SPI FLASH不選中
- SPI2_Init(); //初始化SPI
- SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//設置為18M時鐘,高速模式
- W25QXX_TYPE=W25QXX_ReadID();//讀取FLASH ID.
- }
- //讀取W25QXX的狀態寄存器
- //BIT7 6 5 4 3 2 1 0
- //SPR RV TB BP2 BP1 BP0 WEL BUSY
- //SPR:默認0,狀態寄存器保護位,配合WP使用
- //TB,BP2,BP1,BP0:FLASH區域寫保護設置
- //WEL:寫使能鎖定
- //BUSY:忙標記位(1,忙;0,空閑)
- //默認:0x00
- u8 W25QXX_ReadSR(void)
- {
- u8 byte=0;
- W25QXX_CS=0; //使能器件
- SPI2_ReadWriteByte(W25X_ReadStatusReg); //發送讀取狀態寄存器命令
- byte=SPI2_ReadWriteByte(0Xff); //讀取一個字節
- W25QXX_CS=1; //取消片選
- return byte;
- }
- //寫W25QXX狀態寄存器
- //只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以寫!!!
- void W25QXX_Write_SR(u8 sr)
- {
- W25QXX_CS=0; //使能器件
- SPI2_ReadWriteByte(W25X_WriteStatusReg);//發送寫取狀態寄存器命令
- SPI2_ReadWriteByte(sr); //寫入一個字節
- W25QXX_CS=1; //取消片選
- }
- //W25QXX寫使能
- //將WEL置位
- void W25QXX_Write_Enable(void)
- {
- W25QXX_CS=0; //使能器件
- SPI2_ReadWriteByte(W25X_WriteEnable); //發送寫使能
- W25QXX_CS=1; //取消片選
- }
- //W25QXX寫禁止
- //將WEL清零
- void W25QXX_Write_Disable(void)
- {
- W25QXX_CS=0; //使能器件
- SPI2_ReadWriteByte(W25X_WriteDisable); //發送寫禁止指令
- W25QXX_CS=1; //取消片選
- }
復制代碼- #include "w25qxx.h"
- #include "spi.h"
- #include "usart.h"
- #include "key.h"
- #include "delay.h"
- #include "led.h"
- #define SIZE sizeof(key0)
- int main(void)
- {
- u32 FLASH_SIZE=16*1024*1024;//2M字節
- const u8 key0[]={"按下KEY0"};
- const u8 key1[]={"按下KEY1"};
- u8 data[SIZE];
- u8 key;
-
- KEY_Init();
- delay_init();
- LED_Init();
- W25QXX_Init();
- uart_init(115200);
-
- while(W25QXX_ReadID()!=W25Q16) //檢測不到W25Q16
- {
- printf("未檢測到W25Q16\n");
- delay_ms(1000);
- }
- if(W25QXX_ReadID()==W25Q16)
- {
- printf("檢測到W25Q16\n");
- }
- W25QXX_Erase_Chip();
- while(1)
- {
- key=KEY_Scan(0);
- if(key==KEY0_PRES)
- {
- W25QXX_Write((u8*)key0,FLASH_SIZE-100,SIZE); //從倒數第100個地址處開始,寫入SIZE長度的數據
- printf("%s\n","存儲內容為:按下KEY0");
- PAout(8)=!PAout(8);
- }
- else if(key==KEY1_PRES)
- {
- W25QXX_Write((u8*)key1,FLASH_SIZE-100,SIZE); //從倒數第100個地址處開始,寫入SIZE長度的數據
- printf("%s\n","存儲內容為:按下KEY1");
- PDout(2)=!PDout(2);
- }
- else if(key==WKUP_PRES)
- {
- W25QXX_Read(data,FLASH_SIZE-100,SIZE); //從倒數第100個地址處開始,讀出SIZE個字節
- printf("讀取成功,內容為:%s\n",data);
- PAout(8)=!PAout(8);
- PDout(2)=!PDout(2);
- }
- else
- {
- delay_ms(10);
- }
- }
-
- }
復制代碼 全部資料51hei下載地址:
SPI_Flash.7z
(185.11 KB, 下載次數: 87)
2019-7-20 03:32 上傳
點擊文件名下載附件
完整工程代碼 下載積分: 黑幣 -5
(新版)MINI-STM32--原理圖M.pdf
(351.44 KB, 下載次數: 39)
2019-7-19 18:19 上傳
點擊文件名下載附件
STM32RCt6原理圖 下載積分: 黑幣 -5
|