[硬件]關(guān)于SPI Flash那些你不知道的事兒
剛開始學(xué)習(xí)STM32時(shí),對(duì)SPI Flash的塊、扇區(qū)的概念模糊不清,現(xiàn)在回頭再看,感覺豁然開朗!
以華邦W25Q128為例,詳解SPI Flash的特點(diǎn),讀寫注意事項(xiàng),和地址范圍等。
和EPROM的區(qū)別
以AT24C02 EPROM和W25Q128 SPI Flash為例。
EPROM通常采用是IIC串行總線,低速,單雙工,通信速率一般是百KHz。而SPI Flash是采用的SPI總線,高速,全雙工,通訊速率一般是百M(fèi)Hz。SPI Flash屬于Flash ROM閃存,相比于EPROM,讀寫速度更快。
EPROM通常用于存儲(chǔ)不頻繁讀取的數(shù)據(jù),如配置信息等,而EPROM通常用來存儲(chǔ)經(jīng)常讀取的數(shù)據(jù),如字庫文件等。
EPROM讀寫比較隨意,想寫那個(gè)地址寫那個(gè),想讀哪個(gè)地址讀哪個(gè)!而SPI Flash則比較規(guī)范,擦除的最小單位是扇區(qū)。向某個(gè)地址寫入數(shù)據(jù)時(shí), 要先讀取這個(gè)地址的數(shù)據(jù)是否為0xFF,如果不是0xFF,那么這個(gè)數(shù)據(jù)寫入失敗。所以通常的寫操作是,在寫某個(gè)地址之前,直接擦除這個(gè)地址所在的那個(gè)扇區(qū),然后再寫數(shù)據(jù)。當(dāng)然,如果這個(gè)扇區(qū)的所有內(nèi)容都是0xFF,則無需擦除,可以直接寫入。
EPROM通常容量比較小,大小為KB級(jí)的,如AT24C02是2KB,而SPI Flash容量比較大,大小為MB級(jí)的,如W25Q16是16Mbit,也就是2MB。
EPROM型號(hào)通常是xx24系列,而SPI Flash通常是xx25系列,所以從芯片型號(hào)我們也可以看出ROM類型。
EPROM數(shù)據(jù)保存時(shí)間大約是100年,而SPI Flash數(shù)據(jù)保存時(shí)間為20年。
EPROM的讀寫次數(shù)為100萬次左右,SPI Flash讀寫次數(shù)為10萬次左右
AT24C02讀寫次數(shù)和存儲(chǔ)時(shí)間
W25Q128讀寫次數(shù)和存儲(chǔ)時(shí)間
塊、扇區(qū)、頁傻傻分不清
128Mbits/8 = 16MB = 16*1024KB = 16384 KB = 16,777,216B
,所以很容易計(jì)算出整個(gè)存儲(chǔ)空間的地址范圍:
0x000000~0xFFFFFF
所以,如果按照塊來計(jì)算,W25Q128包括256
個(gè)塊。
如果按照扇區(qū)來計(jì)算,W25Q128包括256*16=4096
個(gè)扇區(qū)。
如果按照頁來計(jì)算的話,W25Q128包括4096*16=65536
個(gè)頁。
每個(gè)塊的大小是:16384KB/256 = 64KB
每個(gè)扇區(qū)的大小是:64KB/16 = 4KB
每個(gè)頁的大小是:4KB/16 = 256B
但是實(shí)際上,我們?cè)谶M(jìn)行讀寫操作時(shí),都是區(qū)分塊和扇區(qū),不區(qū)分頁的。包括在官方的Datasheet中,并沒有重點(diǎn)提及頁的地址范圍。
地址范圍
從存儲(chǔ)容量來看,我們可以輕松的計(jì)算出W25Q128的整個(gè)存儲(chǔ)空間的地址范圍:0x000000~0xFFFFFF
,也就是地址最大是24位。根據(jù)塊的大小是64KB,扇區(qū)的大小是4KB,我們可以計(jì)算出每個(gè)塊和扇區(qū)的地址范圍:
塊0的地址:`0x000000~0x00FFFF`
塊1的地址:`0x010000~0x01FFFF`
.....
塊255的地址:`0xFF0000~0xFFFFFF`
對(duì)于每個(gè)塊,以塊0為例:
塊0扇區(qū)0的地址:`0x000000~0x000FFF`
塊0扇區(qū)1的地址:`0x001000~0x001FFF`
....
塊0扇區(qū)15的地址:`0x00F000~0x00FFF`
不知道你是否發(fā)現(xiàn)了,地址的高8位(23-16位)表示塊的位置,第15-12位為扇區(qū)的位置。
例如,塊10的第7個(gè)扇區(qū)的地址范圍:0x0A 7 000 ~ 0x0A 7 FFF
;
W25Q128支持讀取任意一個(gè)地址的數(shù)據(jù),范圍:0x000000~0xFFFFFF
根據(jù)絕對(duì)地址,獲取這個(gè)地址所在的塊和扇區(qū)位置就很簡(jiǎn)單了:
/* 存儲(chǔ)地址 */
uint32_t addr = 0xC0A002;
/* 23-16位是塊的位置 */
uint8_t block = addr >> 16; /* (addr & 0xFF0000)>>16*/
/* 15-12位是扇區(qū)的位置 */
uint8_t sector = (addr << 16) >> 28; /* (addr & 0x00F000)>>12 */
uart_init(115200);
printf("addr:%x, block:%d, sector:%d\r\n", addr, block, sector);
運(yùn)行結(jié)果
常用指令
W25Q128的擦除,可以通過指令配置為單獨(dú)的扇區(qū)擦除,單獨(dú)的塊擦除,或者整片擦除,整片擦除時(shí)間會(huì)比較長(zhǎng)。
0xC7:整片擦除
0xD8:塊擦除
0x20:扇區(qū)擦除
0xAB:獲取芯片ID
0x90:獲取芯片型號(hào)
0x06:寫使能
0x04:禁止寫
0xB9:進(jìn)入掉電模式,功耗極低
0xAB:退出掉電模式
發(fā)送0x90命令之后的返回值表示當(dāng)前器件的型號(hào):
/*
0XEF13,表示芯片型號(hào)為W25Q80
0XEF14,表示芯片型號(hào)為W25Q16
0XEF15,表示芯片型號(hào)為W25Q32
0XEF16,表示芯片型號(hào)為W25Q64
0XEF17,表示芯片型號(hào)為W25Q128
*/
使用Jlink燒寫SPI Flash
大多數(shù)玩單片機(jī)的人都知道Jlink可以燒寫Hex文件,作為ARM仿真調(diào)試器,但是知道能燒寫SPI Flash的人應(yīng)該不多。
JLink軟件包含的工具中,有一個(gè)是JFlashSPI工具,可以燒寫和讀取SPI存儲(chǔ)器。
可以參考:Jlink使用技巧之燒寫SPI Flash存儲(chǔ)芯片
推薦閱讀
我的博客:www.wangchaochao.top
我的公眾號(hào):mcu149
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!