玩轉 AI 機器人的新境界 – Now and Future
|
View Categories

Flash 記憶體的原理與應用—PART19

閱讀時間: 1 分鐘

作者:Bird

上一回【Maker電子學】Flash 記憶體的原理與應用—PART18,我們介紹了 SD 卡的容量分級以及速度分級標準,並說明了達到不同傳輸速度所使用的技術,包含早期的單端邏輯訊號到較新的差動訊號等技術。這一回我們要開始從軟體的觀點,來看看如何存取 SD 卡或 eMMC。

卡片的電源 #

在進入軟體的存取協定之前,我們還是要先來看幾個基本的硬體參數,其中最重要的就是電源。

早期的 SD 卡全部運作在 3.3 V(嚴格來說是 2.7 V 到 3.6 V)的電源及介面電壓,而在 SD 3.0 標準出來後,為了降低 EMI 及耗電,較新的 UHS-I 模式都使用 1.8 V(嚴格來說是 1.70 V 到 1.95 V)的介面電壓。由於較新的卡片支援不同的電壓,為了保證系統的相容性,讓舊的裝置可以使用新的卡片、新的裝置也可以使用舊的卡片,SD 卡在初始化的過程中有一個蠻複雜的辨認過程。

首先,為了保證系統的相容性,所有的 SD 卡在一開始工作時,都使用 3.3 V 供電,並使用 3.3 V 完成初始化以及一些卡片辨認的過程,包括卡片支援哪些速度、模式、電壓等。如果卡片支援較新的 1.8 V 低電壓模式,系統可以送出一個「切換電壓」的指令 CMD11,並與卡片同步將電壓從 3.3 V 切換到 1.8 V 的模式,一旦卡片切到 1.8 V 的工作模式,就只能停留在 1.8 V 的模式,直到斷電 reset 重來。

這裡有件事要特別注意的是,當卡片進入 1.8 V 模式時,只有卡片的 I/O 介面電壓(signaling voltage)變成 1.8 V,供應給卡片的電源始終維持 3.3 V 不會改變。

卡片的工作模式 #

我們之前說過,SD卡從MMC演變過來時,保留了最早最古老的SPI模式,而SD協會也很佛心的在規格中要求所有的卡片都要向前相容到上古時代,直到SDUC出現後,SD協會才在規格中放寬,讓SDUC不用支援SPI模式。

為了SD標準的尊嚴,所有的SD卡在開機時都是處在SD bus模式,如果要將卡片設定成SPI模式,需要將 CS 接腳拉 low,同時送一次CMD0去 reset 卡片,這時卡片就會進入SPI模式。

在 SD 模式下,傳資料的 DAT0-3 都是雙向的,但 SPI 介面的每一隻腳都是固定方向的,我們有辦法用 SPI 介面傳送 CMD0 給 SD 卡的任務嗎?來看看 SD 模式與 SPI 模式的腳位對應就知道了:

(圖片來源:Bird 提供)

SPI 模式的 MOSI 訊號剛好對應到送指令給 SD 卡的 CMD 接腳,因此我們可以用 SPI 的 MOSI 發送 CMD0 指令給 SD 卡,而 SD 卡收到指令後,會用 DAT0 訊號回應對指令的反應,這個訊號剛好接到 SPI 的 MISO,因此我們可以透過 MISO 讀取 SD 卡對 CMD0 指令的回答,來知道指令有沒有發送成功。當然,SD 模式的 clock 接腳也是 SPI 模式的 clock 接腳,所以在兩個模式下都使用這個 clock 訊號來取樣指令或資料訊號。

送指令 #

SPI 模式的資料傳輸都是以 byte 為單位,而 SD 模式下的指令,又叫做 token,則是 48-bit,因此我們可以用 6 個 SPI 的 byte 傳輸來完成一次 CMD0 的發送。

SD 模式下的指令格式是這樣:

(圖片來源:Bird 提供)

CMD0 的指令代碼就是 0b000000,而且它沒有參數,因此接下來 32 個 bits 填什麼都無所謂。但 SD 模式下預設要做 CRC 檢查,因此送完 32 個 bits 無關緊要的指令參數之後,需要送出一個正確的 CRC,卡片才會接收指令。SD 卡的 CRC 是用 x^7 + x^3 +1 這個多項式來計算的,如果指令參數全部送 0 的話,算出來的 7-bit CRC 就是 0x43。

整理一下上面的資料,我們要用 SPI 送出 CMD0 的資料就變成:

(圖片來源:Bird 提供)

也就是說,只要用 SPI 依序送出 0x40, 0x00, 0x00, 0x00, 0x00, 0x87 六個 bytes,同時讓 CS 腳也就是 DAT3 維持在 low,SD 卡就會被 reset 後進入 SPI 模式。

指令回應 #

SD 卡的的每一個指令都會有對應的回應碼,也叫做 response token,用以告知系統指令有沒有送成功,以及其它關於指令執行的狀態;根據指令的不同,回應從 8 個 bits 到 40 個 bits 不等。

送完指令 token 之後,系統應該要將 CMD 腳,也就是 MOSI 腳拉回 high,然後持續送出 clock 訊號,讓 SD 卡裡面的邏輯繼續運作;卡片需要一點時間去處理指令,這段時間叫做 NCR,也就是卡片回應指令所需要的時間,從 0 到 8 個 bytes 的 clock 時間不等。

CMD0 的回應格式叫做 R1,只有 8 個 bits,或是一個 byte。當 SD 卡經過足夠的 NCR,處理完 CMD0 後,它就會在 DAT0,也就是 MISO 接腳上送出回應。

R1 回應的 8 個 bits 是這些意思:

(圖片來源:Bird 提供)

這個 R1 回應包含相當多的資訊,很多指令都會用到,但原則上它報的都是錯誤,也就是說 R1 的回應如果有非 0 的 bit,通常代表出事了,因此我們會希望 CMD0 送過去後,經過 NCR 時間後,我們在 DAT0 上收到的回應都是 0。

好了,我們已經成功利用 SPI 介面將 SD 卡 reset 成 SPI 模式,接下來就可以繼續利用 SPI 送指令來操作卡片了。

小結 #

這一回我們說明了 SD 卡不同的工作電壓模式以及介面模式,並介紹了如何利用 SPI 介面將剛上電、仍處於 SD 介面模式的卡片 reset 成 SPI 模式,我們已經成功送出第一個指令 CMD0 了。

下一回,我們要繼續看看,如何利用 SPI 介面來送出其它指令,操作 SD 卡。

(責任編輯:賴佩萱)

Powered by BetterDocs

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *