chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析spi flash驅(qū)動(dòng)及其程序

ss ? 作者:工程師譚軍 ? 2018-10-07 11:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

SPI Flash
首先它是個(gè)Flash,F(xiàn)lash是什么東西就不多說(shuō)了(非易失性存儲(chǔ)介質(zhì)),分為NOR和NAND兩種(NOR和NAND的區(qū)別本篇不做介紹)。SPI一種通信接口。那么嚴(yán)格的來(lái)說(shuō)SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。但現(xiàn)在大部分情況默認(rèn)下人們說(shuō)的SPI Flash指的是SPI NorFlash。早期Norflash的接口是parallel的形式,即把數(shù)據(jù)線和地址線并排與IC的管腳連接。但是后來(lái)發(fā)現(xiàn)不同容量的Norflash不能硬件上兼容(數(shù)據(jù)線和地址線的數(shù)量不一樣),并且封裝比較大,占用了較大的PCB板位置,所以后來(lái)逐漸被SPI(串行接口)Norflash所取代。同時(shí)不同容量的SPI Norflash管腳也兼容封裝也更小。,至于現(xiàn)在很多人說(shuō)起NOR flash直接都以SPI flash來(lái)代稱。
NorFlash根據(jù)數(shù)據(jù)傳輸?shù)奈粩?shù)可以分為并行(Parallel,即地址線和數(shù)據(jù)線直接和處理器相連)NorFlash和串行(SPI,即通過(guò)SPI接口和處理器相連)NorFlash;區(qū)別主要就是:1、SPI NorFlash每次傳輸一bit位的數(shù)據(jù),parallel連接的NorFlash每次傳輸多個(gè)bit位的數(shù)據(jù)(有x8和x16bit兩種); 2、SPI NorFlash比parallel便宜,接口簡(jiǎn)單點(diǎn),但速度慢。
NandFlash是地址數(shù)據(jù)線復(fù)用的方式,接口標(biāo)準(zhǔn)統(tǒng)一(x8bit和x16bit),所以不同容量再兼容性上基本沒(méi)什么問(wèn)題。但是目前對(duì)產(chǎn)品的需求越來(lái)越小型化以及成本要求也越來(lái)越高,所以SPI NandFlash漸漸成為主流,并且采用SPI NANDFlash方案,主控也可以不需要傳統(tǒng)NAND控制器,只需要有SPI接口接口操作訪問(wèn),從而降低成本。另外SPI NandFlash封裝比傳統(tǒng)的封裝也小很多,故節(jié)省了PCB板的空間。
怎么用說(shuō)白了對(duì)于Flash就是讀寫擦,也就是實(shí)現(xiàn)flash的驅(qū)動(dòng)。先簡(jiǎn)單了解下spi flash的物理連接。
之前介紹SPI的時(shí)候說(shuō)過(guò),SPI接口目前的使用是多種方式(具體指的是物理連線有幾種方式),Dual SPI、Qual SPI和標(biāo)準(zhǔn)的SPI接口(這種方式肯定不會(huì)出現(xiàn)在連接外設(shè)是SPI Flash上,這玩意沒(méi)必要全雙工),對(duì)于SPI Flash來(lái)說(shuō),主要就是Dual和Qual這兩種方式。具體項(xiàng)目具體看了,理論上在CLK一定的情況下, 線數(shù)越多訪問(wèn)速度也越快。我們項(xiàng)目采用的Dual SPI方式,即兩線。
淺析spi flash驅(qū)動(dòng)及其程序

移植需要更改sendrcv函數(shù)里面內(nèi)容,宏定義內(nèi)容

[cpp] view plain copy《code class=“l(fā)anguage-cpp”》#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)//涓嶅ぇ浜?256

pageremain = num;

while(1)

{

DrvFlashPageWrite(pBuffer, addr, pageremain);

if(num == pageremain)

break;//鍐欑粨鏉熶簡(jiǎn)

else

{

pBuffer += pageremain;

addr += pageremain;

num -= pageremain;//鍑忓幓宸茬粡鍐欏叆鐨勫瓧鑺傛暟

if(num 》 256)

pageremain = 256;//鏈鍙互鍐欏叆涓?欏墊暟鎹?

else

pageremain = 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;//鎵囧尯鍓╀綑絀洪棿澶у皬

// printf

if(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);//鍐欏叆鏁翠釜鎵囧尯

}

else

DrvFlashWriteNoCheck(pBuffer, addr, secremain);//鍐欏凡緇忔摝闄や簡(jiǎn)鐨勶紝鐩存帴鍐欏叆鎵囧尯鍓╀綑絀洪棿

if(num == secremain)

break;//鍐欑粨鏉熶簡(jiǎn)

else//

{

secpos++;//鎵囧尯鍦板潃澧炲姞1

secoff = 0;//鍋忕Щ浣嶇疆涓?0

pBuffer += secremain;//鎸囬拡鍋忕Щ

addr += secremain;//鍐欏湴鍧?鍋忕Щ

num -= secremain;//瀛楄妭鏁伴?掑噺

if(num 》 4096)

secremain = 4096;//涓嬩竴涓墖鍖鴻繕鏄啓涓嶅畬

else

secremain = num;//涓嬩竴涓墖鍖哄彲浠ュ啓瀹屼簡(jiǎn)

}

};

}

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();

}

《/code》


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1925

    瀏覽量

    87880
  • SPI Flash
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    10763
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳細(xì)講解重用外設(shè)驅(qū)動(dòng)代碼_SPI_NOR_Flash存儲(chǔ)器

    第六章為重用外設(shè)驅(qū)動(dòng)代碼,本文內(nèi)容為6.2 SPI NOR Flash 存儲(chǔ)器。
    的頭像 發(fā)表于 12-21 07:59 ?1.6w次閱讀
    詳細(xì)講解重用外設(shè)<b class='flag-5'>驅(qū)動(dòng)</b>代碼_<b class='flag-5'>SPI_NOR_Flash</b>存儲(chǔ)器

    開(kāi)源的串行SPI Flash通用驅(qū)動(dòng)庫(kù)SFUD的應(yīng)用

    SFUD 是一款開(kāi)源的串行 SPI Flash 通用驅(qū)動(dòng)庫(kù)。由于現(xiàn)有市面的串行 Flash 種類居多,各個(gè) Flash 的規(guī)格及命令存在差異
    的頭像 發(fā)表于 12-15 10:05 ?4014次閱讀

    SPI FLASH驅(qū)動(dòng)

    、netdev組件2.3、協(xié)議棧組件2.4、netutils工具集軟件包2.5、webnet軟件包二、添加驅(qū)動(dòng)和初始化代碼1、SPI FLASH驅(qū)動(dòng)2、網(wǎng)卡
    發(fā)表于 08-19 09:16

    SPI方式FPGA配置和SPI flash編程

    SPI方式FPGA配置和SPI flash編程
    發(fā)表于 05-16 18:01 ?166次下載
    <b class='flag-5'>SPI</b>方式FPGA配置和<b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>編程

    基于紅牛開(kāi)發(fā)板的spi flash讀寫圖片

    SPI:serial peripheral interface串行外圍設(shè)備接口是一種常見(jiàn)的時(shí)鐘同步串行通信接口。外置flash按接口分有總線flash,SPI
    發(fā)表于 09-01 17:16 ?16次下載
    基于紅牛開(kāi)發(fā)板的<b class='flag-5'>spi</b> <b class='flag-5'>flash</b>讀寫圖片

    SPI—外部FLASH-W25Q128

    -ST固件庫(kù)版本:1.5.1 【 !】功能簡(jiǎn)介: 讀寫板載的SPI FLASH芯片。 學(xué)習(xí)目的:學(xué)習(xí)STM32的SPI驅(qū)動(dòng)。 【 ??!】注意事項(xiàng): 板子的
    發(fā)表于 12-13 15:13 ?99次下載

    SPI flash是什么,關(guān)于SPI FLASH的讀寫問(wèn)題

    SPI一種通信接口。那么嚴(yán)格的來(lái)說(shuō)SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。
    的頭像 發(fā)表于 09-18 14:38 ?10.5w次閱讀
    <b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>是什么,關(guān)于<b class='flag-5'>SPI</b> <b class='flag-5'>FLASH</b>的讀寫問(wèn)題

    SPI flash如何運(yùn)行程序,SPI flash有哪些應(yīng)用

    SPI一種通信接口。那么嚴(yán)格的來(lái)說(shuō)SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。
    的頭像 發(fā)表于 09-19 10:54 ?2w次閱讀
    <b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>如何運(yùn)行<b class='flag-5'>程序</b>,<b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>有哪些應(yīng)用

    淺析FLASH讀寫----SPI原理及應(yīng)用

    SPI一種通信接口。那么嚴(yán)格的來(lái)說(shuō)SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。
    的頭像 發(fā)表于 10-07 11:32 ?2.5w次閱讀
    <b class='flag-5'>淺析</b><b class='flag-5'>FLASH</b>讀寫----<b class='flag-5'>SPI</b>原理及應(yīng)用

    關(guān)于SPI_FLASH時(shí)序描述及驅(qū)動(dòng)編程

    SPI_FLASH時(shí)序描述及驅(qū)動(dòng)編程
    的頭像 發(fā)表于 03-25 11:15 ?4511次閱讀
    關(guān)于<b class='flag-5'>SPI_FLASH</b>時(shí)序描述及<b class='flag-5'>驅(qū)動(dòng)</b>編程

    STM32_ SPI讀寫Flash

    STM32_SPI讀寫Flash
    的頭像 發(fā)表于 04-08 10:26 ?6383次閱讀
    STM32_ <b class='flag-5'>SPI</b>讀寫<b class='flag-5'>Flash</b>

    用于SPI軟件的Windows 7驅(qū)動(dòng)程序

    用于SPI軟件的Windows 7驅(qū)動(dòng)程序
    發(fā)表于 06-10 15:13 ?9次下載
    用于<b class='flag-5'>SPI</b>軟件的Windows 7<b class='flag-5'>驅(qū)動(dòng)程序</b>

    SPI Nand Flash簡(jiǎn)介

    1.SPI Nand Flash簡(jiǎn)介SPI Nand Flash顧名思義就是串行接口的Nand Flash,它和普通并行的Nand
    發(fā)表于 12-02 10:51 ?35次下載
    <b class='flag-5'>SPI</b> Nand <b class='flag-5'>Flash</b>簡(jiǎn)介

    【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動(dòng)spi flash

    【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動(dòng)spi flash
    的頭像 發(fā)表于 11-21 01:05 ?1481次閱讀
    【S32K146 RT-Thread】之 使用SFUD組件<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>spi</b> <b class='flag-5'>flash</b>

    SPI NOR FLASH是什么,與SPI NAND Flash的區(qū)別

    存儲(chǔ)一位數(shù)據(jù) (0或1) ,可以直接尋址,尋址速度非??臁?b class='flag-5'>SPI NOR FLASH支持全雙工、單工以及半雙工傳輸方式,被廣泛應(yīng)用于嵌入式系統(tǒng)中,如Bootloader、操作系統(tǒng)內(nèi)核等程序的存儲(chǔ)。由于它的讀寫速度和尋址方式類似于
    的頭像 發(fā)表于 08-21 09:26 ?763次閱讀