SDIO 协议分析
http://blog.csdn.net/g_salamander/article/details/14167055
一、SD 存儲卡特性介紹
1、存儲容量
? ? a、標準容量SD存儲卡(SDSC): 不大于2GB
? ? b、大容量SD存儲卡(SDHC): 大于2GB、不大于32GB
? ? c、超大容量SD存儲卡(SDXC):大于32GB、不大于2TB
2、電壓范圍
? ? 高電壓SD存儲卡,電壓范圍為:2.7 ~ 3.6 V
3、SD 存儲卡可以用密碼保護(CMD42 - LOCK_UNLOCK)
4、標準 SD 存儲卡的厚度是 2.1mm 或者 1.4 mm
5、SD 存儲卡傳輸速度分類
? ? a、class-0: 這類卡片不指定性能
? ? b、class-2: 不低于 2MB / s
? ? c、class-4: 不低于 4MB / s
? ? d、class-6: 不低于 6MB / s
? ? e、class-10: 不低于 10MB / s
? ? * 大容量和超大容量 SD 存儲卡至少應該為 class-2
6、SD 存儲卡結構圖
? ??
引腳說明如下圖所示:
? ??
?
二、SD Bus
? ??1、Command: 命令是一次操作開始的令牌,從主機發送到一個卡片(編址命令)或者連接到主機的所有卡片(廣播命令)。命令的編碼格式如下圖所示:每個令牌都有一個起始位和結束位,總長度為48 bits,并且每個令牌都有 7 bits 的CRC?校驗碼。命令只能通過CMD 線傳輸,并且MSB?為先。
? ??
? ? 下面是?CMD8?的示意圖:
? ??
? ? * bit[40:45] - Command index 的內容就是 CMD 的編號
? ? * bit[8:39] - Command Argument 為每個命令自帶的參數
? ? *?Command?共分為12類(class0 - class11),在寄存器?CSD?中有 12 bits?CCC?(Card Command Class)對本卡支持的分類進行描述,基本命令(class-0)如下圖所示:
? ??
? ?
? ??2、Response:應答是卡片發回數據的令牌,響應主機之前發送的命令。應答的編碼格式如下圖所示:每個令牌都有一個起始位和結束位,總長度為48 bits?或者136 bits,有相應的 CRC 校驗碼。應答信號也只在 CMD 線上傳輸,并且 MSB 為先。
? ??
? ? * SD 存儲卡有?5 種類型的應答:R1、R1b、R2、R3、R6,SDIO?卡還支持另外兩種應答類型:R4、R5,除了 R3 其他類型的應答都有 CRC 校驗碼
? ? * R1 為通常命令的應答格式,如下圖所示
? ??
? ? * R6 為 CMD3 的專用應答格式,其中 Argument 字段的高 16 bits 為卡片新的相對地址,如下圖所示
? ??
? ??3、Data:數據通過 DATA 線雙向傳輸。數據傳輸有兩種模式:
? ? ? ??a、Usual data 模式:通常的數據以最低有效字節為先發送,在單個字節里面以最高有效位為先,示意圖如下:
? ? ? ??
? ? ? ??b、Wide width data 模式:最高有效位先傳輸,示意圖如下:
? ? ? ??
?
三、SD 存儲卡寄存器
每個 SD 存儲卡都有一組信息寄存器,如下圖所示:
其中?CID、OCR、CSD、SCR?存儲了卡片的具體信息,RCA、DSR?寄存器存儲了實際的配置參數。
1、OCR 寄存器
OCR (操作條件)寄存器中存儲了卡片的電壓信息以及部分狀態信息:其中一個狀態位(bit 31)指示卡片的上電操作是否完成,另外一個狀態位(bit 30)指示卡片的容量狀態(0代表SDSC、1代表SDHC或者SDXC)。寄存器的說明如下圖所示:
? ??
2、CID 寄存器
CID (識別信息)寄存器總共 128 bits,包含了卡片的識別信息,每個獨立的卡片都應該有一組獨一無二的識別信息。寄存器說明如下圖所示:
? ??
3、CSD 寄存器
CSD(具體信息)寄存器也是 128 bits,提供了訪問卡片內容的一些信息如:傳輸速率、數據格式、錯誤類型、最大是數據訪問時間、DSR 寄存器是否啟用的。其中 bit[126:127] 記錄了 CSD 的版本號,CSD version 1.0 為標準容量卡所用,CSD version 2.0 為大容量或超大容量卡所用。CSD version 1.0 寄存器說明如下圖所示:
? ??
4、SCR 寄存器
SCR(SD 配置)寄存器總共 64 bits,定義了卡片的一些特殊功能,寄存器說明如下圖所示:
? ??
5、CSR 寄存器
CSR(卡片狀態)寄存器總共 32bits,代表了執行一個命令的錯誤和狀態信息,其信息包含在?R1 格式的應答中返回給主機,寄存器說明如下圖所示:
? ??
? ??
6、SD Status 寄存器
SD Status 寄存器包含了 SD 存儲卡的的專有屬性并為以后的功能擴展保留了足夠的空間,其大小為?512bits?即一個塊大小,這個寄存器作為ACMD13命令的執行結果,通過DATA線發送到主機,寄存器說明如下圖所示:
? ??
?
四、SD 存儲卡功能描述
SD 卡有兩種操作模式:1、卡片識別模式,2、數據傳輸模式。所有的通信都是由主機控制的,即通過編址命令或者廣播命令。卡片在兩種模式之間的狀態轉換如下圖所示:
? ??
1、卡片識別模式
當主機復位所有卡片后將進入卡片識別模式,在識別模式下將會確認卡片的操作電壓并要求卡片發布自己的相對地址(默認地址為0x0000),在此操作模式下只會用到 CMD 線并且工作在專門的時鐘頻率 F-od(400 KHz)。識別模式的流程圖如下:
? ??
主機首先會發送?CMD8?去確定卡片的工作電壓:如果卡片不支持當前電壓(包含在 CMD8 參數里面),則不會返回并保持在空閑狀態;如果卡片能夠在當前電壓工作,則會返回卡片支持的電壓以及檢測圖案,還有相應的CRC 校驗碼。卡片的初始化將在主機發送ACMD41命令后開始,主機每間隔1秒就發送一次 ACMD41 命令,直到初始化完成(OCR 寄存器的 bit31 置位)。在主機發送的第一個 ACMD41?中應該包含主機支持的容量信息(HCS)和工作條件。如果主機請求 1.8V 的工作電壓(S18R = 1),并且卡片也支持(S18A = 1),則可以通過CMD11切換到 1.8V 的工作電壓。當初始化完成后,主機發送?CMD2命令獲取CID 寄存器信息,當卡片返回后主機接著發送CMD3命令要求卡片發布自己的相對地址,一旦主機接收到相對地址,卡片就進入等待狀態(這時候主機可以通過 CMD3 命令重復要求卡片發布相對地址)。ACMD41的示意圖如下所示:
? ??
它的應答格式如下(R3)圖所示:
? ??
2、數據傳輸模式
CMD7?用于選擇一個卡片進入傳輸模式,在同一時間只能有一個卡片處于傳輸模式。如果當前卡片與主機處于數據傳輸模式的連接狀態,新的 CMD7 命令中的RCA?[bit16 - bit31]?不是當前卡片的,則會釋放連接并且當前卡片進入等待狀態,然后連接新 RCA?的卡片。如果主機發送 CMD7 時,RCA = 0x0000,則所有的卡片都進入等待狀態。數據傳輸模式下的狀態轉換如下圖所示:
? ??
a、所有讀取數據的命令在任何時間都能被?CMD12?終止。讀取數據的命令包括:CMD17(讀取單塊數據)、CMD18(讀取多塊數據)、CMD30(讀取寫保護狀態位)、ACMD51(讀取 CSR 寄存器)、ACMD56。
b、所有寫入數據的命令在任何時間都能被 CMD12 終止。寫入數據的命令包括:CMD24(寫入單塊數據)、CMD25(寫入多塊數據)、CMD27(設置 CSD 寄存器)、CMD42(加鎖解鎖)、ACMD56。、
c、一旦數據傳輸完成,卡片將會馬上退出數據寫狀態并且切換到編程狀態(數據傳輸成功就寫入存儲介質)或者傳輸狀態(數據傳輸失敗)。
d、如果寫操作停止,塊長度和最后一塊的?CRC 校驗碼是有效的,數據將會被寫入存儲介質。
e、卡片支持寫緩存,這就意味著當前塊在進行編程操作時下一塊也可以進行傳輸。如果寫緩存滿了,卡片還是處在編程狀態,則卡片會將DATA0一直拉低(忙狀態)。
f、設置 CSD 寄存器時不提供緩存,也就是如果正在進行 CSD 設置,任何的數據傳輸命令都將被拒絕執行,DATA0 也會被一直拉低。
g、當卡片處于編程狀態時,讀命令和參數設置命令將不被執行。參數設置命令包括:CMD16(設置塊長度)、CMD32(設置擦除的起始塊數)、CMD33(設置擦除的結束塊數)。
h、CMD7 命令不會終止擦除和編程操作。
i、通過?CMD0?或者?CMD15?重置卡片時將會結束所有掛起或者正在進行的操作,這有可能會破壞卡片的數據,所以需要主機來保證安全。
j、CMD class10?的命令之間的狀態轉換由廠家自己定義。
?
3、數據讀寫流程
在卡片上電以及執行 CMD0 后為?1bit bus,寬總線(4bit bus)模式可以通過?ACMD6?命令設置,在設置時卡片必須處理傳輸模式而且沒有加鎖。容量大于 2GB 的卡片最大塊長度可能為?1024?字節,但是 CMD16 命令最大只支持?512?字節。
a、讀取數據
當總線上沒有數據傳輸時總線保持高電平,傳輸以低電平開始并以高電平結束,數據流包括有效數據和ECC值,一個 CRC 校驗碼將會被加入到每塊數據的末尾以確保傳輸的完整性。CMD17命令將會讀取一個塊的數據,塊的地址在命令的參數中列出(SDSC的地址以字節為單位,SDHC?和SDXC?的地址以塊 - 512bytes?為單位)。CMD18命令將會連續的讀取塊數據直到主機發送?CMD12?命令,CMD23?命令可以指定讀取的塊數。
b、寫入數據
寫數據流程和讀取數據流程類似。單塊寫入命令為?CMD24,多塊寫入命令為?CMD25。
c、擦除數據
擦除數據的流程和讀取多塊數據的流程類似。CMD32?命令指定擦除的開始塊,CMD33?命令指定擦除的結束塊,CMD38命令啟動擦除。如果將要擦除的塊是寫保護的則跳過。在擦除過程中DATA0保持低電平。在寫或者擦除的過程中可以通過CMD7命令去操作別的卡片。
d、加鎖解鎖
SD 存儲卡支持加鎖功能,密碼以及長度保存在?128bits?的?PWD?和?8bits?的?PWD_LEN?寄存器。被加鎖的卡片可以響應?class0?、CMD16、ACMD41、LOCK CARD(class7)命令,但是不能訪問數據。如果卡片被加鎖,則 PWD_LEN不為 0,卡片在上電后就會進入鎖定狀態。加鎖解鎖的命令為CMD42,該命令的數據塊格式如下圖所示:
? ??
*?ERASE:強制擦除操作,第 0 byte 的 bit3 需要置 1,并且其他位置 0。
*?LOCK_UNLOCK:1 = Lock the card,0 = Unlock the card。這個 bit 的操作需要和 SET_PWD 相同。
*?CLR_PWD:1 = 清除密碼。
*?SET_PWD:1 = 設置新密碼。
*?PWDS_LEN:定義了密碼的長度(bytes),如果改變密碼,則是新密碼和舊密碼的長度。
*?PWD:如果是新密碼,則保存的是新密碼。如果改變密碼,則保存的是新密碼和舊密碼。
應當在發送 CMD42 之前通過 CMD16 設置數據塊長度,而且數據塊長度應該不小于 CMD42 數據塊的長度。
總結
- 上一篇: 程序是在RAM里还是flash里执行
- 下一篇: 如何判断设备是上电复位还是软复位(主动调