




已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
.C文件#include flash.h #include spi.h#include delay.h / /本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途/ALIENTEK戰(zhàn)艦STM32開發(fā)板/W25Q64 代碼 /正點(diǎn)原子ALIENTEK/技術(shù)論壇:/修改日期:2012/9/9/版本:V1.0/版權(quán)所有,盜版必究。/Copyright(C) 廣州市星翼電子科技有限公司 2009-2019/All rights reserved/flash寫入只能把1寫成0,所以寫入前應(yīng)該先擦除/u16 SPI_FLASH_TYPE = W25Q64;/默認(rèn)就是25Q64/W25Q64一共8M容量/分為128個(gè)快,每塊大小為64K字節(jié)/每塊又可以分為16個(gè)扇區(qū),每個(gè)扇區(qū)4K字節(jié)/每次擦除最少一個(gè)扇區(qū),也就是4K字節(jié)/25Q64 一共有2048個(gè)扇區(qū)/初始化SPI FLASH的IO口void SPI_Flash_Init(void) GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE );/PORTB時(shí)鐘使能 /W25Q64的片選GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; / PB12 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_12);/SD卡片選信號(hào)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; / PD2 推挽 GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOD,GPIO_Pin_2);/2.4G無線片選信號(hào)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; / PG7 推挽 GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(GPIOG,GPIO_Pin_7);SPI2_Init(); /初始化SPISPI2_SetSpeed(SPI_BaudRatePrescaler_2);/設(shè)置為18M時(shí)鐘,高速模式SPI_FLASH_TYPE = SPI_Flash_ReadID();/讀取FLASH ID. /讀取SPI_FLASH的狀態(tài)寄存器/BIT7 6 5 4 3 2 1 0/SPR RV TB BP2 BP1 BP0 WEL BUSY/SPR:默認(rèn)0,狀態(tài)寄存器保護(hù)位,配合WP使用/TB,BP2,BP1,BP0:FLASH區(qū)域?qū)懕Wo(hù)設(shè)置/WEL:寫使能鎖定/BUSY:忙標(biāo)記位(1,忙;0,空閑)/默認(rèn):0x00u8 SPI_Flash_ReadSR(void) u8 byte=0; SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ReadStatusReg); /發(fā)送讀取狀態(tài)寄存器命令 byte=SPI2_ReadWriteByte(0Xff); /讀取一個(gè)字節(jié) SPI_FLASH_CS=1; /取消片選 return byte; /寫SPI_FLASH狀態(tài)寄存器/只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以寫!void SPI_FLASH_Write_SR(u8 sr) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteStatusReg); /發(fā)送寫取狀態(tài)寄存器命令 SPI2_ReadWriteByte(sr); /寫入一個(gè)字節(jié) SPI_FLASH_CS=1; /取消片選 /SPI_FLASH寫使能/將WEL置位 void SPI_FLASH_Write_Enable(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteEnable); /發(fā)送寫使能 SPI_FLASH_CS=1; /取消片選 /SPI_FLASH寫禁止/將WEL清零 void SPI_FLASH_Write_Disable(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_WriteDisable); /發(fā)送寫禁止指令 SPI_FLASH_CS=1; /取消片選 /讀取芯片ID W25X16的ID:0XEF14u16 SPI_Flash_ReadID(void)u16 Temp = 0; SPI_FLASH_CS=0; SPI2_ReadWriteByte(0x90);/發(fā)送讀取ID命令 SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); Temp|=SPI2_ReadWriteByte(0xFF)16); /發(fā)送24bit地址 SPI2_ReadWriteByte(u8)(ReadAddr)8); SPI2_ReadWriteByte(u8)ReadAddr); for(i=0;i16); /發(fā)送24bit地址 SPI2_ReadWriteByte(u8)(WriteAddr)8); SPI2_ReadWriteByte(u8)WriteAddr); for(i=0;iNumByteToWrite;i+)SPI2_ReadWriteByte(pBufferi);/循環(huán)寫數(shù) SPI_FLASH_CS=1; /取消片選 SPI_Flash_Wait_Busy(); /等待寫入結(jié)束/無檢驗(yàn)寫SPI FLASH /必須確保所寫的地址范圍內(nèi)的數(shù)據(jù)全部為0XFF,否則在非0XFF處寫入的數(shù)據(jù)將失敗!/具有自動(dòng)換頁功能 /在指定地址開始寫入指定長度的數(shù)據(jù),但是要確保地址不越界!/pBuffer:數(shù)據(jù)存儲(chǔ)區(qū)/WriteAddr:開始寫入的地址(24bit)/NumByteToWrite:要寫入的字節(jié)數(shù)(最大65535)/每頁256個(gè)字節(jié)void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) u16 YeSengYu; YeSengYu = 256-WriteAddr%256; /單頁剩余的字節(jié)數(shù)if(NumByteToWrite YeSengYupBuffer += YeSengYu;WriteAddr += YeSengYu;NumByteToWrite -= YeSengYu; /減去已經(jīng)寫入了的字節(jié)數(shù)if(NumByteToWrite 256)YeSengYu = 256; /一次可以寫入256個(gè)字節(jié)elseYeSengYu = NumByteToWrite; /不夠256個(gè)字節(jié)了 /寫SPI FLASH /在指定地址開始寫入指定長度的數(shù)據(jù)/該函數(shù)帶擦除操作!/pBuffer:數(shù)據(jù)存儲(chǔ)區(qū)/WriteAddr:開始寫入的地址(24bit)/NumByteToWrite:要寫入的字節(jié)數(shù)(最大65535) u8 SPI_FLASH_BUF4096;void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) u32 secpos;u16 secoff;u16 secremain; u16 i; secpos = WriteAddr / 4096;/扇區(qū)地址 02047 for w25x64secoff = WriteAddr % 4096;/在扇區(qū)內(nèi)的偏移secremain = 4096 - secoff;/扇區(qū)剩余空間大小 if(NumByteToWrite = secremain)secremain = NumByteToWrite;/不大于4096個(gè)字節(jié)while(1) SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);/讀出整個(gè)扇區(qū)的內(nèi)容for(i=0;isecremain;i+)/校驗(yàn)數(shù)據(jù)if(SPI_FLASH_BUFsecoff+i != 0XFF)break;/需要擦除 if(isecremain)/需要擦除SPI_Flash_Erase_Sector(secpos);/擦除這個(gè)扇區(qū)for(i=0;i4096)secremain = 4096;/下一個(gè)扇區(qū)還是寫不完else secremain = NumByteToWrite;/下一個(gè)扇區(qū)可以寫完了 /擦除整個(gè)芯片/整片擦除時(shí)間:/W25X16:25s /W25X32:40s /W25X64:40s /等待時(shí)間超長.void SPI_Flash_Erase_Chip(void) SPI_FLASH_Write_Enable(); /SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ChipErase); /發(fā)送片擦除命令 SPI_FLASH_CS=1; /取消片選 SPI_Flash_Wait_Busy(); /等待芯片擦除結(jié)束 /擦除一個(gè)扇區(qū)/Dst_Addr:扇區(qū)地址 0511 for w25x16/Dst_Addr:扇區(qū)地址 02047 for w25x64/擦除一個(gè)山區(qū)的最少時(shí)間:150msvoid SPI_Flash_Erase_Sector(u32 Dst_Addr) Dst_Addr*=4096; SPI_FLASH_Write_Enable(); /SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_SectorErase); /發(fā)送扇區(qū)擦除指令 SPI2_ReadWriteByte(u8)(Dst_Addr)16); /發(fā)送24bit地址 SPI2_ReadWriteByte(u8)(Dst_Addr)8); SPI2_ReadWriteByte(u8)Dst_Addr); SPI_FLASH_CS=1; /取消片選 SPI_Flash_Wait_Busy(); /等待擦除完成 /等待空閑void SPI_Flash_Wait_Busy(void) while (SPI_Flash_ReadSR()&0x01)=0x01); / 等待BUSY位清空/進(jìn)入掉電模式void SPI_Flash_PowerDown(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_PowerDown); /發(fā)送掉電命令 SPI_FLASH_CS=1; /取消片選 delay_us(3); /等待TPD /喚醒void SPI_Flash_WAKEUP(void) SPI_FLASH_CS=0; /使能器件 SPI2_ReadWriteByte(W25X_ReleasePowerDown); / send W25X_PowerDown command 0xAB SPI_FLASH_CS=1; /取消片選 delay_us(3); /等待TRES1 .H文件#ifndef _FLASH_H#define _FLASH_H #include sys.h / /本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途/ALIENTEK戰(zhàn)艦STM32開發(fā)板/W25Q64 代碼 /正點(diǎn)原子ALIENTEK/技術(shù)論壇:/修改日期:2012/9/9/版本:V1.0/版權(quán)所有,盜版必究。/Copyright(C) 廣州市星翼電子科技有限公司 2009-2019/All rights reserved / /W25X系列/Q系列芯片列表 /W25Q80 ID 0XEF13/W25Q16 ID 0XEF14/W25Q32 ID 0XEF15/W25Q32 ID 0XEF16#define W25Q80 0XEF13 #define W25Q16 0XEF14#define W25Q32 0XEF15#define W25Q64 0XEF16extern u16 SPI_FLASH_TYPE;/定義我們使用的flash芯片型號(hào)#defineSPI_FLASH_CS PBout(12) /選中FLASH / /指令表#define W25X_WriteEnable0x06 /寫使能#define W25X_WriteDisable0x04 /寫失能#define W25X_ReadStatusReg 0x05 /讀狀態(tài)寄存器#define W25X_WriteStatusReg0x01 /寫狀態(tài)寄存器#define W25X_ReadData0x03 /讀數(shù)據(jù)#define W25X_FastReadData0x0B /#define W25X_FastReadDual0x3B #define W25X_PageProgram0x02 #define W25X_BlockErase0xD8 #define W25X_SectorErase0x20 #define W25X_ChipErase0xC7 #define W25X_PowerDown0xB9 /掉電#define W25X_ReleasePowerDown0xAB /喚醒#define W25X_DeviceID0xAB #define W25X_ManufactDeviceID0x90 #define W25X_JedecD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高端私募股權(quán)投資盡職調(diào)查合同
- 高效新能源汽車電池短路測(cè)試儀租賃與數(shù)據(jù)管理服務(wù)協(xié)議
- 呼吸護(hù)理案例分享
- 農(nóng)業(yè)循環(huán)經(jīng)濟(jì)有機(jī)種植大棚租賃與環(huán)保服務(wù)協(xié)議
- 海外留學(xué)生公寓微波爐租賃及使用培訓(xùn)服務(wù)協(xié)議
- 快速國際仲裁案件法律翻譯執(zhí)行協(xié)議
- 國家級(jí)文物修復(fù)中心文物保護(hù)專員全職聘用服務(wù)合同
- 食品包裝模具設(shè)計(jì)版權(quán)分成及合作協(xié)議
- 重癥醫(yī)學(xué)100節(jié)公開課體系構(gòu)建
- 招生營銷培訓(xùn)工作總結(jié)
- 學(xué)科建設(shè)講座課件
- 研究生課程教學(xué)大綱-紡織物理
- ICD-9手術(shù)編碼字典庫
- 弘揚(yáng)與傳承中華傳統(tǒng)文化課件(共16張PPT)
- DB35_T 88-2022伐區(qū)調(diào)查設(shè)計(jì)技術(shù)規(guī)程
- 《航空專業(yè)英語》課件維修專業(yè)基礎(chǔ)英語R1
- 張溝煤礦打鉆著火事故概述
- 孔子練精神聰明不忘開心方_醫(yī)心方卷二十六引_金匱錄_方劑加減變化匯總
- 歐賓電梯貨梯電氣原理圖
- 政務(wù)服務(wù)顧客意見簿(豎)[2]
- NJB-2綜合監(jiān)測(cè)儀說明書
評(píng)論
0/150
提交評(píng)論