使用STM32的SPI控制器,對外部的W25X16 FLASH(2M字節)芯片進行操作。以下爲邏輯分析儀抓取的時序。
以下是該FLASH芯片的命令表。
1、 1、讀取器件ID。
先拉低片選信號CS,再發送命令0XAB,再發送三個字節的dummy。讀取第四個字節數據,數據就是device ID。最後拉高CS,結束一次操作。
以下是發送命令0XAB放大的圖。可以看出CLK空閒狀態是高電平(CPOL = 1),偶數邊沿爲採樣時刻(CPHA = 1)。
2、 2、讀取jedec標準ID
先拉低片選信號CS,再發送命令0X9f,讀取三個數據。最後拉高CS,結束一次操作。
第一個數據:生產廠商
第二個數據:存儲器類型
第三個數據:容量
3、 3、 寫使能
Flash在寫數據,擦除,寫狀態寄存器之前,首先要打開寫使能。打開寫使能的方法也很簡單,發送命令0x06即可。
4、 4、 寫數據
拉低片選,發送命令0x02,表示寫操作。發送3個字節的地址。因爲選用的flash芯片大小爲2M,地址範圍爲0x00_0000 – 0x1f_ffff。所以需要24位表示地址。因此要發送3個字節來表徵寫入的地址。
三個地址發送完畢後,就開始發送要寫入的數據。
數據寫完畢後,拉高片選即可。
在寫數據完成後,要讀取flash芯片的狀態寄存器,判斷器件狀態。
讀取狀態寄存器,所用命令爲0x05,第二個SPI週期即爲讀取的狀態寄存器值,可以一直讀取該狀態寄存器的值。
當讀到狀態寄存器的值爲0x00後,表示器件完成寫操作。
5、 5、扇區擦除
使用命令0x20對扇區進行擦除。
擦除是從寫入扇區地址開始到扇區結束地址之間的內容擦除。即如果寫入擦除的地址是0x00_0010,那麼就會將0x00_0010 – 0x00_0FFF(一個扇區大小是4k)之間的內存區域擦除爲0xff。
6、
6、塊擦除
和扇區擦除一樣,只是發的命令爲0xd8,擦除的最大大小是64KB。
7、 7、芯片擦除
擦除整個芯片,發送命令0xc7。
8、 8、 讀數據
FLASH的讀數據有三種方式:
第一種是普通讀方式:
先拉低片選信號CS,再發送命令0X03,發送讀取數據的地址,3個字節。後面每個SPI週期,就是讀取的數據。
第二種是快速讀方式(fast read):
先拉低片選信號CS,再發送命令0X0b,發送讀取數據的地址,3個字節。發送一個dummy的SPI週期,後面每個SPI週期,就是讀取的數據。
快速讀方式,要等待5個SPI週期後,纔開始讀取有效信息。而普通讀模式下,只需等待4個SPI週期後,就可以讀取有效信息了。
第三種是快速雙通道讀方式(fast read dual output)
拉低片選CS,發送命令0x3b,發送讀取數據的地址,3個字節。發送一個dummy的SPI週期,後面每個SPI週期,就是讀取的數據。
從時序圖。看出這種讀方式下,MOSI和MISO都參與了讀數據的傳輸。所以在這種模式下,一個SPI可以讀取兩個字節。
第一個字節 第二個字節
MISO (1D7, 1D5, 1D3, 1D2) (2D7, 2D5, 2D3, 2D2)
MOSI (1D6, 1D4, 1D2, 1D0) (2D6, 2D4, 2D2, 2D0)
下面通過波形圖比較一下三種讀取數據方式:
普通read讀取的波形圖。第一個有效數據在第5個SPI處,值爲0x69, 第二個有效數據在第6個SPI處,值爲0x20。
Fast read讀取的波形圖。第一個有效數據在第6個SPI處,值爲0x69,第二個有效數據在第7個SPI處,值爲0x20。
Fast read dual讀取的波形圖。MOSI和MISO同時參與數據的讀取。第一個有效數據和第二個有效數據在第6個SPI處。
MISO 0 1 1 0 0 1 0 0 ( 1D7, 1D5, 1D3, 1D1) ( 2D7, 2D5, 2D3, 2D1)
MOSI 1 0 0 1 0 0 0 0 (1D6, 1D4, 1D2, 1D0) (2D6, 2D4, 2D2, 2D0)
組合得到第一個數據 01 10 10 01 0x69
組合得到第二個數據 00 10 00 00 0x20
從抓取的波形圖,來學習SPI驅動外部的FLASH,是可以很直觀的看到數據傳輸的過程,從而對SPI協議及外部的FLASH驅動有更深的瞭解。
可以下載pdf,查看清晰波形圖片信息。