上一回 【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:
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏