SD卡開發詳細文檔

1、簡介  

SD卡是基於flash的存儲卡。 
SD卡和MMC卡的區別在於初始化過程不同。 
SD卡的通信協議包括SD總線和SPI兩類。 
SD卡使用卡內智能控制模塊進行FLASH操作控制,包括協議、安全算法、數據存取、ECC算法、缺陷處理和分析、電源管理、時鐘管理。
通信電壓範圍:2.0-3.6V;工作電壓範圍:2.0-3.6V
最大讀寫速率:10Mbyte/s  
最大10 個堆疊的卡(20MHz,Vcc=2.7-3.6V)
 
 
2:卡類型
MMC卡: MultiMedia card,有 7 個觸點( 引腳),分爲兩種操作模式,分別爲 MMC模式與SPI 模式,兩種模式對引腳的定義是不同的。SPI 模式只有 Host 具有SPI 接口時才能使用。MMC只具有存儲功能,不像SD卡還具有加密功能。
SD卡: Security Digtial card,共有9 個觸點( 引腳),多餘的 2 個引腳爲數據線,但使用與 MMC卡兼容的模式時,這兩個多餘的引腳沒有起到作用。SD卡除了存儲功能外,還有一種加密功能,但加密功能是收費的(所以開源的linux中只包含mmc的驅動目錄),因爲當初SD卡聯盟中(索尼)就是發明這種卡就是用來存儲音樂(淘汰卡帶),並使用加密特性,防止拷貝。

TF卡:軟件上SD卡一致,只是在硬件的體積上比SD卡西小,所以市場上很多的TF卡的SD外形卡套
SDIO卡: 這種卡並不是存儲卡,可以理解爲一個SDIO接口卡,如WIFI(SDIO接口);並非memory卡,故名思意,
就是輸入/ 輸出卡,這種卡有用於 LAN的、也有用於藍牙的。

3、SD卡協議

1.x:小於2GB的卡(但通過相關的軟件,可以模擬實現大於2GB)

2.0: 2<SD卡<32 GB

3.0: >32GB

4、SD卡通信接口

SD卡有9個pin:1個VDD,2個VSS(GND),CLK,CMD,DATA0-DATA3, 【DATA3可以作爲卡檢測腳】

SD卡可以使用SD總線接口,也可以使用SPI通信接口;

SD總線接口描述:

CMD:Command is a bi-directional signal. (Host and card drivers are operating in push pull mode.) 【命令與響應都是走這條線】

DAT0-3:Data lines are bi-directional signals. (Host and card drivers are operating in push pull mode.) 【真正的數據走這幾條線,數據位是可以配置:1~4】

CLK:Clock is a host to cards signal. (CLK operates in push pull mode.) 

VDD:VDD is the power supply line for all cards. 

VSS[1:2]:VSS are two ground lines. 

SPI接口描述:

CS:Host to card Chip Select signal.

CLK:Host to card clock signal. 

DataIn:Host to card data signal. 

DataOut:Card to host data signal. 

5、SD卡內部結構

Each card has a set of information registers 
The RCA register is not available in SPI Mode. 
OCR: 卡操作電壓寄存器 32位, 只讀,每隔0.1V佔1位, 第31位卡上電過程是否完成
CID: 卡身份識別寄存器 128bit,只讀, 廠家號,產品號,串號,生產日期
SCR: 卡配置寄存器, 可寫的 64bit 是否用Security特性(LINUX不支持),以及數據位寬(1bit或4bit)
RCA: 卡地址寄存器: 可寫的 16bit SD host和卡進行協商的一個地址,內核中會在代碼裏面記錄這個地址,卡這      邊則寫到RCA寄存器
CSD: 卡專有數據寄存器 部分可讀寫 128bit, 卡容量,最大傳輸速率,讀寫操作的最大電流、電壓,讀寫擦出塊的最大長度等
 
The host may reset the cards by switching the power supply off and on again. The card has its own power-on detection circuitry which puts the card into an idle state after the power-on. The card can also be reset by sending the GO_IDLE (CMD0) command.
 
5、SD卡上電過程

上電初始化需要1ms或者74 CLOCK(SD卡的clock,400KHZ)兩者大致,SD卡的電壓上到2.0V,SD卡開始工作,此時支持的命令非常有限(其中最主要支持ACMD41命令,sd host問卡的操作電壓時多少? 卡就會從它的OCR寄存器裏面讀出SD卡出廠就燒錄在裏面的卡的操作電壓值返回給sd host),當電壓調整到它要求的VDD時候(SD卡的工作電壓在2.7~3.6V,常見3.3V),同時SD的CLK從400KHZ調整到更高頻率(比如25MHZ),這時卡就完全正常的工作了。接下來可以去獲取卡的生產廠家,容量等信息。

6、SD卡的命令和響應以及數據傳送的格式

MMC/SD通過發命令的方式來實現卡的初始化和數據訪問

卡尋址通過會話地址方式實現,地址在初始化的時候分配給卡。SD 總線上
的基本操作是command/response。 
數據傳送採用塊方式,數據塊後接CRC 校驗位,操作包括單數據塊和多數據
塊。多數據塊更適合快速寫操作,多數據塊傳輸當在 CMD 線出現停止命令時結束。
數據傳輸可以在主機端設置採用單數據線或多數據線方式。 
塊寫操作在DAT0 數據線寫操作期間使用忙信號,無論用來傳輸的信號線數
目是多少。

命令:通過CMD線
 
響應:通過CMD線
數據:通過4條數據線

最多支持64個命令: CMD0~CMD63,(其中CMD57~63是保留的)
ACMD: Application Sepcific command:
ACMD41 =cmd55 + cmd41,組合命令,CMD55是前導命令,提醒卡後面的CMD41是一個特殊的命令
命令的類型

廣播命令(bc,bcr)——廣播命令發送給所有SD卡,有些命令需要響應。 

尋址(點對點)命令

(ac,adtc)

——

尋址命令只發送給具有相應地址的卡,並

需要從卡返回一個響應。

Broadcast Commands ( bc), no response
The broadcast feature is applicable only if all the CMD linesare connected together in the host. If they are separated then each card will accept it separately on histurn.
Broadcast Commands with Response (bcr )
response from all cards simultaneously. Since there is no Open Drain mode in SD Card, this type of command is used only if all the CMD lines are separated.The command will be accepted and responded to by every card separately.
Addressed (point-to-point) Commands (ac )
no data transfer on DAT.
Addressed (point-to-point) Data Transfer Commands (adtc)
data transfer on DAT.

響應:
R1 (standard response): response length 48 bit
R1b is identical to R1 with an optional busy signal transmitted on the data line
R2 (CID, CSD register): response length 136 bits. The content of the CID register is sent as a response toCMD2 and CMD10. The content of the CSD register is sentas a response toCMD9.
R3 (OCR register): response length 48 bits. The contents of the OCR register are sent as a response toACMD41.
R4~R5: responses are not supported.
R6:(Published RCA response): code length 48-bit, response toCMD3


7、SD卡的狀態


 

8、SD卡的操作模式

對卡而言也有兩類操作:
卡識別模式——在重置(reset)後當主機查找總線上的新卡時,處
於卡識別模式。重置後SD卡將始終處於該模式,直到收到
SEND_RCA命令(CMD3)。 
數據傳輸模式—一旦卡的REC發佈後,將進入數據傳輸模式。主機一旦識別了所有總線上的卡後,將進入數據傳輸模式。 
卡識別模式


   GO_IDLE_STATE(CMD0)是軟件重置命令,設置每個SD卡進入Idle狀態。處於Inactive狀態的卡不受此命令影響。主機上電後,所有SD卡進入Idle狀態,包括處於Inactive狀態的卡。至少74個時鐘週期後才能開始總線傳輸。上電或CMD0(重置)後,所有SD卡的命令線處於輸入模式,等待下一個命令的起始位。卡通過一個默認的相對卡地址RCA(RCA=0x0000)和默認驅動寄存器設置(最低速,最高驅動電流)初始化。
   SD的物理規範標準要求所有SD卡能通過最小和最大供電電壓間的任何電壓和主機建立通信。然而,數據傳輸時的最小和最大電壓值在操作條件寄存器OCR中定義,可能並不能覆蓋所有的電壓範圍。SD卡主機希望通過讀取卡的OCR寄存器獲取合適的電壓值或彈出卡。
    在識別時鐘速率fOD下主機開始卡識別過程。SD卡的CMD線輸出驅動是push-pull驅動。 總線激活後,主機要求卡發送它們的有效操作條件(ACMD41 preceding with APP_CMD—CMD55 with RCA=0x0000)。ACMD41命令的響應是卡的操作條件寄存器。相同的命令將發送給系統中所有的卡。不兼容的卡將進入Inactive狀態。主機然後發送命令ALL_SEND_CID(CMD2)到每個卡以獲取每個卡的唯一標識CID號。未識別的卡通過CMD線發送CID號作爲響應。當卡發送CID號後,進入識別狀態(Identification State)。此後,主機發送CMD3(SEND_RELATIVE_ADDR)要求卡發佈一個新的相對卡地址RCA,地址比CID短,在以後的數據傳輸模式中用來尋址卡。一旦獲得RCA後,卡狀態變成就緒狀態(Stand-by state)。此時,如果主機要求卡換成其他的RCA號,可以通過發送另一個SEND_RELATIVE_ADDR命令給卡,要求發佈一個新的RCA,最後發佈的RCA是實際使用的RCA。主機對系統中的每個卡重複識別過程。 所有的SD卡初始化完以後,系統將開始初始化MMC卡(如果有的話),使用MMC卡的CMD2和CMD3。

                                     數據傳輸模式
   直到主機知道所有CSD寄存器的內容,fpp 時鐘速率必須保持在fOD,因爲
一些卡有操作頻率限制。主機發送SEND_CSD(CMD9)獲取卡定義數據(Card 
Specific Data,CSD寄存器),如塊大小、卡存儲容量、最大時鐘速率等。 
    CMD7用來選擇一個卡並將它置於傳輸狀態(Transfer state),在任何時間只能有一個卡處於傳輸狀態。如果已有一個卡處於傳輸狀態,它和主機的連接將釋放,並返回到Stand-by狀態。
    當CMD7以保留相對地址“0x0000”發送時,所有卡將返回到Stand-by狀態。這可以用來識別新的卡而不重置其他已註冊的卡。在這種狀態下已有一個RCA地址的卡不響應識別命令(ACMD41,CMD2,CMD3)。 
  注意:當卡接收到一個帶有不匹配RCA的CMD7時,卡將取消選中。在公用CMD線時,選中一個卡時將自動不選中其他卡。
   因此,在SD卡系統中,主機具有如下功能:
初始化完成後,在公用CMD線時,不選中卡是自動完成的。
如果使用單獨的CMD線,需要關注不選中卡的操作
在主機和選擇的SD卡之間的所有數據通信是點對點的方式。所有尋址命令都需要響應。 
不同數據傳輸模式的關係如圖4-8所示,使用如下步驟: 
所有讀數據命令可以在任何時候通過停止命令(stop command,CMD12)中止。數據傳輸將中止,卡回到傳輸狀態(Transfer State)。讀命令有:塊讀命令(CMD17),多塊讀命令(CMD18),發送讀保護(CMD30),
發送scr(ACMD51),以及讀模式的通用命令(CMD56)。
所有寫數據命令可以在任何時候通過停止命令(stop command,CMD12)中止。在不選中卡命令CMD7前寫命令必須停止。寫命令有:塊寫命令 (CMD24 and CMD25),  寫CID (CMD26), 寫CSD(CMD27), lock/unlock 
命令(CMD42) 以及寫模式通用命令(CMD56)。 
一旦數據傳輸完成,卡將退出數據寫狀態並進入Programming State(傳輸成功)或Transfer State(傳輸失敗)。 
如果一個快寫操作停止,而且最後一塊塊長度和CRC是有效的,那麼數據可以被操作(programmed)。 
卡可能提供塊寫緩衝。這意味着在前一塊數據被操作時,下一塊數據可以傳送給卡。如果所有卡寫緩衝已滿,只要卡在Programming State,DAT0將保持低電平(BUSY)。 
寫CSD、CID、寫保護和擦除時沒有緩衝。這表明在卡因這些命令而處於忙時,不再接收其他數據傳輸命令。在卡忙時DAT0保持低電平,並處於Programming State。實際上如果CMD和DAT0線分離,而且主機佔有的忙DAT0線和其他DAT0線分開,那麼在卡忙時,主機可以訪問其他卡。 
在卡被編程(programming)時,禁止參數設置命令。參數設置命令包括:設置塊長度(CMD16),擦除塊開始(CMD32)和擦除塊結束(CMD33)。 
   卡在操作時不允許讀命令。 
   使用CMD7指令把另一個卡從Stand-by狀態轉移到Transfer狀態不會中止擦除和編程(programming)操作。卡將切換到Disconnect狀態並釋放DAT線。 
使用CMD7指令可以不選中處於Disconnect狀態的卡。卡將進入Programming狀態,重新激活忙指示。 
使用CMD0或CMD15重置卡將中止所有掛起和活動的編程(programming)操作。這可能會破壞卡上的數據內容,需要主機保證避免這樣的操作。


9、SD卡是否選擇寬總線選擇

   寬總線(4位總線寬度)操作模式通過ACMD6選擇和不選擇。在上電後或GO_IDLE(CMD0)命令後默認的總線寬度是1位。ACMD6命令只在“tran state”有效,即只有在卡選中後(CMD7)總線寬度才能修改
 

10、SD卡讀數據格式

   DAT總線在沒有數據傳輸時處於高電平。一個傳輸數據塊包含一個起始位(LOW),接着連續的數據流。數據流包含有效數據(如果使用了ECC了還包括錯誤糾正位)。數據流以一個結束位(HIGH)結束。數據傳輸和時鐘信號同步。 
  以塊傳輸的有效數據包含CRC校驗和。產生多項式是標準CCITT 多項式。 採用了縮短的BCH碼,d=4,有效數據長度最長爲2048字節。CRC校驗和對每個DAT線單獨計算並附加在每個數據塊後。在寬總線模式操作
(DAT0-DAT3)中,16位的CRC校驗對每個DAT分別計算。 
  數據塊讀: 傳輸的基本單位是數據塊,最大尺寸在CSD中定義(READ_BL_LEN)。開始和結束地址完全包含在一個物理數據快(如READ_BL_LEN定義)中的較小的塊也可以傳遞。CRC附加在每個數據塊的尾部用來保證數據傳輸的完整性。CMD17(READ_SINGLE_BLOCK)開始一個塊讀操作,然後傳輸完成後進入Transfer狀態。CMD18(READ_MULTIPLE_BLOCK)開始連續的塊傳輸,直到停止命令。停止命令有一個執行延遲。在停止命令最後一位發送完以後數據傳輸停止。 如果主機使用累計長度不是塊對齊的部分塊,在第一個不對齊塊的開始,卡會發現一個塊未對齊錯誤,在狀態寄存器中設置ADDRESS_ERR錯誤,中止傳輸並等待(在Data狀態)停止命令。


11、SD卡寫數據格式

 
數據寫傳輸格式類似於讀格式。對於以塊爲單位的寫數據傳輸,CRC檢驗
位附加到每個數據塊。卡的每根數據線在接收到數據並在寫操作前,執行CRC
校驗。 
數據塊寫 
數據塊寫(CMD24-27,42,56(W)),一個或多個數據塊從主機發送給卡,主機
在每個數據塊後附加CRC校驗。數據塊長度WRITE_BL_LEN(512B)。如果
CRC校驗失敗,卡將在DAT數據線上指示錯誤。傳輸的數據將被拋棄,而且後
續傳輸的數據塊(在多數據塊寫模式)也都會被忽略。 
多數據塊寫命令比連續的單數據塊寫命令速度快。不允許部分塊寫(小於
512B)。 
當主機試圖在寫保護區域寫數據時寫操作將中止。在這種情況下,卡在狀態
寄存器設置WP_VIOLATION位,並忽略所有後續數據傳輸,並在Receive-data
狀態下等待停止命令。 
對CID和CSD寄存器進行編程操作不需要實現設置塊長度,傳輸的數據也
是CRC保護的。如果CSD或CID寄存器一部分存儲於ROM中,那麼不可改變
部分必須和接收緩衝中的相應部分內容保持一致。如果匹配失敗,卡將報告一個
錯誤,而且不改變任何寄存器內容。 
接收到一個數據塊並完成CRC校驗後,卡將開始寫,如果寫緩衝滿而且不
能從一個新的WRITE_BLOCK命令接收新數據時,  DAT0 線保持爲低電平。任
何時候主機都可以通過SEND_STATUS(CMD13)命令獲取卡的狀態。狀態位
READY_FOR_DATA指示卡是否可以接收新數據或寫操作還在進行中。主機通
過CMD7(選中另一個卡)不選中卡,這個操作可以把卡的狀態編程Disconnect
並釋放DAT線而不中斷寫操作。當不選中卡時,如果編程還在進行而且寫緩衝
不可用時,將通過下拉DAT爲低電平來重新激活忙信號。實際上,主機通過
interleaving可以實現多個卡同時寫操作,interleaving過程可以通過在卡忙時訪問
其他卡實現。 
預擦除設置優先於多數據塊寫操作 
設置多個寫數據塊的預擦除(ACMD23)可以使得接下來的多個數據塊寫操
作比沒有預先執行ACMD23的相同操作更快。主機可以通過該命令設置多少個
數據塊將在接下來的寫操作中發送。如果在所有數據塊發送給卡時中止了寫操作
(使用停止傳輸命令),殘餘寫數據塊的內容(指要寫入新內容的數據塊?)將變
得不確定(可能已擦除或還是原來的數據)。如果主機發送了超過ACMD23中
定義的數據塊數目的數據,卡將逐個擦除數據塊(在收到新數據時)。多數據塊
寫操作完成後值將重新設置爲默認值1。 
建議在CMD25命令前使用該命令以加速寫操作。如果需要預擦除主機在寫
命令前發送ACMD23。如果不發送ACMD23命令,設置的預擦除數將在其他指
令執行時自動清除。 
發送寫數據塊數目 
系統使用管道機制進行數據緩衝管理,有時候在多數據塊寫操作過程中發生
錯誤,使得無法確定哪一個數據塊是最後成功寫入的數據塊。卡可以把正常寫入
的數據塊數(the number of well-written blocks)作爲對命令ACMD22的響應。 
擦除 
同時擦除多個寫數據塊可以提高數據吞吐量。通過
ERASE_WR_BLK_START(CMD32)和ERASE_WR_BLK_END(CMD33)實現寫
數據塊的識別。 
主機必須嚴格按照下列的命令操作順序:ERASE_WR_BLK_START,
RASE_WR_BLK_END,and ERASE (CMD38)。 
如果不按順序接收到擦除指令(CMD38)或地址設置指令(CMD32,33),
卡將在狀態寄存器中設置ERASE_SEQ_ERROR位,並重置整個順序(sequence)。 
如果接收到一個不順序的命令(除了SEND_STATUS),卡將在狀態寄存
器設置ERASE_RESET狀態位,重置擦除順序和執行最後的命令。 
如果擦除範圍包括寫保護扇區,將不被擦除,擦除命令只擦除無保護的扇區。
狀態寄存器的WP_ERASE_SKIP位將設置。 
地址設置命令中的地址是以字節爲單位的塊寫地址。卡將忽略所有小於
WRITE_BLK_LEN(CSD)LSB(最低有效位)。 
如上所述的塊寫操作,卡通過保持DAT0爲低電平指示擦除操作正在進行中。
實際的擦除操作時間可能會很長,主機可以通過CMD7不選中卡或執行卡斷開
操作。 
卡上擦除操作後的數據爲“0”或“1”,由卡製造商確定。SCR寄存器的
DATA_STAT_AFTER_ERASE(bit55)定義了是“0”或“1”。
發佈了32 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章