作者:Bird
上一回【Maker電子學】Flash 記憶體的原理與應用—PART14,我們介紹了 W25Q32JV 的寫入保護機制,包含保護頂端或地步特定連續區域的 Block Protect 模式,以及可以任意指定保護區塊的 Individual Block Lock 模式;這些模式通常是用來保護嵌入式系統 firmware 中很重要的啟動程式或是設備資料。
這一回會是 SPI NOR Flash 的最終回,我們會將 SPI NOR Flash 的一些其它特性補充說明完畢。
更寬的資料訊號 #
W25Q32JV 跟大部分的 SPI NOR Flash 一樣,除了支援標準的四個 SPI 訊號(MOSI、MISO、CLK、CS)之外,還支援利用兩個訊號傳輸資料的 Dual SPI 模式,以及四個訊號傳輸資料的 Quad SPI 模式。
在同樣的 clock 速度下,Dual SPI 每一個 clock 可以傳送兩個 bit,Quad SPI 每一個 clock 可以傳送 4 個 bit,因此可以大幅提高資料傳輸的速度。W25Q32JV 可以支援的 SPI clock 頻率最高是 133MHz,但在 Quad SPI 模式下,由於一次可以傳輸 4 個 bits,這時的傳輸速度等效於 133MHz * 4 = 532MHz 的標準 SPI,這讓 W25Q32JV 可以媲美傳統 8-bit 或 16-bit parallel 介面的 Flash 記憶體,卻只需要少少的 8 支接腳。

(圖片來源:Bird 提供)
這是 W25Q32JV 的接腳訊號。當我們使用標準 SPI 模式時,第五腳 DI 就是 SPI 的 MOSI,資料傳輸方向固定為系統對 Flash,第二腳 DO 就是 SPI 的 MISO,資料傳輸方向固定為Flash 對系統。
但如果我們要使用 Dual SPI mode,在傳輸指令及資料時,就會同時用到第五腳和第二腳,此時它們就叫做 IO0 及 IO1。
我們來看一個 Dual SPI mode 的指令:Fast Read Dual Output。
Dual Output #
這個指令叫「Fast Read Dual Output」,指令碼是 0x3B,它的時序圖是這樣的:

(圖片來源:Bird 提供)
我們先在 DI(IO0)上,用 8 個 clock 送入指令碼 0x3B,接著再用 24 個 clock 送入要讀取的位址,就像我們用讀取指令 0x03 時一樣,但接下來的動作就有點不同了。
送完位址後,系統要繼續送出 8 個 clock,但此時 W25Q32JV 不會有任何輸出;這 8 個 clock 叫做 dummy clock,為的是讓 W25Q32JV 內部的邏輯電路能準備接下來的高速讀取。
送完 8 個 dummy clock 後,接下來每 4 個 clock,W25Q32JV 就會在 IO0 和 IO1 上各送出 4 個 bit 的資料,總共 8 個 bit。一個 byte 裡的 bit 0、2、4、6 會出現在 IO0 上,而 bit 1、3、5、7、 則會出現在 IO1 上,只要我們一直送出 clock,W25Q32JV 就會以標準模式兩倍的速度持續吐出資料。
不過這個方法只有在資料輸出時,用到 Dual SPI,在送指令及位址時,仍然只用 DI 一支腳。尤其送指令時,需要用到 24 個 clock,對於 random access 來說,佔用的時間比例蠻多的。因此就有了另一個指令。
Dual I/O #
這個指令叫「Fast Read Dual I/O」,指令碼是 0xBB,它的時序圖是這樣的:

(圖片來源:Bird 提供)
這個指令在使用 DI 接腳送出指令碼 0xBB 之後,便可以在 IO0、IO1 上送出 24-bit 要存取的位址。由於可以用兩支腳送位址,所以只需要 12 個 clock 就可以送完位址。接著再經過 4 個 dummy clocks 之後,要讀取的資料就會出現在 IO0、IO1 上,一樣是 4 個 clock 一組。
Fast Read Dual I/O 由於只需要 16 個 clock(包含 dummy),因此從送指令到讀取完第一個完整的 data byte,總共只需要 28 個 clock(8 + 12 + 4 + 4),相較於標準的 read 指令需要 40 個 clock(8+24+8),確實可以大幅縮短 random access 所需要的時間。這讓許多系統可以直接從 SPI Flash 上即時讀取程式碼並執行,達成所謂的 XIP(execution in place),而不需要先將程式碼讀到 RAM 裡面之後再執行。
Quad Output/Quad I/O #
既然可以用兩支腳送資料、送指令,用四支腳應該也不是什麼問題。
於是就有了 Quad Output 的 Fast Read 指令:

(圖片來源:Bird 提供)
聰明的讀者一定猜得到,Fast Read Quad Output,就是用一隻腳送完指令及要讀取的位址之後,再經過 dummy clock,就可以從 IO0 – IO3 這四支腳上送出資料,每送一個 byte 只需要 2 個 clock,是不是很快!
同樣的機制也適用在 Fast Read Quad I/O,這個指令使用一支腳送完指令後,就可以用四支腳送位址,再加上幾個 dummy clock,資料就會在 IO0-IO3 上出現。
不過 IO2、IO3 這兩支腳佔用到了 WP 和 HOLD 這兩個訊號,因此如果要使用 Quad SPI 模式的話,我們得先告訴 W25Q32JV 我們要放棄 HOLD/WP 訊號,使用 Quad SPI。這個設定在狀態暫存器 SR2 的 QE 這個 bit 裡,預設 QE 是 0,表示我們沒有要使用 Quad SPI,而如果將這個 bit 設定成 1,HOLD 和 WP 訊號就會失效,取而代之的是 IO2 和 IO3。
身家調查 #
各位讀者可能有注意到,為什麼我們在介紹 SPI NOR Flash 的使用時,都特別說明是針對 Winbond 的 W25Q32JV 這顆晶片呢?別的 SPI NOR Flash 難道指令就不一樣嗎?
事實上,大部份 SPI NOR Flash 晶片的 SPI 指令多半都一樣,但由於這個業界缺乏百分之百統一的標準,所以各家不同的晶片公司還是會多少加入一些自己設計的指令或是有特色功能,這些額外的指令無法相容於所有的 SPI NOR Flash 晶片。
因此晶片的身分識別就變得很重要,但也剛好,SPI NOR Flash 業界對這件事還是有共識的。
有一個指令,0x9f,是 JEDEC 定義、大家都有的指令,它可以用來讀取 SPI NOR flash 的 manufacturer ID/device ID,也叫做 JEDEC ID。

(圖片來源:Bird 提供)
這個指令先送入指令碼後,再送入 24-bit 全部都是 0 的位址,接著 SPI NOR Flash 會吐出 8 個 bit 的 manufacturer ID、8 個 bit 的 memory typ ID,以及 8 個 bit 的 capacity ID。
以 Winbond 來說,它的 manufacturer ID 是 0xEF,因此所有 Winbond 生產的 SPI NOR Flash 都會讀到一樣的 manufacturer ID,而 device ID 則會隨著不同的產品而有所不同,W25Q32JV 的 memory type ID 隨著不同的 P/N 而有兩種,詳情可以參閱 datasheet。
這個 ID 讓設計軟體的人可以先用這個指令確定 SPI NOR Flash 的廠牌、型號後,決定能不能用某些非標準的指令去驅動它,進而大幅提高了軟體的彈性和相容性。
小結 #
關於 SPI NOR Flash 的介紹,我們就停在這一回。下一回,我們要開始介紹另一個很常使用、用量也非常大的Flash memory 產品:eMMC。
(責任編輯:賴佩萱)