Overview
深入理解SD卡系列文章將介紹SD卡厢汹,涉及SD卡的協(xié)議及驅(qū)動代碼蓖宦。我們學習SD卡目的是為了理解SD卡的驅(qū)動代碼,修改它斋荞,最終解決工作中遇到的SD卡相關(guān)的問題血久。本系列文章的目標是理解SD沧侥,包括協(xié)議和驅(qū)動代碼爸邢。在學習任何設(shè)備驅(qū)動時咏花,有個東西我們是無法繞過的龄恋,那就是協(xié)議疙驾,本文講的就是SD卡的協(xié)議。
學習SD卡協(xié)議郭毕,可以讓我們更好的了解SD卡的運作機制它碎。在最開始學習SD卡的時候,我們只需要對SD卡的協(xié)議有個大概了解,能基本滿足我們看懂SD卡驅(qū)動代碼就行扳肛。如果之后在閱讀SD卡驅(qū)動代碼有不理解的地方傻挂,可以回過頭來翻翻SD協(xié)議文檔。建議在讀SD驅(qū)動源碼和學習SD卡協(xié)議之間交替進行挖息,互相驗證金拒。
關(guān)于SD卡,有個叫SD卡協(xié)會的組織套腹,這個組織規(guī)定了各種涉及SD卡的協(xié)議绪抛,并發(fā)布協(xié)議文檔。這些SD卡協(xié)議文檔电禀,最重要的有兩種文檔:SD Specifications Part 1 Physical Layer Simplified Specification 和SD Specifications Part A2 SD Host Controller Simplified Specification幢码。
個人理解,定協(xié)議的目的就是為了使某個事物標準化鞭呕,標準化后蛤育,可以方便大家協(xié)作,簡化工作量葫松,提高效率瓦糕,避免重復工作導致的浪費。Physical Layer Simplified Specification(以下簡稱:卡協(xié)議)規(guī)定了SD卡的物理規(guī)格和SD卡使用的命令協(xié)議腋么,像Sandisk咕娄、Kingston這類SD卡制造商必須遵守該協(xié)議。假設(shè)Sandisk開發(fā)了一款SD卡沒有遵循該協(xié)議珊擂,而是自己內(nèi)部新搞了一套協(xié)議圣勒,這樣市面上就沒有設(shè)備能使用該款SD卡。除非有人專門開發(fā)一個驅(qū)動去適配該款SD卡摧扇,但是這樣很浪費人力圣贸。如果每個SD卡廠商都使用自己的協(xié)議,那么每支持一款SD卡扛稽,都需要重新寫一套代碼去適配它吁峻,那這工作量就很恐怖了。
類似的在张,SD Host Controller Simplified Specification(以下簡稱:主機協(xié)議)用來標準化SD主機控制器用含,針對的是SD卡主機控制器廠商。這個協(xié)議不是強制的帮匾,在我們閱讀SD驅(qū)動代碼的時候啄骇,如果涉及到SD卡主機控制的代碼,我們可能需要翻一下這篇文檔瘟斜,或者查閱SD卡主機控制器廠商提供給我們的文檔(一般都是各大cpu芯片廠商提供給我們開發(fā)者文檔)缸夹。
本文的講解的是卡協(xié)議痪寻,接下來,會有一些的英文夾雜在中文里面虽惭,因為有些名詞槽华,還是原汁原味的好,我翻譯出來趟妥,沒了那種韻味猫态,水平有限,望大家諒解披摄。
System Features
本大章節(jié)講解SD的一些基本特征亲雪,包括SD卡的物理規(guī)格、容量疚膊、速度等方面义辕。
Form-factor
目前市面上按物理規(guī)格來看,常見的SD卡有三種:
- 標準的SD卡寓盗,這種卡比較大灌砖,在有些相機或者PC電腦上會使用;
- 第二種是miniSD傀蚌,這種卡我沒怎么使用基显,不作詳述;
- 最后一種是叫TF卡善炫,也稱mirco SD撩幽,這種卡比較小,是我們最常接觸的箩艺,像我們的手機里面使用的就是這種卡窜醉。很多人基本上都管我們手機使用的那種卡叫SD卡,這樣的叫法實際上不夠準確艺谆,更準確應(yīng)該是叫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卡,你會發(fā)現(xiàn)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類型的卡參考協(xié)議文檔: 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), 一個周期只能采集一次數(shù)據(jù),即一個bit列林,由于SD卡是4條數(shù)據(jù)線并行傳輸瑞你,所以一個周期能傳輸4bit,如果頻率是50MHz(即1秒傳輸次數(shù)為50 000 000)希痴,那么1秒能傳輸?shù)臄?shù)據(jù)量為25MB(這里1MB為1 000 000 Byte)者甲。所以這就是為什么各種SDR模式里面,頻率上限是速度上限的兩倍砌创。而對于DDR(Double Data Rate)虏缸,在時鐘上升沿和下降沿都可以采集數(shù)據(jù)鲫懒,也就是單一周期內(nèi)可讀取或?qū)懭?次,因此4條并行數(shù)據(jù)線在一個周期內(nèi)能傳輸8bit刽辙。
Speed Class
SD卡按照讀寫性能劃分窥岩,有5種規(guī)格,每種規(guī)格后面的數(shù)字象征最小的讀寫速度:
- 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卡上面基本上都會印著一個用圓圈包圍起來的數(shù)字10疚鲤,表示該卡是Class 10 類型的卡。
Bus Protocol
在SD Bus上缘挑,有三種transaction:
- Command: 一個命令代表著將開始一個操作集歇。命令通過CMD線傳輸,方向從host到card语淘。
- Response: 響應(yīng)是card對前一次host發(fā)送的命令的執(zhí)行情況的反饋诲宇。也是通過CMD線傳輸,方向從card到host惶翻。
- Data: 數(shù)據(jù)是通過4條data線傳輸?shù)墓美叮较蚩梢詮腸ard到host,也可以從host到card吕粗。
不管Command纺荧,還是Response或者Data,都開始于一個start bit (bit值0)颅筋,結(jié)束于一個end bit(bit值1)宙暇。
關(guān)于這塊的內(nèi)容不做過多解釋了,詳情自行閱讀"Physical Layer Simplified Specification Version 4.10"文檔 "3.6 Bus Protocl" 章節(jié)的內(nèi)容议泵。
Registers
下圖是SD卡的體系架構(gòu)占贫,可以看到內(nèi)部包含了一系列的寄存器:
<div style="text-align:center" markdown="1">
</div>
各個寄存器的詳細信息如下:
OCR register
OCR寄存器保存著SD卡的工作電壓范圍。如果OCR寄存器的某位為1先口,表示卡支持該位對應(yīng)的電壓型奥。最后一位表示卡上電后的狀態(tài)(是否處于”忙狀態(tài)”),如果該位為0碉京,表示忙厢汹,如果為1,表示處于空閑狀態(tài)谐宙。
CID register
CID是一個128 bits的寄存器烫葬,該寄存器包含一個卡的標識信息。
CSD Register
卡的描述數(shù)據(jù)寄存器(CSD)包含了訪問該卡數(shù)據(jù)時的必要配置信息卧惜,比如the data format, error correction type, maximum data access time, device size 等等厘灼。
RCA register
卡的相對地址,該16位卡地址寄存器保存了卡在識別過程中發(fā)布的地址。該地址用于在主機識別卡后咽瓷,利用該地址與卡進行通信设凹。該寄存器只有在SD模式下才有效。
SCR register
SD配置寄存器提供SD卡的特殊特性信息茅姜,其大小為64位闪朱。該寄存器由廠商編程,主機不能對它進行編程钻洒。
UHS
UHS(Ultra High Speed)是與SDXC同時推出的SD卡總線標準奋姿。此標準適用于SDHC和SDXC。
UHS-I最高傳輸速度(理論值)為104MB/s素标。英文字母I代表該設(shè)備(SD卡或讀卡器)支持UHS-I接口称诗。英文字母U,包含數(shù)目字1头遭,代表該設(shè)備讀寫速度達U1寓免。
UHS-II最高傳輸速度達312MB/s,是UHS-I的三倍计维。
設(shè)備(如智能手機)必須支持UHS袜香,才能保證達到U1或U3最低寫入速度。
下面介紹UHS-I初始化的命令序列流程鲫惶。
- 上電后蜈首,卡會處于3.3V signaling模式下。第一個CMD0命令會選擇bus模式:SD模式或者SPI模式欠母。只有在SD模式下欢策,才能進入1.8V signaling模式。一旦卡進入1.8V signal模式赏淌,卡不能切換到SPI模式或者3.3V signal模式猬腰,除非重新上電。
- 收到CMD0命令后猜敢,卡將進入空閑狀態(tài)(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的電源線轉(zhuǎn)換過來的。為了避免主機與卡之間的電壓不匹配泞边,signaling水平在初始化時的電壓轉(zhuǎn)換序列中就已經(jīng)被改變了该押。主機和卡通過ACMD41命令來確認雙方是否支持1.8V signaling模式。如果主機和卡都支持1.8V signaling模式阵谚,這就意味著UHS-I卡可用蚕礼。
- UHS-I只能使用4-bit的bus模式,CMD42是個例外梢什。如果卡被鎖住了奠蹬,就需要通過發(fā)送CMD42命令(1-bit模式)解鎖,然后發(fā)送ACMD6命令將bus模式切換到4-bit嗡午。
- 在卡解鎖的情況下囤躁,CMD19命令執(zhí)行在1.8V signaling的傳輸狀態(tài)。其他情況荔睹,CMD19都會被當做非法命令割以。
SD Memory Card Functional Description
對SD卡與主機(host)來說,有兩種操作模式:
- Card identification mode: 對卡reset重置后应媚,主機進入卡識別模式严沥,對卡來說,在reset后中姜,除非收到CMD3命令消玄,否則卡一直處于該模式下。
- Data transfer mode: 當卡第一次發(fā)布它的RCA后丢胚,該卡將處于數(shù)據(jù)傳輸模式翩瓜。而對主機來說,在它識別了bus線上的所有卡后携龟,進入該模式兔跌。
Card identification mode
Operating Condition Validation
SD卡識別模式流程圖如下:
在主機與卡通信之前,主機不清楚卡支持的電壓范圍峡蟋,并且卡也不知道是否支持主機提供的供電電壓坟桅。主機會以默認電壓發(fā)送一個reset指令(CMD0),并且主機默認卡能支持該命令。然后蕊蝗,為了確認電壓仅乓,主機接下來會發(fā)送一個CMD8命令。
為了驗證SD卡接口的操作條件蓬戚,主機通過發(fā)送SEND_IF_COND (CMD8)命令夸楣,去獲取SD卡支持的工作電壓范圍。SD卡通過檢測CMD8的參數(shù)部分來檢查主機使用的工作電壓,主機通過分析卡CMD8的response參數(shù)來確認SD卡是否可以在所給電壓下工作豫喧,如果SD卡可以在指定電壓下工作石洗,則它的response里面會包含cmd8參數(shù)里面提供的電壓 。如果不支持所給電壓紧显,則SD卡不會給出任何響應(yīng)信息讲衫,并繼續(xù)處于IDLE狀態(tài)。如果要初始化SDHC和SDXC鸟妙,在第一次發(fā)送ACMD41命令前焦人,必須先發(fā)送CMD8挥吵。
SD_SEND_OP_COND (ACMD41)命令來識別或者拒絕不匹配host主機供電電壓范圍的卡重父。如果SD卡在主機規(guī)定的電壓范圍內(nèi)不能實現(xiàn)數(shù)據(jù)傳輸,卡將放棄下一步的總線操作而進入不活動狀態(tài)(Inactive State)忽匈。
主機發(fā)送ACMD41命令時房午,可以通過將該命令所帶的OCR參數(shù)設(shè)置為0,用來查詢卡支持的工作電壓范圍丹允。當ACMD41被用于查詢時郭厌,卡將忽略掉ACMD41里面的HCS參數(shù)。主機在查詢到卡的工作電壓后雕蔽,也許會將該電壓作為接下來發(fā)送的ACMD41命令的參數(shù)折柠。
在整個初始化過程中,主機不允許改變正在操作的電壓范圍批狐。
Card Initialization and Identification Process
當總線被激合后扇售,主機就開始處理卡的初始化和識別。在主機發(fā)送SD_SEND_OP_COND(ACMD41)命令開始處理SD卡初始化時嚣艇,主機會在ACMD41的參數(shù)中設(shè)置它的操作條件和設(shè)置OCR中的HCS位承冰。HCS位被設(shè)置為1表示主機支持SDHC或者SDXC。HCS被設(shè)置為0表示主機不支持SDHC和SDXC食零。
卡利用OCR里面的busy位來通知主機ACMD41的初始化已經(jīng)完成困乒。如果busy位為0,表示卡還在初始化贰谣,如果busy位為1娜搂,說明初始化已經(jīng)完成。主機會在1s的時間內(nèi)吱抚,重復不斷地發(fā)送ACMD41命令涌攻,直到busy位被置1為止∑瞪耍卡只有在第一次收到設(shè)置電壓的ACMD41命令時恳谎,才會去檢查操作條件和OCR中的HCS位。并且在重復發(fā)送ACMD41命令的這段時間里,主機不應(yīng)該發(fā)送任何命令因痛,除了CMD0婚苹。
如果卡能正確響應(yīng)CMD8,之后鸵膏,卡對ACMD41命令的響應(yīng)會包含一個CCS字段膊升,CCS在卡返回ready時(busy位置1)有效。CCS=0表示卡是SDSC谭企,CCS=1表示卡是SDHC或者SDXC廓译。
在ACMD41之后,主機會發(fā)送 ALL_SEND_CID (CMD2)债查,獲取卡的CID非区。在卡發(fā)送它的CID之后,卡進入識別狀態(tài)(Identification State)盹廷。
接著征绸,主機發(fā)送CMD3 (SEND_RELATIVE_ADDR),請求卡發(fā)布卡的RCA俄占。RCA是一個比CID短的管怠,并且將來在數(shù)據(jù)傳輸模式中使用的地址。
Data Transfer Mode
因為一些卡在識別模式(Identification Mode)下缸榄,對操作頻率有限制渤弛,所以在識別模式結(jié)束前,主機的頻率需要一直保持在 fOD甚带。在數(shù)據(jù)傳輸模式(Data Transfer Mode)她肯,主機頻率在fpp范圍內(nèi)是可執(zhí)行的。
主機必須發(fā)送SEND_CSD(CMD9)來獲得卡規(guī)格數(shù)據(jù)寄存器(CSD)內(nèi)容欲低,獲取像塊大小辕宏、卡容量這類信息。
SET_DSR(CMD4)廣播命令配置所有識別到的卡的驅(qū)動階段砾莱。它對DSR寄存器進行編程以適應(yīng)應(yīng)用的總線布局(長度)瑞筐、總線上卡的數(shù)目和數(shù)據(jù)傳輸頻率。clock rate也是在這個時候從fOD切到fpp腊瑟。對卡和主機來說聚假,SET_DSR(CMD4)命令是個可選。
CMD7用于選擇卡闰非,并且將卡帶入傳輸狀態(tài)(Transfer State)膘格。在同一個時間內(nèi),只有一張卡能進入傳輸狀態(tài)财松。當發(fā)送的CMD7的RCA地址參數(shù)為"0x0000"瘪贱,所有卡將跳回到準備狀態(tài)(Stand-by State )纱控。
SD卡數(shù)據(jù)傳輸模式的流程圖如下:
對已經(jīng)擁有RCA的卡來說,對它發(fā)送identification commands(比如ACMD41菜秦、CMD2)甜害,它將不會有任何回應(yīng)。在數(shù)據(jù)傳輸模式下球昨,主機與被選中的卡(使用定向命令)之間的數(shù)據(jù)傳輸都是點對點的尔店。通過cmd線,所有定向命令(addressed commands)都會收到一個用于確認的response主慰。
下面是數(shù)據(jù)傳輸模式下關(guān)于數(shù)據(jù)傳輸?shù)囊恍┛偨Y(jié):
- 在任何時候嚣州,所有的讀命令集在執(zhí)行過程中都可以被stop command (CMD12)打斷。cmd12命令將會使數(shù)據(jù)傳輸終止共螺,并且使卡退回到傳輸狀態(tài)(Transfer State)该肴。讀命令集包括:block read(CMD17), multiple block read(CMD18), send write protect(CMD30), send SCR(ACMD51) 和 general command in read mode (CMD56)。
- 在任何時候璃谨,所有的寫命令集在執(zhí)行過程中都可以被stop command (CMD12)打斷沙庐。寫命令集包括: block write(CMD24 and CMD25), program CSD(CMD27), lock/unlock command(CMD42)和general command in write mode(CMD56)鲤妥。
- 一旦數(shù)據(jù)傳輸完成佳吞,卡就會退出數(shù)據(jù)寫狀態(tài),并且進入正在編程狀態(tài)(Programming State)(傳輸成功)棉安,或者進入傳輸狀態(tài)(傳輸失數装狻)。
- 如果一個塊寫操作被打斷贡耽,但是最后一個block的塊長度和CRC有效的話衷模,這塊數(shù)據(jù)也將會被編程到卡里。
- 卡也許會對塊寫操作提供緩存蒲赂,這意味著阱冶,在一個block還在被編程的情況下,下一個block可以被發(fā)送這個卡里面滥嘴。如果所有的寫緩存都已經(jīng)滿了的話木蹬,只要卡還在正在編程狀態(tài),DAT0線就會一直保持在拉低狀態(tài)若皱。
- 對寫CSD镊叁、寫保護和擦除操作來說,卡不會提供緩存走触。這意味著晦譬,在卡正忙于處理這其中任何一個命令時,卡不會接收任何發(fā)送到卡的數(shù)據(jù)互广。只要卡還在忙敛腌,DAT0線就會拉低,并且處于正在編程狀態(tài)(Programming State)。
- 當卡正在編程時像樊,不允許任何一個參數(shù)設(shè)置命令集(Parameter set commands)夸溶。參數(shù)設(shè)置命令集包括: set block length(CMD16), erase block start(CMD32)和erase block end(CMD33)。
- 當卡正在編程時凶硅,不允許任何一個讀命令集缝裁。
- 當將其他的卡從準備狀態(tài)(Stand-by)切換到傳輸狀態(tài)(使用CMD7),不會中斷當前卡的擦除或者編程操作足绅。當前卡將會切換到斷開狀態(tài)(Disconnect State)捷绑,并且釋放數(shù)據(jù)線。
- 當卡正在編程或者待編程時氢妈,對其重置(發(fā)送CMD0或者CMD15)粹污,將會導致操作終止,并且可能會導致卡內(nèi)的數(shù)據(jù)內(nèi)容被破壞首量。因此主機有責任去禁止這樣的操作壮吩。
至此,本文關(guān)于SD卡協(xié)議的內(nèi)容就介紹到這里加缘。通過本文鸭叙,可以對SD卡有個大概的了解,尤其是關(guān)于SD卡初始化這段內(nèi)容拣宏。就SD卡協(xié)議這方面來說沈贝,了解一些基本的東西就行。在我們今后在遇到SD問題時需要時勋乾,可以翻出來看一下宋下。水平有限,有些地方可能會出現(xiàn)錯誤辑莫,望各位能指出來学歧,希望能和各位共同探討技術(shù)方面的內(nèi)容。