<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SPI flash是什么,關于SPI FLASH的讀寫問題

ss ? 作者:工程師譚軍 ? 2018-09-18 14:38 ? 次閱讀

本文主要是關于SPI flash的相關介紹,并著重對SPI flash的原理及其讀寫進行了相近的闡述。

SPI flash

SPI一種通信接口。那么嚴格的來說SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。但現在大部分情況默認下人們說的SPI Flash指的是SPI NorFlash。早期Norflash的接口是parallel的形式,即把數據線和地址線并排與IC的管腳連接。但是后來發現不同容量的Norflash不能硬件上兼容(數據線和地址線的數量不一樣),并且封裝比較大,占用了較大的PCB板位置,所以后來逐漸被SPI(串行接口)Norflash所取代。同時不同容量的SPI Norflash管腳也兼容封裝也更小。,至于現在很多人說起NOR flash直接都以SPI flash來代稱。

SPI flash是什么,關于SPI FLASH的讀寫問題

NorFlash根據數據傳輸的位數可以分為并行(Parallel,即地址線和數據線直接和處理器相連)NorFlash和串行(SPI,即通過SPI接口和處理器相連)NorFlash;區別主要就是:1、SPI NorFlash每次傳輸一bit位的數據,parallel連接的NorFlash每次傳輸多個bit位的數據(有x8和x16bit兩種); 2、SPI NorFlash比parallel便宜,接口簡單點,但速度慢。

NandFlash是地址數據線復用的方式,接口標準統一(x8bit和x16bit),所以不同容量再兼容性上基本沒什么問題。但是目前對產品的需求越來越小型化以及成本要求也越來越高,所以SPI NandFlash漸漸成為主流,并且采用SPI NANDFlash方案,主控也可以不需要傳統NAND控制器,只需要有SPI接口接口操作訪問,從而降低成本。另外SPI NandFlash封裝比傳統的封裝也小很多,故節省了PCB板的空間。

今天主要說下SPI NorFlash。

二、有毛用啊

節省成本,減小封裝,存儲數據。

三、怎么用啊

怎么用說白了對于Flash就是讀寫擦,也就是實現flash的驅動。先簡單了解下spi flash的物理連接。

之前介紹SPI的時候說過,SPI接口目前的使用是多種方式(具體指的是物理連線有幾種方式),Dual SPI、Qual SPI和標準的SPI接口(這種方式肯定不會出現在連接外設是SPI Flash上,這玩意沒必要全雙工),對于SPI Flash來說,主要就是Dual和Qual這兩種方式。具體項目具體看了,理論上在CLK一定的情況下, 線數越多訪問速度也越快。我們項目采用的Dual SPI方式,即兩線。

當前涉及到具體的SPI flash芯片類型了,所以必須也得參考flash的datasheet手冊了。我們以W25Q64JVSSIQ為例。

這是基本信息的介紹,然后看下具體IO的定義

這個是WSON封裝的管腳定義,其他詳細信息參考datasheet。

硬件驅動的話也是和芯片強相關的,因為讀寫擦都是和硬件時序相關的,所以必須得參考硬件datasheet手冊。

上面的datasheet都詳細說明了每個操作的時序周期發送的命令。上圖中,第一列是指令名稱,第二列是指令編碼,第三列及以后的指令功能與對應的指令有關。帶括號的字節內容為flash向主機返回的字節數據,不帶括號則是主機向flash發送字節數據。

A0~A23:flash內部存儲器地址;MID0~MID7:制造商ID;ID0~ID15:flash芯片ID;D0~D7:flash內部存儲的數據;dummy:指任意數據。

比如獲取deviceID:

表示該命令由這四個字節組成,其中dummy意為任意編碼,即這三個字節必須得發數據,但這些數據是任意的,上圖命令列表中帶括號的字節數據表示由FLASH返回給主機的響應,可以看到deviceID命令的第5個字節為從機返回的響應,(ID7~ID0),即返回設備的ID號。

代碼如下:

uint32_t Get_Flash_DeviceID(void)

{

uint8_t deviceID= 0x00;

spiflashReset();

spi_write( 0xAB);

spi_write( Dummy);

spi_write( Dummy);

spi_write( Dummy);

deviceID = spi_write( Dummy);

spi_write( Dummy);

spiflashSet() ;

return deviceID;

}

SPI Flash的擦寫注意事項

SPI flash一般支持3種擦寫方式:按sector擦寫,按block擦寫,整片chip擦寫。

以KH25L3255E為例,

? Serial Peripheral Interface compatible -- Mode 0 and Mode 3

? 33,554,432 x 1 bit structure or 16,777,216 x 2 bits (two I/O mode) structure or 8,388,608 x 4 bits (four I/O

mode) structure

? 1024 Equal Sectors with 4K bytes each

- Any Sector can be erased individually

? 128 Equal Blocks with 32K bytes each

- Any Block can be erased individually

? 64 Equal Blocks with 64K bytes each

- Any Block can be erased individually

? Power Supply Operation

- 2.7 to 3.6 volt for read, erase, and program operations

? Latch-up protected to 100mA from -1V to Vcc +1V

由此可以看出,KH25L3255E的sector大小是4K,block大小是32K/64K.因此,可以一次性擦除4K/32K/64K.

三種擦寫方式的性能比較:

- Fast erase time: 30ms (typ.)/sector (4K-byte per sector) ; 0.25s(typ.) /block (64K-byte per block); 10s(typ.) /

chip

從上述數據看,擦除同樣大小的情況下,執行時間 sector》block》chip

按sector擦寫,擦完64K需要0.48s,而按block一次性擦寫64K只需要0.25s;按block擦寫,擦完整片chip需要16s,而按chip擦寫只需要10s;按sector擦寫完整片chip需要30s。

linux/drivers/mtd/devices/m25p80.c看,m25p_probe函數在選擇擦寫單位時,是傾向于選擇小單位的,會優先選擇4K,如下:

/* prefer “small sector” erase if possible */

if (info-》flags & SECT_4K) {

flash-》erase_opcode = OPCODE_BE_4K;

flash-》mtd.erasesize = 4096;

} else {

flash-》erase_opcode = OPCODE_SE;

flash-》mtd.erasesize = info-》sector_size;

}

這在在用戶空間體現在,使用mtd工具或者ioctl讀取erasesize時讀到的是sector(4K),如下:

# mtd_debug info /dev/mtd0

mtd.type = MTD_NORFLASH

mtd.flags = MTD_CAP_NORFLASH

mtd.size = 2883584 (2M)

mtd.erasesize = 4096 (4K)

mtd.writesize = 1

mtd.oobsize = 0

regions = 0

# mtdinfo /dev/mtd0

mtd0

Name: flash0.bolt

Type: nor

Eraseblock size: 4096 bytes, 4.0 KiB

Amount of eraseblocks: 704 (2883584 bytes, 2.8 MiB)

Minimum input/output unit size: 1 byte

Sub-page size: 1 byte

Character device major/minor: 90:0

Bad blocks are allowed: false

Device is writable: true

若想要將erasesize改成block大小,需要修改驅動,例如,將上述m25p80.c中的配置成SECT_4K的相關地方改成0,驅動就會使用block大小。

另外,需要注意的是,m25p80.c中“sector”和“block”的概念搞反了,里面的“block”才是規格書中的sector,一般是4K,請見OPCODE_BE_4K和OPCODE_SE兩個宏定義處。

mtd.erasesize的大小會對應用上有一些影響,比較重要的一點是在制作某些嵌入式文件系統的鏡像文件時,需要設置擦除單位,如果設置的擦除單位和驅動中的不符,會導致文件系統無法正常工作。

另外,porting層設置spi的擦寫單位時,也需要注意當前實際的erasesize。

案例(解決方法就是修改驅動將spi-mtd的erasesize改成block大小,使其和jffs2的擦寫單位一致):

http://bbs.csdn.net/topics/390299487/

《制作JFFS2時的erase_block與SPI FLASH中的erase_sector的關系?》

如題, 在制作JFFS2時 需要用到-e 參數(。/mkfs.jffs2 -b --pad=524288 -s 256 -e 65536 -d userfs/ -o usrjffs2.img)help命令中,對其的解釋為: -e, --eraseblock=SIZE Use erase block size SIZE (default: 64KiB)。

在SPI FLASH(winbond 8M)的datasheet中寫到:其erase_sector只能為4KB,erase_block可為32/64kB,

目前在SPI的驅動中,設置block_size為 64KB, erase_sector為 4KB。

問題來了!

將制作好的512K FLASH掛載到系統上后,會報如下錯誤:

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00022034: 0x5771 instead

Further such events for this erase block will not be printed

Node at 0x00022f60 with length 0x000000f6 would run over the end of the erase block

Perhaps the file system was created with the wrong erase size?

jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00023000: 0x69c2 instead

進入系統后,發現jffs2中的文件有缺失。

根據報錯提示以及網上資料, 原因應該為: 制作JFFS2時的erase_block 與系統的不符~。

但系統這塊的block_size(這個應該也就是erase_block的大小吧?)已經是設置成64KB的了。

更改SPI驅動中,erase_sector的大小為64KB,則JFFS2報錯問題解決, 但由于該SPI FLASH的

erase_sector是固定死的4K,貿然使用64KB(32KB同樣)會造成再擦寫FLASH時,極大概率出現某

一erase_secotr大小的塊中數據為空的情況,即系統不能啟動。

另,在制作JFFS2時,將-e參數設置為4096,以配合FLASH的erase_sector, 但悲催的是mkfs.jffs2

所支持-e 最小為8KB。

請問現在這個報錯問題應該如何解決???

一點細節: 嘗試添加了 -s 參數,其大小為FLASH page的大小256B,但問題依舊。

當JFFS2中文件較少時,不知為何就不會出現上方的報錯。

關于SPI FLASH的讀寫問題

spi flash W25Q128會偶爾出現寫入錯誤的情況,會發現讀出的值和寫入的值不一致,需加入2次讀出比較判斷。

21W25QXX_Read(&temp_date_count,0x000000,1);

//W25QXX_Write((u8*)&temp_date,0x400000,135);

//W25QXX_Read((u8*)&temp_data_test,0x400000,135);

W25QXX_Write((u8*)&temp_date,(temp_date_count*135+1),135);

W25QXX_Read((u8*)&temp_data_test,(temp_date_count*135+1),135);

if(memcmp(&temp_date,&temp_data_test,135)!=0)

{

W25QXX_Write((u8*)&temp_date,(temp_date_count*135+1),135);

W25QXX_Read((u8*)&temp_data_test,(temp_date_count*135+1),135);

if(memcmp(&temp_date,&temp_data_test,135)!=0)

{

W25QXX_Write((u8*)&temp_date,(temp_date_count*135+1),135);

}

}

temp_date_count=temp_date_count+1;//Each time a structure is written

if(temp_date_count==60)

{

temp_date_count=0;

}

W25QXX_Write(&temp_date_count,0,1);

結語

關于SPI flash的相關介紹就到這了,如有不足之處歡迎指正。

相關閱讀推薦:揭開Zynq Z-7000從SPI接口掛載的flash啟動的神秘面紗

相關閱讀推薦:基于FPGA 的SPI Flash 控制器設計及驗證

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1567

    瀏覽量

    146907
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1625

    瀏覽量

    89981
收藏 人收藏

    評論

    相關推薦

    基于FPGA的SPI Flash控制器的設計方案

    傳統的Flash讀寫是通過CPU軟件編程實現,其讀寫速度較慢,且占用CPU資源,另外由于Flash芯片本身功能指令較多,使得對芯片進行直接操作變得非常困難。本文提出一個基于FPGA的
    發表于 09-24 09:12 ?5677次閱讀
    基于FPGA的<b class='flag-5'>SPI</b> <b class='flag-5'>Flash</b>控制器的設計方案

    SPI方式FPGA配置和SPI flash編程

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

    基于紅牛開發板的spi flash讀寫圖片

    你的MCU上有外部總線接口,SPI flash就是通過SPI口對flash進行讀寫。速度上,總線flas
    發表于 09-01 17:16 ?16次下載
    基于紅牛開發板的<b class='flag-5'>spi</b> <b class='flag-5'>flash</b><b class='flag-5'>讀寫</b>圖片

    SPI flash如何運行程序,SPI flash有哪些應用

    SPI一種通信接口。那么嚴格的來說SPI Flash是一種使用SPI通信的Flash,即,可能指NOR也可能是NAND。
    的頭像 發表于 09-19 10:54 ?1.8w次閱讀
    <b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>如何運行程序,<b class='flag-5'>SPI</b> <b class='flag-5'>flash</b>有哪些應用

    淺析spi flash驅動及其程序

    怎么用說白了對于Flash就是讀寫擦,也就是實現flash的驅動。先簡單了解下spi flash的物理連接。
    的頭像 發表于 10-07 11:26 ?1.8w次閱讀
    淺析<b class='flag-5'>spi</b> <b class='flag-5'>flash</b>驅動及其程序

    淺析FLASH讀寫----SPI原理及應用

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

    STM32F0xx_SPI讀寫(Flash) 配置詳細過程

    STM32F0xx_SPI讀寫(Flash)配置詳細過程
    的頭像 發表于 04-07 11:40 ?4819次閱讀
    STM32F0xx_<b class='flag-5'>SPI</b><b class='flag-5'>讀寫</b>(<b class='flag-5'>Flash</b>) 配置詳細過程

    STM32_ SPI讀寫Flash

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

    實現簡單的SPI讀寫FLASH

    實現簡單的SPI讀寫FLASH一、前言繼上篇文章SPI的相關知識,本章主要介紹使用SPI協議實現簡單的
    發表于 11-26 19:21 ?22次下載
    實現簡單的<b class='flag-5'>SPI</b><b class='flag-5'>讀寫</b><b class='flag-5'>FLASH</b>

    SPI Nand Flash簡介

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

    單片機學習筆記————STM32使用SPI讀寫串行Flash(三)

    第一步:讀寫相關函數在向 FLASH 芯片存儲矩陣寫入數據前,首先要使能寫操作,通過“Write Enable”命令即可寫使能。1.寫使能命令/** * @brief 向Flash發送寫使能命令
    發表于 12-22 19:15 ?4次下載
    單片機學習筆記————STM32使用<b class='flag-5'>SPI</b><b class='flag-5'>讀寫</b>串行<b class='flag-5'>Flash</b>(三)

    STM32F103學習筆記——SPI讀寫Flash(二)

    介紹1.軟件設計流程SPI讀寫Flash流程:初始化通訊引腳及端口時鐘;使能SPI時鐘;配置SPI結構體;編寫基本
    發表于 12-22 19:30 ?10次下載
    STM32F103學習筆記——<b class='flag-5'>SPI</b><b class='flag-5'>讀寫</b><b class='flag-5'>Flash</b>(二)

    SPI控制EF3內置FLASH讀寫

    電子發燒友網站提供《SPI控制EF3內置FLASH讀寫.pdf》資料免費下載
    發表于 09-27 10:19 ?1次下載
    <b class='flag-5'>SPI</b>控制EF3內置<b class='flag-5'>FLASH</b><b class='flag-5'>讀寫</b>

    SPI控制EF2內置FLASH讀寫

    電子發燒友網站提供《SPI控制EF2內置FLASH讀寫.pdf》資料免費下載
    發表于 09-26 15:16 ?3次下載
    <b class='flag-5'>SPI</b>控制EF2內置<b class='flag-5'>FLASH</b><b class='flag-5'>讀寫</b>

    基于FPGA的SPI Flash控制器的設計方案

    一個基于FPGA的SPI Flash讀寫硬件實現方案,該方案利用硬件對SPI Flash進行控制,能夠非常方便地完成
    的頭像 發表于 07-15 16:55 ?1474次閱讀
    基于FPGA的<b class='flag-5'>SPI</b> <b class='flag-5'>Flash</b>控制器的設計方案
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>