|
這個是正點原子的例程,給你參考一下:- //寫SPI FLASH
- //在指定地址開始寫入指定長度的數(shù)據(jù)
- //該函數(shù)帶擦除操作!
- //pBuffer:數(shù)據(jù)存儲區(qū)
- //WriteAddr:開始寫入的地址(24bit)
- //NumByteToWrite:要寫入的字節(jié)數(shù)(最大65535)
- u8 W25QXX_BUFFER[4096];
- void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
- {
- u32 secpos;
- u16 secoff;
- u16 secremain;
- u16 i;
- u8 * W25QXX_BUF;
- W25QXX_BUF=W25QXX_BUFFER;
- secpos=WriteAddr/4096;//扇區(qū)地址
- secoff=WriteAddr%4096;//在扇區(qū)內(nèi)的偏移
- secremain=4096-secoff;//扇區(qū)剩余空間大小
- //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//測試用
- if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096個字節(jié)
- while(1)
- {
- W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//讀出整個扇區(qū)的內(nèi)容
- for(i=0;i<secremain;i++)//校驗數(shù)據(jù)
- {
- if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除
- }
- if(i<secremain)//需要擦除
- {
- W25QXX_Erase_Sector(secpos); //擦除這個扇區(qū)
- for(i=0;i<secremain;i++) //復(fù)制
- {
- W25QXX_BUF[i+secoff]=pBuffer[i];
- }
- W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//寫入整個扇區(qū)
- }else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//寫已經(jīng)擦除了的,直接寫入扇區(qū)剩余區(qū)間.
- if(NumByteToWrite==secremain)break;//寫入結(jié)束了
- else//寫入未結(jié)束
- {
- secpos++;//扇區(qū)地址增1
- secoff=0;//偏移位置為0
- pBuffer+=secremain; //指針偏移
- WriteAddr+=secremain; //寫地址偏移
- NumByteToWrite-=secremain; //字節(jié)數(shù)遞減
- if(NumByteToWrite>4096)secremain=4096;//下一個扇區(qū)還是寫不完
- else secremain=NumByteToWrite; //下一個扇區(qū)可以寫完了
- }
- };
- }
復(fù)制代碼
|
|