李文華,龔 宸
(1.湖北仙桃職業學院機械電子工程學院,湖北 仙桃 433000; 2. 華中師范大學計算機與科學系,湖北 武漢 430000)
高容量安全數字卡廣泛應用在含有視頻功能的嵌入式系統[1]、筆記本電腦中,對高容量安全數字卡的訪問控制成為研究的熱點.在含有視頻拍攝功能的嵌入式系統中,常用SD卡 (Secure Digital Card——安全數字卡)保存系統拍攝的視頻,以便用計算機進一步處理嵌入式系統中所拍攝到的數據.隨著拍攝時間的增加和拍攝功能的增強,選用最高容量不超過2 GB的SDSC卡(Standard Capacity Secure Digital Card——標準容量安全數字卡)很難滿足系統對存儲卡的容量要求,客觀上需要嵌入式系統選用容量為4GB~32GB的SDHC卡(High Capacity Secure Digital Card——高容量安全數字卡).SDHC卡是近來按Ver2.0規范生產的SD卡,與按Ver1.1規范生產的SDSC卡存在較大的差異,為了解決嵌入式系統中高容量SD卡的訪問控制問題,本文從應用的角度出發,以MC9S12XS12單片機控制Apaccr(宇瞻)4GB的SD卡為例,詳細地討論SDHC卡的控制設計.
SDHC卡的內部結構與SDSC卡不同,除了容量上的差異外,在使用控制上還存在著以下幾方面的差別:
(1)SDHC卡只支持塊訪問,不支持字節訪問,塊的大小固定為一個扇區512字節;SDSC卡既支持塊訪問,又支持字節訪問,塊的大小由用戶指定.
(2)SDHC卡所使用的文件系統是FAT32,不能在FAT12/16文件系統中使用;SDSC卡使用的文件系統是FAT12/16,在FAT32文件系統中也可以訪問SDSC卡.
(3)SD卡除了擁有SDSC卡的全部命令集外,還增加了許多命令.其中,SPI模式中新增加了CMD8命令,用來識別SD卡的接口類型.CMD8命令的格式與其他SPI命令的格式相同,命令代碼為0x48.
(4)塊訪問命令參數的含義不同.在SDSC卡中,6個塊訪問命令CMD17、CMD18、CMD24、CMD25、CMD32、CMD33的參數含義是SD卡的字節地址.在SDHC卡中塊訪問命令雖然也是這6個命令,但其參數的含義為SD卡的塊地址(扇區地址).
(5)初始化過程不同.
SDHC卡是在SDSC卡的基礎上發展起來的,它們的引腳數都是9腳,引腳分布相同,都具有SD和SPI兩種工作模式,用單片機控制SDHC卡可以采用SPI模式[2]控制.
MC9S12XS128單片機是帶有SPI口的CMOS單片機[3],其工作電壓為3.135~5.5 V,SD卡的工作電壓為2.7~3.6 V,它們都采用3.3 V電源供電時,可用MC9S12XS128的SPI口直接控制SD卡.MC9S12XS128控制宇瞻4 GB的SDHC卡的硬件電路[4]如圖1所示.

圖1 單片機控制SD卡的硬件電路 Fig.1 Circuit of controlling SD card based on MCU
圖1中,R1為4.7 kΩ的電阻,R2為100 Ω的電阻,R3為1 MΩ的電阻,C1為0.01 μF的電容,S1為復位按鈕,C2、C3為22PF的電容,Y為16 MHz的晶振.R1、R2、C1、S1構成了單片機的復位電路,C2、C3、Y、R3為單片機的振蕩電路.
SDHC卡工作在SPI模式時,一次數據傳輸期內CS引腳必須保護為低電平,數據傳輸結束后需將CS置為高電平.一個字節的數據傳輸方向是,高字節在先,低字節在后.SDHC卡輸出數發生在時鐘的下降沿之后,SDHC卡接收數據時時鐘的上升沿鎖存數據.在SDHC卡的初化過程中,SPI的時鐘頻率為100~400 kHz,初始化結束后,SPI的時鐘頻率為0~6 MHz.為了實現單片機與SDHC卡通信,單片機的SPI口應按SDHC卡的時序要求工作[5].用MC9S12XS128單片機控制宇瞻4 GB的SDHC卡時,單片機的SPI口初始化程序如下:
void SPI_Init(void)
{ MODRR =0;
MODRR_MODRR4=1; //使用PM口
DDRM|=0x38; //SCK0=1,MOSI=1,
SS0=1
DDRM &=(~0X04); //MISO=0 輸入
SPI0CR1 = 0x5E; //CPOL=1,CPHA=1
SPI0CR2 = 0x00;
SPI0BR = 0x07; //SPI速率:312.5 kHz}
上電后,SD卡處于SD模式,采用SPI模式訪問SD卡時必須先將SD卡的工作模式轉換成SPI模式,然后用SPI模式命令訪問SD卡中的存儲器.初始化SD卡的的主要任務是,判斷卡槽中的SD卡是何種SD卡,并將SD卡的工作模式設置成SPI模式,如果是SDSC卡還需要設置訪問塊的大小.
初始化SD卡的方法是,上電后先用CMD0命令復位SD卡,使SD卡能接收后續的SPI模式命令,然后用CMD8命令[6]判斷SD卡的接口類型和工作條件.
在讀得CMD8命令的響應有效后再用ACMD41命令啟動SD卡的SPI模式初始化,并檢查初始化是否結束,此處發送ACMD41命令時,應將參數的HCS位設置成1.
在SD卡完成了SPI模式初始化后,再用CMD58命令讀OCR寄存器的內容,并根據OCR的CCS位判斷SD卡是SDHC卡還是Ver2.0版本的SDSC卡.SDSC卡、SDHC卡通用的初始化流程圖如圖2所示.

圖2 SD卡初始化流程Fig.2 Flow chart of the SD card initialized
在SPI模式下,SDHC卡的讀扇區的命令是CMD17,寫扇區命令是CMD24,這2個命令也是SDSC卡在SPI模式下的讀寫扇區命令.讀扇區程序必須按照CMD17命令的時序圖編寫,寫扇區程序必須按照CMD24的時序圖編寫.考慮到SDHC卡和SDSC卡的讀寫扇區命令相同,僅僅只是參數的含義不同,可以將讀寫扇區程序編寫成SDHC卡和SDSC卡通用的程序.通用的讀扇區流程圖如圖3所示,通用的寫扇區的流程圖如圖4所示.

圖3 讀扇區流程圖Fig.3 Flow chart of reading sector

圖4 寫扇區流程圖Fig.4 Flow chart of writing sector
測試主要包括2個方面,一是測試向SDHC卡寫數的功能,二是測試從SDHC卡中讀數的功能.應用本設計中的電路和程序向宇瞻SDHC卡的第50 000扇區寫入512個0x17數據,寫數后的結果如圖5所示.
將SDHC卡的50 000扇區中的數據讀至數據組buff[512]中的結果如圖6所示.

圖6 從SDHC卡讀數的結果Fig.6 Result of reading data from SDHC card
本設計通過采用MC9S12XS128單片機控制宇瞻4 GB的SDHC卡,提出了嵌入式系統中使用高容量SD卡的設計思路和方法,并成功地實現了單片機對SDHC的訪問控制,本設計中的電路和程序已在第五屆“飛思卡爾”杯智能汽車的調試過程得到了很好的應用.實踐表明,本設計解決了高容量SD卡的訪問控制問題,可應用于含有視頻拍攝功能的嵌入系統中和基于SD卡的嵌入式系統的存儲器升級.
參考文獻:
[1] 羅肖,劉軍,楊輝.嵌入式安全存儲系統的研究[J].武漢工程大學學報,2012,34(2):67-70.
[2] 盛李立,王忠,王春麗,等.基于SPI接口的無線網卡設備驅動設計[J].武漢工程大學學報, 2011,33(6):89-97.
[3] 孫同景.Freescale 9S12十六位單片機原理及嵌入式開發技術[M].北京:機械工業出版社,2008.
[4] 王效華,牛思先.基于單片機PWM控制技術的實現[J].武漢理工大學學報,2010,32(1):94-98.
[5] 李文華.單片機應用技術(C語言版)[M].北京:人民郵電出版社,2011.
[6] SD卡委員會.SD specifications part1(physicial layer smplified specification version 3.01)[R]. Technical Committee SD Card Assiociation,2010(5):113-116.