FLASH在嵌入式開(kāi)發(fā)是很常用的一種芯片。它是存儲(chǔ)芯片的一種,通過(guò)特定的程序可以修改里面的數(shù)據(jù)。FLASH在電子以及半導(dǎo)體領(lǐng)域內(nèi)往往表示Flash Memory的意思,即平時(shí)所說(shuō)的“閃存”,全名叫Flash EEPROM Memory。
FLASH存儲(chǔ)器又稱(chēng)閃存,它結(jié)合了ROM和RAM的長(zhǎng)處,不僅具備電子可擦除可編程(EEPROM)的性能,還可以快速讀取數(shù)據(jù)(NVRAM的優(yōu)勢(shì)),使數(shù)據(jù)不會(huì)因?yàn)閿嚯姸鴣G失。
1 W25QXX簡(jiǎn)介
W25QX系列是串行閃存器件。擦寫(xiě)周期多達(dá)10W次,可將數(shù)據(jù)保存達(dá)20年之久,支持2.7~3.6V的電壓,支持標(biāo)準(zhǔn)的SPI,還支持雙輸出/四輸出的SPI,最大SPI時(shí)鐘可達(dá)80Mhz。
FLASH芯片的內(nèi)存空間一般都是由多個(gè)塊組成,而塊又是由扇區(qū)組成。
例如W25Q64就是將8M字節(jié)的容量分為了128個(gè)塊,每個(gè)塊大小為64K字節(jié),每個(gè)塊又可分為16個(gè)扇區(qū),每個(gè)扇區(qū)4K個(gè)字節(jié)。
25Q系列的FLASH最小擦除單位為一個(gè)扇區(qū),也就是每次必須擦除4K個(gè)字節(jié)。所以,這需要給FLASH開(kāi)辟一個(gè)至少4K的緩存區(qū),這樣必須要求芯片有4K以上的SRAM才能有很好的操作。
2 硬件參數(shù)
硬件參數(shù)比較多,我只挑一些常用的介紹一下,更詳細(xì)的介紹可以查閱芯片手冊(cè)。
基本參數(shù) | 說(shuō)明 |
---|---|
電壓 | 2.7V - 3.6V |
電流 | 4mA活動(dòng)電流,掉電模式下小于1uA |
通訊方式 | 標(biāo)準(zhǔn)SPI雙路SPI四路SPI |
速率 | 80MHz工作時(shí)鐘160MHz等效時(shí)鐘(雙路SPI模式下)320MHz等效時(shí)鐘(四路SPI模式下) |
引腳號(hào) | 引腳名稱(chēng) | I/O | 功能 |
---|---|---|---|
1 | CS | I | 片選輸入 |
2 | DO(IO1) | I/O 數(shù)據(jù)輸出,標(biāo)準(zhǔn)SPI數(shù)據(jù)引腳 (數(shù)據(jù)輸入輸出1)*1 |
|
3 | WP(IO2) | I/O | 寫(xiě)保護(hù)輸入,低電平有效,拉低時(shí)不能寫(xiě)入數(shù)據(jù) (數(shù)據(jù)輸入輸出2)*2 |
4 | GND | - | 地 |
5 | DI(IO0) | I/O | 數(shù)據(jù)輸入,標(biāo)準(zhǔn)SPI數(shù)據(jù)引腳 (數(shù)據(jù)輸入輸出0)*1 |
6 | CLK | I | 串行時(shí)鐘輸入 |
7 | HOLD(IO3) | I/O | 保持輸入,拉低時(shí),DO將處于高阻抗,DI和CLK針上的信號(hào)將被忽略,拉高時(shí)設(shè)備允許操作 (數(shù)據(jù)輸入輸出3)*2 |
8 | VCC | - | 供電 |
注:IO0和IO1用在標(biāo)準(zhǔn)和雙路SPI模式,IO0到IO3用在四路SPI模式下。如果IO2和IO3不使用,可以硬件拉高。
3 寄存器介紹
我這里只列舉部分跟軟件編程相關(guān)的常用寄存器,更詳細(xì)的介紹可以查閱芯片手冊(cè)。。
指令名稱(chēng) | 數(shù)值 |
---|---|
制造商設(shè)備ID | 90h |
JEDEC ID | 9Fh |
寫(xiě)狀態(tài)寄存器 | 01h |
讀狀態(tài)寄存器1 | 05h |
讀狀態(tài)寄存器2 | 35h |
讀數(shù)據(jù) | 03h |
寫(xiě)使能 | 06h |
寫(xiě)失能 | 04h |
扇區(qū)擦除(4KB) | 20h |
全片擦除 | C7h |
頁(yè)編程 | 02h |
4 編程相關(guān)
當(dāng)我們要使用MCU來(lái)讀寫(xiě)flash芯片的時(shí)候,需要用到spi通訊,這里面有幾個(gè)比較容易踩的坑。
1、WP和HOLD引腳
如果使用標(biāo)準(zhǔn)4線spi通訊,要注意WP和HOLD引腳的狀態(tài),WP拉低時(shí)不能寫(xiě)入數(shù)據(jù),HOLD拉低時(shí),DO將處于高阻抗,DI和CLK針上的信號(hào)將被忽略。因此,如果不使用4路spi的話,WP和HOLD引腳可以直接通過(guò)硬件拉高,也可以通過(guò)MCU的GPIO拉高。否則,懸空或者拉低都會(huì)影響數(shù)據(jù)的寫(xiě)入。
2、連續(xù)寫(xiě)入時(shí)需要注意分區(qū)
flash一次最大可編輯256字節(jié)。flash內(nèi)存可以分成多個(gè)頁(yè),每頁(yè)256個(gè)字節(jié),我們?cè)谑褂胹pi寫(xiě)入flash時(shí)最多只能一次寫(xiě)入一頁(yè)數(shù)據(jù),并且不能跨頁(yè)寫(xiě)入。因此,當(dāng)我們需要連續(xù)寫(xiě)入超過(guò)一頁(yè)數(shù)據(jù)時(shí),需要注意把spi通訊分成多次。同樣的,寫(xiě)入時(shí)也不能跨扇區(qū)寫(xiě)入。
3、flash寫(xiě)入前需要先擦除
flash寫(xiě)入時(shí)是按bit操作的,只能把1改成0,只有擦除才能把0變成1,因此,如果不擦除直接寫(xiě)入的話就會(huì)變成或運(yùn)算,最終存儲(chǔ)的數(shù)據(jù)可能跟寫(xiě)入的數(shù)據(jù)不一致。
4、擦除的最小單位是扇區(qū)(4K字節(jié))
flash不能只單獨(dú)擦除某一個(gè)寄存器,最少也是4096字節(jié)。如果某一個(gè)扇區(qū)原本保存了一些重要數(shù)據(jù),然后你又需要從這個(gè)扇區(qū)的中間位置添加一些新的數(shù)據(jù),這個(gè)時(shí)候需要注意在擦除前要先把原有保存的數(shù)據(jù)讀出來(lái),擦除后再把舊的數(shù)據(jù)和新的數(shù)據(jù)寫(xiě)進(jìn)去,不然直接擦除的話會(huì)把原有的數(shù)據(jù)擦掉。
結(jié)束語(yǔ)
好了,關(guān)于W25QXX系列FLASH的介紹就講到這里了,因?yàn)殛P(guān)于這個(gè)芯片的資料網(wǎng)上有很多講解教程,因此本文只是挑了一些重點(diǎn)來(lái)講,更詳細(xì)的內(nèi)容可以查閱相關(guān)的資料,如果有哪里不懂又找不到的話也可以在評(píng)論區(qū)留言或者私信給我。