日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spi flash驱动

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spi flash驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

移植需要更改sendrcv函數里面內容,宏定義內容

?

#define DRV_SPI_FLASH_WRITE_ENABLE (0x06) //Write Enable #define DRV_SPI_FLASH_WRITE_DISABLE (0x04) //Write Disable #define DRV_SPI_FLASH_READ_STATUS_REG (0x05) //Read Status Register #define DRV_SPI_FLASH_WRITE_STATUS_REG (0x01) //Write Status Register #define DRV_SPI_FLASH_READ_DATA (0x03) //Read Data #define DRV_SPI_FLASH_FAST_READ (0x0B) //Fast Read #define DRV_SPI_FLASH_FAST_READ_DUAL_OUTPUT (0x3B) //Fast Read Dual Output #define DRV_SPI_FLASH_PAGEPROGRAM (0x02) //Page Program #define DRV_SPI_FLASH_BLOCK_ERASE (0xD8) //Block Erase(64KB) #define DRV_SPI_FLASH_HALF_BLOCK_ERASE (0x52) //Half Block Erase(32KB) #define DRV_SPI_FLASH_SECTOR_ERASE (0x20) //Sector Erase(4KB) #define DRV_SPI_FLASH_CHIP_ERASE (0xC7) //Chip Erase #define DRV_SPI_FLASH_JEDEC_ID (0x9F) //JEDEC ID#define APP_SPI3_CS_LOW SCU_SetSpiCsn(SPI3_CSN,LOW) #define APP_SPI3_CS_HIGH SCU_SetSpiCsn(SPI3_CSN,HIGH)uint8_t DrvFlashSendRcvByte(uint8_t ucData) {uint8_t ucTemp;while(SPI_GetFlagStatus(SGCC_SPI3_P,SPI_FLAG_RFNE))ucTemp = SPI_ReceiveData(SGCC_SPI3_P);SPI_SendData(SGCC_SPI3_P, ucData);while(0 == SPI_GetFlagStatus(SGCC_SPI3_P,SPI_FLAG_RFNE));ucTemp = SPI_ReceiveData(SGCC_SPI3_P);return ucTemp; }uint32_t DrvFlashReadID(void) {uint32_t ulDevID = 0;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_JEDEC_ID);ulDevID |= DrvFlashSendRcvByte(0xFF) << 16;ulDevID |= DrvFlashSendRcvByte(0xFF) << 8;ulDevID |= DrvFlashSendRcvByte(0xFF);APP_SPI3_CS_HIGH;return ulDevID; } uint8_t DrvFlashReadStausReg(void) {uint8_t ucReg;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_READ_STATUS_REG);ucReg = DrvFlashSendRcvByte(0xFF);APP_SPI3_CS_HIGH;return ucReg; } void DrvFlashWaitBusy(void) {while((DrvFlashReadStausReg() & 0x01) == 0x01); }void DrvFlashWriteEnable(void) {APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_WRITE_ENABLE);APP_SPI3_CS_HIGH; }void DrvFlashWriteDisable(void) {APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_WRITE_DISABLE);APP_SPI3_CS_HIGH; }void DrvFlashReadData(uint8_t* pRcvBuf, uint32_t ulReAddr, uint16_t usReNum) {uint16_t i;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_READ_DATA);DrvFlashSendRcvByte((uint8_t)((ulReAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulReAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulReAddr);for(i=0; i < usReNum; i++){pRcvBuf[i] = DrvFlashSendRcvByte(0XFF);}APP_SPI3_CS_HIGH;}void DrvFlashPageWrite(uint8_t* pWrBuf, uint32_t ulWrAddr, uint16_t usWrNum) {uint16_t i;DrvFlashWriteEnable();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_PAGEPROGRAM);DrvFlashSendRcvByte((uint8_t)((ulWrAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulWrAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulWrAddr);for(i = 0; i < usWrNum; i++)DrvFlashSendRcvByte(pWrBuf[i]);APP_SPI3_CS_HIGH;DrvFlashWaitBusy(); }void DrvFlashWriteNoCheck(uint8_t* pBuffer, uint32_t addr, uint16_t num) {uint16_t pageremain;pageremain = 256 - addr % 256;//鍗曢〉鍓╀綑瀛楄妭鏁�if(num <= pageremain)//涓嶅ぇ浜�256pageremain = num;while(1){DrvFlashPageWrite(pBuffer, addr, pageremain);if(num == pageremain)break;//鍐欑粨鏉熶簡else{pBuffer += pageremain;addr += pageremain;num -= pageremain;//鍑忓幓宸茬粡鍐欏叆鐨勫瓧鑺傛暟if(num > 256)pageremain = 256;//鏈鍙互鍐欏叆涓�欏墊暟鎹�elsepageremain = num;//鏈�鍚庝竴嬈″啓}}; }void DrvFlashWriteData(uint8_t* pBuffer,uint32_t addr,uint16_t num) {uint32_t secpos;uint16_t secoff;uint16_t secremain;uint16_t i;uint8_t * W25QXX_BUF;uint8_t W25QXX_BUFFER[4096];W25QXX_BUF = W25QXX_BUFFER;secpos = addr / 4096;//鎵囧尯鍦板潃secoff = addr % 4096;//鍦ㄦ墖鍖哄唴鐨勫亸縐�secremain = 4096 - secoff;//鎵囧尯鍓╀綑絀洪棿澶у皬 // printfif(num <= secremain)//涓嶅ぇ浜庡綋鍓嶆墖鍖哄墿浣欏瓧鑺�{secremain = num;}while(1){DrvFlashReadData(W25QXX_BUF, secpos * 4096, 4096);//璇誨彇鏁翠釜鎵囧尯for(i = 0; i < secremain; i++)//鏍¢獙鏁版嵁{if(W25QXX_BUF[secoff + i] != 0XFF)//闇�瑕佹摝鍑�break;}if(i < secremain)//闇�瑕佹摝鍑�{DrvFlashSectorErase(secpos * 4096);//鎿﹂櫎鏁翠釜鎵囧尯for(i = 0; i < secremain; i++){W25QXX_BUF[i + secoff] = pBuffer[i];//澶嶅埗}DrvFlashWriteNoCheck(W25QXX_BUF, secpos * 4096, 4096);//鍐欏叆鏁翠釜鎵囧尯}elseDrvFlashWriteNoCheck(pBuffer, addr, secremain);//鍐欏凡緇忔摝闄や簡鐨勶紝鐩存帴鍐欏叆鎵囧尯鍓╀綑絀洪棿if(num == secremain)break;//鍐欑粨鏉熶簡else//{secpos++;//鎵囧尯鍦板潃澧炲姞1secoff = 0;//鍋忕Щ浣嶇疆涓�0pBuffer += secremain;//鎸囬拡鍋忕Щaddr += secremain;//鍐欏湴鍧�鍋忕Щnum -= secremain;//瀛楄妭鏁伴�掑噺if(num > 4096)secremain = 4096;//涓嬩竴涓墖鍖鴻繕鏄啓涓嶅畬elsesecremain = num;//涓嬩竴涓墖鍖哄彲浠ュ啓瀹屼簡}}; }void DrvFlashChipErase(void) {DrvFlashWriteEnable();DrvFlashWaitBusy();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_CHIP_ERASE);APP_SPI3_CS_HIGH;DrvFlashWaitBusy(); }void DrvFlashSectorErase(uint32_t ulErAddr) {DrvFlashWriteEnable();DrvFlashWaitBusy();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_SECTOR_ERASE);DrvFlashSendRcvByte((uint8_t)((ulErAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulErAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulErAddr);APP_SPI3_CS_HIGH;DrvFlashWaitBusy(); }

?

?

?

?

?

總結

以上是生活随笔為你收集整理的spi flash驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。