剛開始學習STM32時,對SPI Flash的塊、扇區的概念模糊不清,現在回頭再看,感覺豁然開朗!
以華邦W25Q128為例,詳解SPI Flash的特點,讀寫注意事項,和地址范圍等。
以AT24C02 EPROM和W25Q128 SPI Flash為例。
EPROM通常采用是IIC串行總線,低速,單雙工,通信速率一般是百KHz。而SPI Flash是采用的SPI總線,高速,全雙工,通訊速率一般是百MHz。SPI Flash屬于Flash ROM閃存,相比于EPROM,讀寫速度更快。
EPROM通常用于存儲不頻繁讀取的數據,如配置信息等,而EPROM通常用來存儲經常讀取的數據,如字庫文件等。
EPROM讀寫比較隨意,想寫那個地址寫那個,想讀哪個地址讀哪個!而SPI Flash則比較規范,擦除的最小單位是扇區。向某個地址寫入數據時, 要先讀取這個地址的數據是否為0xFF,如果不是0xFF,那么這個數據寫入失敗。所以通常的寫操作是,在寫某個地址之前,直接擦除這個地址所在的那個扇區,然后再寫數據。當然,如果這個扇區的所有內容都是0xFF,則無需擦除,可以直接寫入。
EPROM通常容量比較小,大小為KB級的,如AT24C02是2KB,而SPI Flash容量比較大,大小為MB級的,如W25Q16是16Mbit,也就是2MB。
EPROM型號通常是xx24系列,而SPI Flash通常是xx25系列,所以從芯片型號我們也可以看出ROM類型。
EPROM數據保存時間大約是100年,而SPI Flash數據保存時間為20年。
EPROM的讀寫次數為100萬次左右,SPI Flash讀寫次數為10萬次左右
AT24C02讀寫次數和存儲時間:

W25Q128讀寫次數和存儲時間:

128Mbits/8 = 16MB = 16*1024KB = 16384 KB = 16,777,216B,所以很容易計算出整個存儲空間的地址范圍:0x000000~0xFFFFFF所以,如果按照塊來計算,W25Q128包括256個塊。
如果按照扇區來計算,W25Q128包括256*16=4096個扇區。
如果按照頁來計算的話,W25Q128包括4096*16=65536個頁。
每個塊的大小是:16384KB/256 = 64KB
每個扇區的大小是:64KB/16 = 4KB
每個頁的大小是:4KB/16 = 256B
但是實際上,我們在進行讀寫操作時,都是區分塊和扇區,不區分頁的。包括在官方的Datasheet中,并沒有重點提及頁的地址范圍。

從存儲容量來看,我們可以輕松的計算出W25Q128的整個存儲空間的地址范圍:0x000000~0xFFFFFF,也就是地址最大是24位。根據塊的大小是64KB,扇區的大小是4KB,我們可以計算出每個塊和扇區的地址范圍:
塊0的地址:`0x000000~0x00FFFF`
塊1的地址:`0x010000~0x01FFFF`
.....
塊255的地址:`0xFF0000~0xFFFFFF`
對于每個塊,以塊0為例:
塊0扇區0的地址:`0x000000~0x000FFF`
塊0扇區1的地址:`0x001000~0x001FFF`
....
塊0扇區15的地址:`0x00F000~0x00FFF`
不知道你是否發現了,地址的高8位(23-16位)表示塊的位置,第15-12位為扇區的位置。
例如,塊10的第7個扇區的地址范圍:0x0A 7 000 ~ 0x0A 7 FFF;
W25Q128支持讀取任意一個地址的數據,范圍:0x000000~0xFFFFFF
根據絕對地址,獲取這個地址所在的塊和扇區位置就很簡單了:
/*?存儲地址?*/
uint32_t?addr?=?0xC0A002;
/*?23-16位是塊的位置?*/
uint8_t?block?=?addr?>>?16;????/*?(addr?&?0xFF0000)>>16*/
/*?15-12位是扇區的位置?*/
uint8_t?sector?=?(addr?<16)?>>?28;?/*?(addr?&?0x00F000)>>12?*/
uart_init(115200);
printf("addr:%x,?block:%d,?sector:%d\r\n",?addr,?block,?sector);
運行結果:

W25Q128的擦除,可以通過指令配置為單獨的扇區擦除,單獨的塊擦除,或者整片擦除,整片擦除時間會比較長。
0xC7:整片擦除
0xD8:塊擦除
0x20:扇區擦除
0xAB:獲取芯片ID
0x90:獲取芯片型號
0x06:寫使能
0x04:禁止寫
0xB9:進入掉電模式,功耗極低
0xAB:退出掉電模式
發送0x90命令之后的返回值表示當前器件的型號:
/*
0XEF13,表示芯片型號為W25Q80
0XEF14,表示芯片型號為W25Q16
0XEF15,表示芯片型號為W25Q32
0XEF16,表示芯片型號為W25Q64
0XEF17,表示芯片型號為W25Q128
*/
大多數玩單片機的人都知道Jlink可以燒寫Hex文件,作為ARM仿真調試器,但是知道能燒寫SPI Flash的人應該不多。
JLink軟件包含的工具中,有一個是JFlashSPI工具,可以燒寫和讀取SPI存儲器。

END
→點關注,不迷路←