spi_flash(stm32spi_flash的編程)_第1頁
spi_flash(stm32spi_flash的編程)_第2頁
spi_flash(stm32spi_flash的編程)_第3頁
spi_flash(stm32spi_flash的編程)_第4頁
spi_flash(stm32spi_flash的編程)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、本帖最后由orange-208 于 2012-5-28 10:05 編輯void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)SPI_FLASH_Write_SR(0x02);/ 使能狀態(tài)寄存器中的寫存儲器SST25V_DBSY();SPI_FLASH_Write_SR(0x02);/ 使能狀態(tài)寄存器中的寫存儲器SST25V_DBSY();實驗?zāi)康模簩?shù)據(jù)寫入外部FLASH 中,然后再讀出來顯示在LCD 上實驗平臺:基于STM32F103C8T6 的彩屏開發(fā)板FLASH : SST25VF016B flash_SST

2、.c#include "flash_SST.h"#include "spi.h"#include "delay.h"/4Kbytes 為一個 Sector/16 個扇區(qū)為1 個 Block/SST25VF016B容量為2M字節(jié),共有32個Block(塊),512個Sector (扇區(qū))/初始化SPI FLASH 的 IO 口/修改狀態(tài)寄存器,允許芯片存儲器被寫void SPI_Flash_Init(void)RCC->APB2ENR|=1<<2; /PORTA 時鐘使能GPIOA->CRH&=0XFFF

3、FFF0F;GPIOA->CRH|=0X00000030;/PA9 推挽GPIOA->ODR|=1<<9;/PA9 上拉SPIx_Init();/初始化SPISPI_FLASH_Write_SR(0x02); / 使能狀態(tài)寄存器中的寫存儲器SST25V_DBSY();/讀取SPI_FLASH 的狀態(tài)寄存器/BIT7 65 4 3 2 1 0/SPR RV TB BP2 BP1 BP0 WEL BUSY/SPR:默認0,狀態(tài)寄存器保護位,配合WP使用/TB,BP2,BP1,BP0:FLASH 區(qū)域?qū)懕Wo設(shè)置/WEL: 寫使能鎖定/BUSY: 忙標記位(1,忙 ;0,空閑)

4、/默認:0x00u8 SPI_Flash_ReadSR(void) u8 byte=0;SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_ReadStatusReg); /發(fā)送讀取狀態(tài)寄存器命令 byte=SPIx_ReadWriteByte(0Xff);/讀取一個字節(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;/片選SPI

5、x_ReadWriteByte(SST25_EnableWriteStatusReg); / 使能寫狀態(tài)寄存器命令SPI_FLASH_CS=1;/取消片選SPI_FLASH_CS=0;/片選SPIx_ReadWriteByte(SST25_WriteStatusReg); /發(fā)送寫取狀態(tài)寄存器命令SPIx_ReadWriteByte(sr);/寫入一個字節(jié)SPI_FLASH_CS=1;/取消片選/SPI_FLASH 寫使能/將 WEL 置位void SPI_FLASH_Write_Enable(void)SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_

6、WriteEnable); /發(fā)送寫使能SPI_FLASH_CS=1;/取消片選 /SPI_FLASH 寫禁止/將 WEL 清零void SPI_FLASH_Write_Disable(void)SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_WriteDisable); /發(fā)送寫禁止指令SPI_FLASH_CS=1;/取消片選/讀取芯片ID SST25VF016 的是 0XBF41u16 SPI_Flash_ReadID(void)14u16 Temp = 0;SPI_FLASH_CS=0;/發(fā)送讀取ID 命令SPIx_ReadWriteByte(0

7、x90);/發(fā)送24 位的地址SPIx_ReadWriteByte(0x00);SPIx_ReadWriteByte(0x00);SPIx_ReadWriteByte(0x00);/讀取返回的16 位值Temp=SPIx_ReadWriteByte(0xFF)<<8; / 高 8 位數(shù)據(jù)Temp+=SPIx_ReadWriteByte(0xFF);/底八位數(shù)據(jù)SPI_FLASH_CS=1;return Temp;/讀取SPI FLASH/在指定地址開始讀取指定長度的數(shù)據(jù)/pBuffer: 數(shù)據(jù)存儲區(qū)/ReadAddr: 開始讀取的地址(24bit)/NumByteToRead: 要

8、讀取的字節(jié)數(shù)(最大65535 即 64k)void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)u16 i;SPI_FLASH_CS=0;/使能器件SPIx_ReadWriteByte(SST25_ReadData);/發(fā)送讀取命令/發(fā)送24bit 地址SPIx_ReadWriteByte(u8)(ReadAddr)>>16);SPIx_ReadWriteByte(u8)(ReadAddr)>>8);SPIx_ReadWriteByte(u8)ReadAddr);for(i=0;i<NumBy

9、teToRead;i+)pBuffer=SPIx_ReadWriteByte(0XFF);/循環(huán)讀數(shù)SPI_FLASH_CS=1;/取消片選/地址自動增加的寫數(shù)據(jù)Avoid AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr) SPI_FLASH_Write_Enable();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_AAI_WordProgram);/輸入所要寫數(shù)據(jù)的起始地址SPIx_ReadWriteByte(Addr & 0xFF0000) >> 16);S

10、PIx_ReadWriteByte(Addr & 0xFF00) >> 8);SPIx_ReadWriteByte(Addr & 0xFF);/發(fā)送最初的兩個數(shù)據(jù)SPIx_ReadWriteByte(Byte1);SPIx_ReadWriteByte(Byte2);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/地址自動增加的寫數(shù)據(jù)Bvoid AutoAddressIncrement_WordProgramB(u8 state,u8 Byte1, u8 Byte2)SPI_FLASH_Write_Enable();SPI_FLASH_CS

11、=0;SPIx_ReadWriteByte(SST25_AAI_WordProgram);SPIx_ReadWriteByte(Byte1);SPIx_ReadWriteByte(Byte2);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();if(state=1)SPI_FLASH_Write_Disable();SPI_Flash_Wait_Busy();/結(jié)合AB 構(gòu)成的地址自動增加的連續(xù)數(shù)據(jù)的寫入/具有先擦除待寫區(qū)域的功能/pBuffer :為待寫數(shù)據(jù)組/WriteAddr :所寫數(shù)據(jù)的起始地址/NumByteToWrite :所要寫的數(shù)據(jù)的長度void SPI

12、_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)u16 i,temp;u32 secpos;u16 secoff;u16 secremain;/以下代碼為擦除待寫區(qū)域的代碼SST25VF016secpos=WriteAddr/4096;/扇區(qū)(4K)地址 0511 forsecoff=WriteAddr96;secremain=4096-secoff;if(NumByteToWrite<secremain)temp=1;elsei=NumByteToWrite-secremain;if(i%96=0)temp=i/409

13、6+1;elsetemp=i/4096+2;for(i=0;i<temp;i+)SPI_Flash_Erase_Sector(secpos+i)*4096);/以下代碼為將數(shù)據(jù)寫入指定地址的代碼if(NumByteToWrite%2=0)temp=NumByteToWrite/2-1;else/在扇區(qū)內(nèi)的偏移/扇區(qū)剩余空間大小/剩余空間大于所存數(shù)據(jù)/剩余空間小于所存數(shù)據(jù)/判斷還占了幾個扇區(qū)/擦除將要寫入數(shù)據(jù)的扇區(qū)temp=NumByteToWrite/2;/開AutoAddressIncrement_WordProgramA(pBuffer0, pBuffer1,WriteAddr );

14、 始寫數(shù)據(jù)for(i=1;i<temp;i+)AutoAddressIncrement_WordProgramB(0,pBuffer2*i, pBuffer2*i+1);if(NumByteToWrite%2=0)/結(jié)束AutoAddressIncrement_WordProgramB(1,pBufferNumByteToWrite-2, pBufferNumByteToWrite-1);寫數(shù)據(jù)else/結(jié)AutoAddressIncrement_WordProgramB(1,pBufferNumByteToWrite-1,0);束寫數(shù)據(jù)/寫入1Byte 數(shù)據(jù)/pBuffer: 待寫的數(shù)

15、據(jù)/WriteAddr :待寫數(shù)據(jù)的地址void Flash_WriteByte(u8* pBuffer,u32 WriteAddr) u32 secpos;secpos=WriteAddr/4096;SPI_Flash_Erase_Sector(secpos);SPI_FLASH_Write_Enable();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_ByteProgram );/發(fā)送24bit 地址SPIx_ReadWriteByte(u8)(WriteAddr)>>16);SPIx_ReadWriteByte(u8)(WriteAddr)

16、>>8);SPIx_ReadWriteByte(u8)WriteAddr);SPIx_ReadWriteByte(pBuffer0);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/擦除整個芯片/整片擦除時間:/W25X16:25s/W25X32:40s/W25X64:40s/等待時間超長.void SPI_Flash_Erase_Chip(void)SPI_FLASH_Write_Enable();SPI_Flash_Wait_Busy();SPI_FLASH_CS=0;SPIx_ReadWriteByte(SST25_ChipErase);SPI_F

17、LASH_CS=1;SPI_Flash_Wait_Busy();/擦除一個扇區(qū)/Dst_Addr: 扇區(qū)地址0511 for w25x16/擦除一個山區(qū)的最少時間:150msvoid SPI_Flash_Erase_Sector(u32 Dst_Addr)SPI_FLASH_Write_Enable();SPI_Flash_Wait_Busy();/扇區(qū)地址0511 for w25x16 4096=4k/擦除這個扇區(qū)/SET WEL/使能器件/發(fā)送寫頁命令/發(fā)送待寫的數(shù)據(jù)/等待寫完成/SET WEL/使能器件/發(fā)送片擦除命令/取消片選/等待芯片擦除結(jié)束/SET WELSPI_FLASH_CS=

18、0;SPIx_ReadWriteByte(SST25_4KByte_BlockERASE);/使能器件/發(fā)送扇區(qū)擦除指令SPIx_ReadWriteByte(u8)(Dst_Addr)>>16);SPIx_ReadWriteByte(u8)(Dst_Addr)>>8);SPIx_ReadWriteByte(u8)Dst_Addr);SPI_FLASH_CS=1;SPI_Flash_Wait_Busy();/發(fā)送 24bit 地址/取消片選/等待擦除完成/等待空閑void SPI_Flash_Wait_Busy(void)while (SPI_Flash_ReadSR()

19、&0x01)=0x01);/ 等待 BUSY 位清空void SST25V_EBSY(void)SPI_FLASH_CS=0;SPIx_ReadWriteByte( SST25_EBSY);SPI_FLASH_CS=1;void SST25V_DBSY(void)SPI_FLASH_CS=0;SPIx_ReadWriteByte( SST25_DBSY);SPI_FLASH_CS=1;Flash.h#ifndef _FLASH_SST_H#define _FLASH_SST_H#include "sys.h"#defineSPI_FLASH_CS PAout(9)/

20、選中FLASH#define FLASHID 0XBF41/SST25VF016 讀寫/指令表#define SST25_ReadData0x03#define SST25_FastReadData0x0B#define SST25_4KByte_BlockERASE0x20#define SST25_32KByte_BlockErase0x52#define SST25_64KByte_BlockErase0xD8#define SST25_ChipErase0xC7#define SST25_ByteProgram0x02#define SST25_AAI_WordProgram0xAD#

21、define SST25_ReadStatusReg0x05#define SST25_EnableWriteStatusReg0x50#define SST25_WriteStatusReg0x01#define SST25_WriteEnable0x06#define SST25_WriteDisable0x04#define SST25_ManufactDeviceID0x90#define SST25_JedecDeviceID0x9F#define SST25_EBSY0x70#define SST25_DBSY0x80 void SPI_Flash_Init(void);u16 S

22、PI_Flash_ReadID(void);/讀取FLASH IDu8 SPI_Flash_ReadSR(void);/讀取狀態(tài)寄存器void SPI_FLASH_Write_SR(u8 sr);/寫狀態(tài)寄存器void SPI_FLASH_Write_Enable(void);/寫使能void SPI_FLASH_Write_Disable(void);/寫保護void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead); /讀取 flashvoid SPI_Flash_Erase_Chip(void);/整片擦除void SP

23、I_Flash_Erase_Sector(u32 Dst_Addr);/扇區(qū)擦除void SPI_Flash_Wait_Busy(void);/等待空閑void SST25V_EBSY(void);void SST25V_DBSY(void);void Flash_WriteByte(u8* pBuffer,u32 WriteAddr);/寫入 1Byte 數(shù)據(jù)void AutoAddressIncrement_WordProgramA(u8 Byte1, u8 Byte2, u32 Addr); / 地址自動增加的寫數(shù)據(jù)Avoid AutoAddressIncrement_WordProgr

24、amB(u8 state,u8 Byte1, u8 Byte2);/地址自動增加的寫數(shù)據(jù)Bvoid SPI_Flash_Write(u8 pBuffer,u32 WriteAddr,u16 NumByteToWrite);/結(jié)合AB 構(gòu)成的地址自動增加的連續(xù)數(shù)據(jù)的寫入#endif main.c主函數(shù):#include<stm32f10x_lib.h>#include"common.h"#include"TFTLCD.h"#include"spi.h"#include"key.h"#include&quo

25、t;flash.h"const u8 TEXT_Buffer="Chen An SST25VF"#define SIZE sizeof(TEXT_Buffer)int main(void)/待寫入flash 的數(shù)據(jù)/計算待寫入數(shù)據(jù)的長度u8 key;u8 datatempSIZE;Stm32_Clock_Init(9);delay_init(72);LCD_Init();KEY_Init();SPI_Flash_Init();POINT_COLOR=RED;while(SPI_Flash_ReadID()!=FLASH_ID)/開辟空間用于存放從flash 讀回的數(shù)據(jù)/系統(tǒng)時鐘初始化/延時函數(shù)的初始化/LCD 初始化/按鍵初始化/SPI 關(guān)于 flash 的硬件接口初始化/設(shè)置字體顏色/檢驗 flash 是否存在LCD_ShowString(60,130,"SST25VF Check Failed!"); delay_ms(500);LCD_ShowString(60,130,"SST25VF Ready!");LCD_ShowString

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論