OpenVINO工具套件AI程式講座
|
View Categories

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

作者:Bird

上一回 【Maker電子學】記憶體的原理與應用—PART19,我們說明了SD卡不同的工作電壓模式以及介面模式,並介紹了如何利用 SPI介面將剛上電、仍處於SD介面模式的卡片reset成SPI模式,我們也成功送出第一個指令 CMD0。

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

指令格式 #

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

SD 的指令格式是這樣:

(圖片來源:Bird 提供)

不管在SPI模式下還是SD模式下,指令都是48-bit一組,裡面包含:

  • 2個bits的起始代碼
  • 6個bits的指令代碼
  • 32個bits的指令參數
  • 7 個bits的CRC,用來檢查指令有沒有送錯
  • 1 個bit的結束代碼

差別在於,在SD模式下,指令是使用CMD這支獨立的接腳傳送的,而在SPI模式下,指令是使用SPI的MOSI接腳傳送。

我們在SD的各種文件當中常會看到CMDxx或是ACMDxx這樣的描述,指的就是SD卡的各種指令;其中CMD開頭的是一般的指令,或者叫做general commands,而ACMD開頭的叫做application-specific commands。

CMDxx的命令可以直接送出,而要送ACMDxx的命令時,要分兩階段:先送出一個CMD55,這個指令叫做APP_CMD,然後接下來的命令代碼就會被當作是ACMD。

時間回到我們上一次初始化SD卡並將它切換到SPI 模式時:我們在CS 訊號(也就是SD模式下的DAT3訊號)為low的狀態下,送出了CMD0,並讀取卡片送回來的回應碼,成功將卡片切換到SPI模式。

卡片辨認 #

接下來會有一個極為複雜的卡片辨認過程,涉及很多的命令及流程,主要是因為SD卡的規格經過多年的演變,容量從SD、SDHC、SDXC一直到最新的SDUC,電壓也有3.3 V和1.8 V的差別,傳輸模式更是多樣,從default speed、high speed到各種UHS模式,組合又多又複雜。

雖然SD協會要求所有的SD卡都要相容舊有的模式,但如果能透過卡片辨認指令知道這張卡片支援什麼容量、模式、電壓、速度,裝置端就可以使用對應的模式來操作卡片,榨出卡片的最大性能。

在SPI模式下,根據SD協會標準的建議,送完CMD0後,如果裝置端支援SD 2.0以上的協定,第一個用來辨認卡片的指令應該是CMD8,又叫做SEND_IF_COND,這個指令主要是用來辨認卡片支援什麼介面電壓,因為SD從2.0版標準開始支援1.8 V的介面電壓,如果裝置支援1.8 V,就要問問看卡片是否支援 1.8V,並在必要時切換介面電壓到1.8V。

如果裝置支援2.0以上的標準,但卡片是舊的SD 1.x,卡片就不會回應CMD8(因為它不認得這個指令),這時我們就知道卡片是SD 1.x;如果裝置端不支援SD 2.0 以上的標準,就可以跳過 CMD8 指令,進入 ACMD41 的輪詢(polling)階段。

ACMD41 指令又叫做 SD_SEND_OP_COND,用來告訴 SD 卡裝置端是否支援大容量的操作,並開始 SD 卡的內部初始化動作(對,SD 卡的控制器到這裡才開始初始化,前面其實只是 reset 及模式切換)。

依照我們前面的說明,ACMD41 其實就是先送一個 CMD55,再送一個 41 號的指令代碼,而在 ACMD41 的參數中,有一個位元叫做 HCS,如果這個 bit 為 1,就代表裝置支援 SDHC,否則就不支援。

ACMD41 的回應碼跟我們上一回介紹的 CMD0 一樣,是一個 byte 的 R1 格式,如果卡片還在執行內部的初始化,R1 回應中的 idle state 就會是 1,表示卡片還在忙碌,這時裝置只能重複發送 ACMD41,並檢查 R1 回應碼,知道 idle state 變為 0,才能繼續其它操作;而 R1 回應碼中的其他位元各自代表一些不同的錯誤,比方說指令錯誤、CRC 錯誤等,原則上只要是回應 R1 的指令,只要回應不是全部 0,就代表一定有問題,需要錯誤處理。

當卡片初始化完成,ACMD41 指令的 busy check 通過後,最後一個辨認指令是 CMD58,又叫做 READ_OCR;OCR 是 SD 卡內部的一個暫存器,它叫做 operation conditions register,總共有 32 個 bits:

(圖片來源:Bird 提供)

此時我們比較關心的就是 bit30 的 CCS:card capacity status,它告訴我們卡片到底是早期的 SD,還是開始支援大容量的 SDHC/SDXC。

在 SD 卡的標準文件中可以看到一張像這樣的流程圖:

(圖片來源:Bird 提供)

這張流程圖表示的是,利用我們前面提到的那些指令,將卡片設置進入 SPI 模式後,還可以區分出三種不同的卡片類型:

  • V1.x 的標準 SD 卡
  • V2.0 之後的標準容量 SD 卡
  • V2.0 之後的大容量 SD 卡(SDHC、SDXC)

知道卡片的容量之後,我們就可以準備來讀寫卡片的內容啦。

小結 #

這一回我們簡單說明了 SD 卡初始化之後,利用一些指令組合來辨認卡片的容量、電壓、版本等特性的流程。事實上由於SD卡經過十多年的演進,標準變得非常複雜,如果需要涵蓋從最舊到最新的標準,整個辨認過程會再複雜許多,但這邊就以最簡單的 SPI 模式下的版本及容量辨識為例,讓讀者對這個流程有個了解,有興趣深入研究的讀者可以查閱SD相關的標準文件。

下一回我們要來介紹讀取 SD 卡內容的方法。

(責任編輯:賴佩萱)

Powered by BetterDocs

Submit a Comment

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