數字IC驗證工程師
Overview
深入理解SD卡系列文章將介紹SD卡,涉及SD卡的協議及驅動程式碼。我們學習SD卡目的是為了理解SD卡的驅動程式碼,修改它,最終解決工作中遇到的SD卡相關的問題。本系列文章的目標是理解SD,包括協議和驅動程式碼。在學習任何裝置驅動時,有個東西我們是無法繞過的,那就是協議,本文講的就是SD卡的協議。
學習SD卡協議,可以讓我們更好的瞭解SD卡的運作機制。在最開始學習SD卡的時候,我們只需要對SD卡的協議有個大概瞭解,能基本滿足我們看懂SD卡驅動程式碼就行。如果之後在閱讀SD卡驅動程式碼有不理解的地方,可以回過頭來翻翻SD協議文件。建議在讀SD驅動原始碼和學習SD卡協議之間交替進行,互相驗證。
關於SD卡,有個叫SD卡協會的組織,這個組織規定了各種涉及SD卡的協議,併發布協議文件。這些SD卡協議文件,最重要的有兩種文件:SD Specifications Part 1 Physical Layer Simplified Specification 和SD Specifications Part A2 SD Host Controller Simplified Specification。
個人理解,定協議的目的就是為了使某個事物標準化,標準化後,可以方便大家協作,簡化工作量,提高效率,避免重複工作導致的浪費。Physical Layer Simplified Specification(以下簡稱:卡協議)規定了SD卡的物理規格和SD卡使用的命令協議,像Sandisk、Kingston這類SD卡製造商必須遵守該協議。假設Sandisk開發了一款SD卡沒有遵循該協議,而是自己內部新搞了一套協議,這樣市面上就沒有裝置能使用該款SD卡。除非有人專門開發一個驅動去適配該款SD卡,但是這樣很浪費人力。如果每個SD卡廠商都使用自己的協議,那麼每支援一款SD卡,都需要重新寫一套程式碼去適配它,那這工作量就很恐怖了。
類似的,SD Host Controller Simplified Specification(以下簡稱:主機協議)用來標準化SD主機控制器,針對的是SD卡主機控制器廠商。這個協議不是強制的,在我們閱讀SD驅動程式碼的時候,如果涉及到SD卡主機控制的程式碼,我們可能需要翻一下這篇文件,或者查閱SD卡主機控制器廠商提供給我們的文件(一般都是各大cpu晶片廠商提供給我們開發者文件)。
本文的講解的是卡協議,接下來,會有一些的英文夾雜在中文裡面,因為有些名詞,還是原汁原味的好,我翻譯出來,沒了那種韻味,水平有限,望大家諒解。
System Features
本大章節講解SD的一些基本特徵,包括SD卡的物理規格、容量、速度等方面。
Form-factor
目前市面上按物理規格來看,常見的SD卡有三種:
- 標準的SD卡,這種卡比較大,在有些相機或者PC電腦上會使用;
- 第二種是miniSD,這種卡我沒怎麼使用,不作詳述;
- 最後一種是叫TF卡,也稱mirco SD,這種卡比較小,是我們最常接觸的,像我們的手機裡面使用的就是這種卡。很多人基本上都管我們手機使用的那種卡叫SD卡,這樣的叫法實際上不夠準確,更準確應該是叫TF卡,但是不管怎樣,都沒人會去計較,能理解就行。
本文中,如果我說SD卡,都是泛指這三類SD卡,除非特意說明。並且如果特指,我會使用標準SD卡或者TF卡等名稱代替。
Capacity of Memory
SD卡按容量(Capacity)分類,可以分為標準容量卡、高容量卡,擴充套件容量卡,詳細如下:
- Standard Capacity SD Memory Card (SDSC): 這種卡容量小於等於2GB
- High Capacity SD Memory Card (SDHC): 這種卡容量大於2GB,小於等於32GB
- Extended Capacity SD Memory Card (SDXC):這種卡容量大於32GB, 小於等於2TB
如果你買了一張16G或者32G的SD卡,你會發現SD卡上面印有"HC"字樣,代表該卡是SDHC卡,同理,64G的SD卡上面印著"XC",表示SDXC卡。
Voltage range
SD卡按供電範圍劃分,分兩種:
- High Voltage SD Memory Card: 操作的電壓範圍在2.7-3.6V
- UHS-II SD Memory Card: 操作的電壓範圍VDD1: 2.7-3.6V, VDD2: 1.70-1.95V
UHS-II型別的卡參考協議文件: SD Specifications Part 1 UHS-II Simplified Addendum
Bus Speed Mode (using 4 parallel data lines)
SD卡按匯流排速度模式來分,有下面幾種:
- Default Speed mode: 3.3V供電模式,頻率上限25MHz,速度上限 12.5MB/sec
- High Speed mode: 3.3V供電模式,頻率上限50MHz,速度上限 25MB/sec
- SDR12: UHS-I卡, 1.8V供電模式,頻率上限25MHz,速度上限 12.5MB/sec
- SDR25: UHS-I卡, 1.8V供電模式,頻率上限50MHz,速度上限 25MB/sec
- SDR50: UHS-I卡, 1.8V供電模式,頻率上限100MHz,速度上限 50MB/sec
- SDR104: UHS-I卡, 1.8V供電模式,頻率上限208MHz,速度上限 104MB/sec
- DDR50: UHS-I卡, 1.8V供電模式,頻率上限50MHz,效能上限 50MB/sec
- UHS156: UHS-II RCLK Frequency Range 26MHz - 52MHz, up to 1.56Gbps per lane.
SDR(Single Date Rate), 一個週期只能採集一次資料,即一個bit,由於SD卡是4條資料線並行傳輸,所以一個週期能傳輸4bit,如果頻率是50MHz(即1秒傳輸次數為50 000 000),那麼1秒能傳輸的資料量為25MB(這裡1MB為1 000 000 Byte)。所以這就是為什麼各種SDR模式裡面,頻率上限是速度上限的兩倍。而對於DDR(Double Data Rate),在時鐘上升沿和下降沿都可以採集資料,也就是單一週期內可讀取或寫入2次,因此4條並行資料線在一個週期內能傳輸8bit。
Speed Class
SD卡按照讀寫效能劃分,有5種規格,每種規格後面的數字象徵最小的讀寫速度:
- Class 0 - 這種卡沒有效能要求
- Class 2 - 要求在 Default Speed mode 下,效能至少要達到(大於等於) 2MB/sec
- Class 4 - 要求在 Default Speed mode 下,效能至少要達到 4MB/sec
- Class 6 - 要求在 Default Speed mode 下,效能至少要達到 6MB/sec
- Class 10 - 要求在 High Speed mode 下,效能至少要達到 10MB/sec
廠商賣的SD卡上面基本上都會印著一個用圓圈包圍起來的數字10,表示該卡是Class 10 型別的卡。
Bus Protocol
在SD Bus上,有三種transaction:
- Command: 一個命令代表著將開始一個操作。命令通過CMD線傳輸,方向從host到card。
- Response: 響應是card對前一次host傳送的命令的執行情況的反饋。也是通過CMD線傳輸,方向從card到host。
- Data: 資料是通過4條data線傳輸的,方向可以從card到host,也可以從host到card。
不管Command,還是Response或者Data,都開始於一個start bit (bit值0),結束於一個end bit(bit值1)。
關於這塊的內容不做過多解釋了,詳情自行閱讀"Physical Layer Simplified Specification Version 4.10"文件 "3.6 Bus Protocl" 章節的內容。
Registers
下圖是SD卡的體系架構,可以看到內部包含了一系列的暫存器:
SD Memory Card Architecture
</div>
各個暫存器的詳細資訊如下:
SD Memory Card Registers
OCR register
OCR暫存器儲存著SD卡的工作電壓範圍。如果OCR暫存器的某位為1,表示卡支援該位對應的電壓。最後一位表示卡上電後的狀態(是否處於”忙狀態”),如果該位為0,表示忙,如果為1,表示處於空閒狀態。
OCR Register Definition
CID register
CID是一個128 bits的暫存器,該暫存器包含一個卡的標識資訊。
The CID Fields
CSD Register
卡的描述資料暫存器(CSD)包含了訪問該卡資料時的必要配置資訊,比如the data format, error correction type, maximum data access time, device size 等等。
The CSD Register Fields (CSD Version 2.0)
RCA register
卡的相對地址,該16位卡地址暫存器儲存了卡在識別過程中釋出的地址。該地址用於在主機識別卡後,利用該地址與卡進行通訊。該暫存器只有在SD模式下才有效。
SCR register
SD配置暫存器提供SD卡的特殊特性資訊,其大小為64位。該暫存器由廠商程式設計,主機不能對它進行程式設計。
The SCR Fields
UHS
UHS(Ultra High Speed)是與SDXC同時推出的SD卡匯流排標準。此標準適用於SDHC和SDXC。
UHS-I最高傳輸速度(理論值)為104MB/s。英文字母I代表該裝置(SD卡或讀卡器)支援UHS-I介面。英文字母U,包含數目字1,代表該裝置讀寫速度達U1。
UHS-II最高傳輸速度達312MB/s,是UHS-I的三倍。
裝置(如智慧手機)必須支援UHS,才能保證達到U1或U3最低寫入速度。
下面介紹UHS-I初始化的命令序列流程。
Command Sequence to Use UHS-I
- 上電後,卡會處於3.3V signaling模式下。第一個CMD0命令會選擇bus模式:SD模式或者SPI模式。只有在SD模式下,才能進入1.8V signaling模式。一旦卡進入1.8V signal模式,卡不能切換到SPI模式或者3.3V signal模式,除非重新上電。
- 收到CMD0命令後,卡將進入空閒狀態(Idle state),但是仍然工作在SDR12時序下。UHS-I只提供了SD模式,沒有提供SPI模式。
- 由於更高的匯流排速度需要低水平的signaling,對SDR50、DDR50和SDR104模式,UHS-I提供的signaling為1.8V。host會給卡提供3.3V的電壓,並且提供1.8V signaling水平的電壓給SDCLK、CMD和DAT[3:0]線,這幾個都是從3.3V的電源線轉換過來的。為了避免主機與卡之間的電壓不匹配,signaling水平在初始化時的電壓轉換序列中就已經被改變了。主機和卡通過ACMD41命令來確認雙方是否支援1.8V signaling模式。如果主機和卡都支援1.8V signaling模式,這就意味著UHS-I卡可用。
- UHS-I只能使用4-bit的bus模式,CMD42是個例外。如果卡被鎖住了,就需要通過傳送CMD42命令(1-bit模式)解鎖,然後傳送ACMD6命令將bus模式切換到4-bit。
- 在卡解鎖的情況下,CMD19命令執行在1.8V signaling的傳輸狀態。其他情況,CMD19都會被當做非法命令。
SD Memory Card Functional Description
對SD卡與主機(host)來說,有兩種操作模式:
- Card identification mode: 對卡reset重置後,主機進入卡識別模式,對卡來說,在reset後,除非收到CMD3命令,否則卡一直處於該模式下。
- Data transfer mode: 當卡第一次釋出它的RCA後,該卡將處於資料傳輸模式。而對主機來說,在它識別了bus線上的所有卡後,進入該模式。
Card identification mode
Operating Condition Validation
SD卡識別模式流程圖如下:
SD Memory Card State Diagram (card identification mode)
-
在主機與卡通訊之前,主機不清楚卡支援的電壓範圍,並且卡也不知道是否支援主機提供的供電電壓。主機會以預設電壓傳送一個reset指令(CMD0),並且主機預設卡能支援該命令。然後,為了確認電壓,主機接下來會發送一個CMD8命令。
-
為了驗證SD卡介面的操作條件,主機通過傳送SEND_IF_COND (CMD8)命令,去獲取SD卡支援的工作電壓範圍。SD卡通過檢測CMD8的引數部分來檢查主機使用的工作電壓,主機通過分析卡CMD8的response引數來確認SD卡是否可以在所給電壓下工作,如果SD卡可以在指定電壓下工作,則它的response裡面會包含cmd8引數裡面提供的電壓 。如果不支援所給電壓,則SD卡不會給出任何響應資訊,並繼續處於IDLE狀態。如果要初始化SDHC和SDXC,在第一次傳送ACMD41命令前,必須先發送CMD8。
-
SD_SEND_OP_COND (ACMD41)命令來識別或者拒絕不匹配host主機供電電壓範圍的卡。如果SD卡在主機規定的電壓範圍內不能實現資料傳輸,卡將放棄下一步的匯流排操作而進入不活動狀態(Inactive State)。
-
主機發送ACMD41命令時,可以通過將該命令所帶的OCR引數設定為0,用來查詢卡支援的工作電壓範圍。當ACMD41被用於查詢時,卡將忽略掉ACMD41裡面的HCS引數。主機在查詢到卡的工作電壓後,也許會將該電壓作為接下來發送的ACMD41命令的引數。
-
在整個初始化過程中,主機不允許改變正在操作的電壓範圍。
Card Initialization and Identification Process
Card Initialization and Identification Flow (SD mode)
-
當匯流排被激合後,主機就開始處理卡的初始化和識別。在主機發送SD_SEND_OP_COND(ACMD41)命令開始處理SD卡初始化時,主機會在ACMD41的引數中設定它的操作條件和設定OCR中的HCS位。HCS位被設定為1表示主機支援SDHC或者SDXC。HCS被設定為0表示主機不支援SDHC和SDXC。
-
卡利用OCR裡面的busy位來通知主機ACMD41的初始化已經完成。如果busy位為0,表示卡還在初始化,如果busy位為1,說明初始化已經完成。主機會在1s的時間內,重複不斷地傳送ACMD41命令,直到busy位被置1為止。卡只有在第一次收到設定電壓的ACMD41命令時,才會去檢查操作條件和OCR中的HCS位。並且在重複傳送ACMD41命令的這段時間裡,主機不應該傳送任何命令,除了CMD0。
-
如果卡能正確響應CMD8,之後,卡對ACMD41命令的響應會包含一個CCS欄位,CCS在卡返回ready時(busy位置1)有效。CCS=0表示卡是SDSC,CCS=1表示卡是SDHC或者SDXC。
-
在ACMD41之後,主機會發送 ALL_SEND_CID (CMD2),獲取卡的CID。在卡傳送它的CID之後,卡進入識別狀態(Identification State)。
-
接著,主機發送CMD3 (SEND_RELATIVE_ADDR),請求卡釋出卡的RCA。RCA是一個比CID短的,並且將來在資料傳輸模式中使用的地址。
Data Transfer Mode
因為一些卡在識別模式(Identification Mode)下,對操作頻率有限制,所以在識別模式結束前,主機的頻率需要一直保持在 fOD。在資料傳輸模式(Data Transfer Mode),主機頻率在fpp範圍內是可執行的。
主機必須傳送SEND_CSD(CMD9)來獲得卡規格資料暫存器(CSD)內容,獲取像塊大小、卡容量這類資訊。
SET_DSR(CMD4)廣播命令配置所有識別到的卡的驅動階段。它對DSR暫存器進行程式設計以適應應用的匯流排佈局(長度)、總線上卡的數目和資料傳輸頻率。clock rate也是在這個時候從fOD切到fpp。對卡和主機來說,SET_DSR(CMD4)命令是個可選。
CMD7用於選擇卡,並且將卡帶入傳輸狀態(Transfer State)。在同一個時間內,只有一張卡能進入傳輸狀態。當傳送的CMD7的RCA地址引數為"0x0000",所有卡將跳回到準備狀態(Stand-by State )。
SD卡資料傳輸模式的流程圖如下:
SD Memory Card State Diagram (data transfer mode)
對已經擁有RCA的卡來說,對它傳送identification commands(比如ACMD41、CMD2),它將不會有任何迴應。在資料傳輸模式下,主機與被選中的卡(使用定向命令)之間的資料傳輸都是點對點的。通過cmd線,所有定向命令(addressed commands)都會收到一個用於確認的response。
下面是資料傳輸模式下關於資料傳輸的一些總結:
- 在任何時候,所有的讀命令集在執行過程中都可以被stop command (CMD12)打斷。cmd12命令將會使資料傳輸終止,並且使卡退回到傳輸狀態(Transfer State)。讀命令集包括:block read(CMD17), multiple block read(CMD18), send write protect(CMD30), send SCR(ACMD51) 和 general command in read mode (CMD56)。
- 在任何時候,所有的寫命令集在執行過程中都可以被stop command (CMD12)打斷。寫命令集包括: block write(CMD24 and CMD25), program CSD(CMD27), lock/unlock command(CMD42)和general command in write mode(CMD56)。
- 一旦資料傳輸完成,卡就會退出資料寫狀態,並且進入正在程式設計狀態(Programming State)(傳輸成功),或者進入傳輸狀態(傳輸失敗)。
- 如果一個塊寫操作被打斷,但是最後一個block的塊長度和CRC有效的話,這塊資料也將會被程式設計到卡里。
- 卡也許會對塊寫操作提供快取,這意味著,在一個block還在被程式設計的情況下,下一個block可以被髮送這個卡里面。如果所有的寫快取都已經滿了的話,只要卡還在正在程式設計狀態,DAT0線就會一直保持在拉低狀態。
- 對寫CSD、防寫和擦除操作來說,卡不會提供快取。這意味著,在卡正忙於處理這其中任何一個命令時,卡不會接收任何傳送到卡的資料。只要卡還在忙,DAT0線就會拉低,並且處於正在程式設計狀態(Programming State)。
- 當卡正在程式設計時,不允許任何一個引數設定命令集(Parameter set commands)。引數設定命令集包括: set block length(CMD16), erase block start(CMD32)和erase block end(CMD33)。
- 當卡正在程式設計時,不允許任何一個讀命令集。
- 當將其他的卡從準備狀態(Stand-by)切換到傳輸狀態(使用CMD7),不會中斷當前卡的擦除或者程式設計操作。當前卡將會切換到斷開狀態(Disconnect State),並且釋放資料線。
- 當卡正在程式設計或者待程式設計時,對其重置(傳送CMD0或者CMD15),將會導致操作終止,並且可能會導致卡內的資料內容被破壞。因此主機有責任去禁止這樣的操作。
至此,本文關於SD卡協議的內容就介紹到這裡。通過本文,可以對SD卡有個大概的瞭解,尤其是關於SD卡初始化這段內容。就SD卡協議這方面來說,瞭解一些基本的東西就行。在我們今後在遇到SD問題時需要時,可以翻出來看一下。水平有限,有些地方可能會出現錯誤,望各位能指出來,希望能和各位共同探討技術方面的內容。
連結:https://www.jianshu.com/p/6272e4cb1eeb 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。