文獻標識碼: A
文章編號: 0258-7998(2011)03-0137-04
隨著電子產品的音頻、視頻等多媒體功能的不斷增強,嵌入式系統對存儲介質的容量、安全、性能、價格等提出了更高的要求,而SD卡因其價格低廉、速度快、容量大和兼容性好(兼容MMC卡協議)等特點在嵌入式平臺中得到了廣泛的使用。目前在嵌入式平臺中使用SD卡的方式主要有:(1)系統中使用帶SD卡控制器的電路模塊或芯片。(2)將I/O口與SD卡接口連接以軟件模擬SPI時序控制其讀寫。方式(1)使用方便、控制簡單,但是增加了硬件電路復雜度和成本;方式(2)電路雖然結構簡單,但是讀寫速度慢。
針對上述缺陷,本文提出了基于SoPC技術的SD卡控制器的架構方案,即在Altera公司提供的Quartus II軟件中開發SD卡控制器并在SoPC Builder中將其作為一個獨立的IP核集成到SoPC中,通過軟件驅動控制器以實現SD卡讀寫及文件操作,使其系統設計靈活、集成度高、讀寫速度快,為SOPC設計中使用非易失性存儲提供了新的方案。
1 SD卡協議規范
SD聯盟在2000年和2006年分別發布了SD卡規范1.0和2.0版本,SD卡規范主要包括物理層規范[1]、文件系統規范和安全規范三部分內容,最大支持容量為32 GB,支持的文件系統為FAT16和FAT32。
SD卡內部不僅有大量的存儲單元,還有卡接口控制器、寄存器等,外部控制器不能直接訪問存儲器,所有對SD卡的操作如讀/寫、設置塊長度、擦除等都是由卡接口控制器根據收到的命令自動完成,減少了外部控制器對存儲器操作的負擔[2]。SD卡支持SD和SPI兩種工作模式,兩種模式下SD卡的管腳意義如表1所示。SD模式下數據采用4線并行傳輸,速度較快。而SPI模式接口協議簡單,在各嵌入式平臺中的通用性好,故本設計中采用SPI模式。
2 SD卡控制器IP核設計
SD卡工作在SPI模式下,其總線主要有時鐘線CLK、命令線CMD、數據線DAT和片選線CS。SD卡控制器主要實現三大功能:
(1)復位和初始化SD卡。控制器按照SD卡總線協議產生控制時序對其進行復位和初始化。
(2)讀寫SD卡。控制器首先通過CMD線發送讀或寫命令和扇區地址,等收到正確的命令回執后,將DAT線上傳輸的串行數據進行串/并轉換,然后存儲在控制器內部緩存中(寫數據則將控制器內部緩存中的數據并/串轉換后從DAT線發送到SD卡),一個扇區數據(512 B)傳輸完畢后將就緒信號置為有效。
(3)設置SD卡。設置操作與讀寫操作相同,都是發送命令和參數,只是不接收和發送數據。
需要特別指出的是:CLK信號由控制器產生,對SD卡的命令或數據傳輸等一系列操作均要與該時鐘同步(SD卡的最大工作時鐘為25 MHz)。
SD控制器的功能模塊劃分如圖1所示。
2.1 總線接口模塊
總線接口模塊SDInterface是整個SD卡控制器的核心,其端口信號遵循Avalon協議規范[3],主要負責連接Avalon總線、緩存SD卡命令、緩存扇區地址、將要發送的數據送至緩存(雙口RAM)以及從緩存中讀取數據等。
當處理器要對SD卡進行初始化時,需要寫SDInterface模塊的特定地址,之后SDInterface選擇啟動復位/初始化模塊(SDInit),由SDInit完成SD卡的初始化工作。
向SD卡寫數據時,需要先通過SDInterface模塊將要寫的數據緩存到雙口RAM中,然后將扇區地址和寫命令(CMD24)發送到SDInterface模塊的特定地址,之后SDInterface會啟動命令控制(SDcmd)模塊并將命令和地址傳遞給后者,最后由SDcmd模塊完成一次寫操作。
從SD卡中讀數據或對SD卡進行其他操作與向SD卡寫數據過程基本一致,處理器首先向SDInterface發送命令和參數(如果是讀寫操作,則參數即為扇區地址),之后SDInterface啟動SDCmd模塊并由SDCmd模塊完成后續操作(如果是讀操作則將讀得的數據緩存到雙口RAM中)。
2.2 初始化模塊
對SD卡進行讀寫或其他操作前首先應將其初始化。初始化模塊SDInit主要負責完成SD卡的初始化工作,主要工作流程如下:
(1)當總線接口模塊使能SDInit后,SDInit通過SPITrans模塊向SD卡發送復位命令(CMD40)。
(2)等待復位命令的回執,如果復位成功(返回值為0x01),則轉向步驟(3),否則繼續等待。
(3)向SD卡發送初始化命令(CMD41),等待初始化命令的回執并將執行結果返回給SDInterface以便通知處理器。
2.3 命令控制模塊
命令控制模塊SDCmd主要完成SD卡命令、參數、命令校驗值的發送和命令回執的讀取(如果是讀寫操作,則還要進行數據的發送和接收)。
SDInterface模塊使能SDCmd前會將SD命令、參數傳遞給SDCmd,這樣SDCmd使能后,首先通過SPITrans模塊將得到的命令、參數發送到SD卡,然后等待命令回執,如果當前命令是讀、寫之外的其他命令,則將執行結果返回給SDInterface模塊即可;如果是讀、寫命令則收到正確的命令回執后,則還要將數據接收并存到緩存或發送到SD卡。
2.4 選擇器和雙口RAM
選擇器模塊Mux主要用來根據當前操作從SDInit模塊和SDCmd模塊的輸出信號中選擇一路送至SPITrans模塊。雙口RAM是SD控制器的緩存,用來存儲發送到SD卡和從SD卡上讀取的數據。
2.5 串/并、并/串轉換及時鐘產生模塊
SPITrans模塊主要負責串/并轉換、并/串轉換和SD卡時鐘產生。當SPITrans模塊使能后,它通過對輸入時鐘進行分頻產生SD卡時鐘,并在8個SD卡時鐘周期內將選擇器輸出的8位并行數據轉換為串行數據發送到SD卡,同時將SD卡DAT線上的串行數據轉換為并行數據返回給SDInit模塊和SDCmd模塊。
3 基礎讀寫設計
SD卡控制器軟件的編寫在Altera公司的Quartus II中完成,使用SOPC Builder工具將具有Avalon總線接口的SD卡控制器封裝成IP 核并集成到SOPC中,利用Nios II IDE編寫軟件驅動實現SD卡的基礎讀寫(以扇區為單位進行讀寫)。寫數據到SD卡扇區操作函數如下:
int sd_write(UINT8 *data, UINT32 addr)
{
int ret, i=0, j=0;
if(sd_type == 1) addr = addr << 9;
/*判斷地址偏移*/
for(i=0; i<512; i++)
IOWR(SD_CARD_BASE, i, data[i]);
/*寫數據*/
IOWR(SD_CARD_BASE, 517, CMD24);
/*寫入地址*/
IOWR(SD_CARD_BASE, 518, addr);
/*開始運行*/
IOWR(SD_CARD_BASE, 519, 0);
/*讀命令回執*/
ret = IORD(SD_CARD_BASE, 519);
…
}
4 文件系統移植
讀寫操作均以扇區為單位,SD卡僅相當于一塊容量較大的Flash,移植文件系統可方便地與PC機或其他電子產品數據交換以及后期分析處理。μC/FS是一種為其提供基本的硬件訪問功能即可應用于任何存儲介質的FAT文件系統,其使用標準ANSI C編寫可應用于幾乎任何CPU。μC/FS具有以下特點[4]:(1)支持DOS/Windows環境下的FAT12,FAT16 和FAT32。(2)支持多個存儲器共同工作,可以同時訪問多個存儲器。(3)多操作系統支持,可以很方便地移植到幾乎任何操作系統。(4)可以很容易地集成使用SPI模式的MMC/SD卡通用設備驅動等。基于以上的特點,μC/FS 非常適用于嵌入式系統。
4.1 μC/FS文件系統結構分析
μC/FS 采取分層工作方式,每一層負責不同的功能,由高層的數據抽象到底層的硬件實體分工明確,其系統結構層次劃分如圖2所示。
4.2 文件系統實現
在完成SD卡控制器及其軟件驅動并實現SD卡基礎讀寫的基礎上,按照μC/FS文件系統的接口函數編寫設備驅動程序并對系統參數做相應設置即可實現SD卡文件操作。μC/FS文件系統的接口函數主要通過一個結構體(FS__device_type)進行描述,該結構體包含了驅動設備的名稱以及4個基本的驅動設備掛接函數的函數指針:
typedef struct {
FS_FARCHARPTR name;
int (*dev_status)(FS_u32 Unit);
int(*dev_read)(FS_u32 Unit, FS_u32 Sector, void *pBuffer);
int(*dev_write)(FS_u32 Unit,FS_u32 Sector,void *pBuffer);
int(*dev_ioctl)( FS_u32 Unit, FS_i32 Cmd, FS_i32 Aux,
void *pBuffer);
} FS__device_type;
其中,dev_status()函數主要實現FAT表狀態信息的讀取,并表明該SD設備可以使用;dev_read()函數實現對SD卡進行文件系統塊數據的讀取;dev_write()函數實現對SD卡進行文件系統塊數據的寫入;dev_ioctl()函數則主要實現文件操作的相關指令,包括文件格式化、數據cache回寫等操作。
5 仿真與驗證
對SD卡控制器的仿真驗證工作主要從時序仿真和軟件驅動控制器讀寫SD卡進行文件操作驗證兩方面進行。
5.1 SD卡控制器的時序仿真
在Quartus II中創建波形激勵文件后,得到的時序仿真結果如圖3所示。在仿真圖中可以看出,控制器在初始化過程中,首先將CMD0(0x40)、參數(0x00000000)和命令校驗位(0x95)通過SPITrans模塊進行并/串轉后發送到SD卡的CMD線進行復位,等收到SD卡DAT線上發送回來的回執(0x01)后,接著發送CMD1(0x41)、參數(0x00000000)和命令校驗位(0xFF)到SD卡進行初始化。由此可見,SD卡控制器設計符合SD卡協議標準。
5.2文件操作驗證
通過調用μC/FS 文件系統提供的API函數,如:FS_Fopen()打開文件、FS_FRead()讀文件、FS_FWrite()寫文件等編寫測試程序如下:
void main(void)
{
char *device="sd:"
const char *WriteMsg="test sd card write\n";
FS_Init(); /*初始化文件系統*/
show_free(device); /*顯示SD卡空間信息*/
write_file("test.txt",WriteMsg); /*寫入文件test.txt*/
show_directory(device); /*顯示根目錄文件信息*/
dump_file("test.txt"); /*讀test.txt文件內容*/
…
}
選用4 GB容量的SDHC卡,在PC機上將其格式化為FAT文件系統并創建文件夾HELLO和文件WORD.DOC。SD卡在線運行調試結果如圖4所示。由運行結果可知,初始化成功并識別此SD卡為SDHC (Secure Digital High Capacity)卡,卡容量為964 256(總簇數)×8(每簇扇區數)×512(每扇區字節數)≈3.7 GB。創建test.txt文件成功后讀取根目錄(有文件目錄hello、文件word.doc和文件test.txt),讀取文件test.txt內容為test sd card write與寫入一致。運行結果表明文件操作正確可靠。
通過對SD卡物理層協議和μC/FS 文件系統的研究,成功設計了具有Avalon總線接口的SD卡控制器,并通過時序仿真、軟件驅動的方式進行仿真和調試,驗證了SD卡控制器的工作情況,在此基礎上實現了SD卡中的文件操作,使SOPC設計能與PC機或各種電子產品方便地進行數據交換。本設計已成功應用在基于SOPC架構的多用途無線防盜監控系統中。
參考文獻
[1] SD Group. SD specifications part 1: physical layer simplified specification version 2.0,september 25, 2006.
[2] 李錦,呂柏權. 基于AT91RM9200的SD卡主控制器的設計[J]. 微計算機應用,2009,30(1):64-67.
[3] Altera.Avalon bus specificational reference manual[EB/OL]. http://www.altera.com, 2002.
[4] User′s & reference manual for μC/FS V1-34a. Micriμm Technologies Corporation. 2003.
[5] 鄭千洪, 王黎, 高曉蓉. 嵌入式平臺上NAND Flash的驅動實現[J]. 微計算機信息, 2009,25(4-2):102-105.