《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 設(shè)計(jì)應(yīng)用 > 基于SoPC的SD卡控制器IP核的設(shè)計(jì)
基于SoPC的SD卡控制器IP核的設(shè)計(jì)
來源:電子技術(shù)應(yīng)用2011年第3期
何 偉, 余征華, 張 玲, 劉平凈
重慶大學(xué) 通信工程學(xué)院, 重慶 400044)
摘要: 針對目前在嵌入式平臺中使用SD卡控制器專用芯片價(jià)格昂貴、軟件模擬SPI時序控制讀寫速度較慢的問題,提出了一種基于SoPC技術(shù)的SD卡控制器IP核設(shè)計(jì)的架構(gòu)方案。采用VHDL語言設(shè)計(jì)SD卡控制器IP核,利用自定義模塊技術(shù)將其添加到SoPC中,利用Nios II IDE編寫SD卡的基礎(chǔ)讀寫驅(qū)動軟件并移植μC/FS文件系統(tǒng),實(shí)現(xiàn)對SD卡的文件操作。該設(shè)計(jì)具有使用方便、集成度高、數(shù)據(jù)傳輸可靠、文件格式通用等特點(diǎn),在基于SoPC架構(gòu)的多用途無線防盜監(jiān)控系統(tǒng)中得到良好的應(yīng)用。
中圖分類號: TP333
文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2011)03-0137-04
Design of SD card controller IP core based on SoPC
Hei Wei, Yu Zhenghua, Zhang Ling, Liu Pingjing
College of Communication Engineering, Chongqing University, Chongqing 400044, China
Abstract: Architecture program of SD card controller IP core based on SoPC technology is proposed to solve the problems such as higher price of SD card controller ASICs applied into embedded platform and lower speed of SPI read-write timing by using software simulation. Firstly, SD Card Controller IP Core is designed with VHDL and integrated into SoPC by using custom module technology. Then, to realize the file operation, basic read-write driver is programmed and μC/FS file system is ported by C running on Nios II processor. The design is with the properties of convenience, high integration, realiable data transmission and universal file format and gains better application in multi-purpose wireless security monitoring system based on SoPC architecture.
Key words : SoPC; SD card;μC/FS file system; controller; IP core


 隨著電子產(chǎn)品的音頻、視頻等多媒體功能的不斷增強(qiáng),嵌入式系統(tǒng)對存儲介質(zhì)的容量、安全、性能、價(jià)格等提出了更高的要求,而SD卡因其價(jià)格低廉、速度快、容量大和兼容性好(兼容MMC卡協(xié)議)等特點(diǎn)在嵌入式平臺中得到了廣泛的使用。目前在嵌入式平臺中使用SD卡的方式主要有:(1)系統(tǒng)中使用帶SD卡控制器的電路模塊或芯片。(2)將I/O口與SD卡接口連接以軟件模擬SPI時序控制其讀寫。方式(1)使用方便、控制簡單,但是增加了硬件電路復(fù)雜度和成本;方式(2)電路雖然結(jié)構(gòu)簡單,但是讀寫速度慢。
 針對上述缺陷,本文提出了基于SoPC技術(shù)的SD卡控制器的架構(gòu)方案,即在Altera公司提供的Quartus II軟件中開發(fā)SD卡控制器并在SoPC Builder中將其作為一個獨(dú)立的IP核集成到SoPC中,通過軟件驅(qū)動控制器以實(shí)現(xiàn)SD卡讀寫及文件操作,使其系統(tǒng)設(shè)計(jì)靈活、集成度高、讀寫速度快,為SOPC設(shè)計(jì)中使用非易失性存儲提供了新的方案。
1 SD卡協(xié)議規(guī)范
    SD聯(lián)盟在2000年和2006年分別發(fā)布了SD卡規(guī)范1.0和2.0版本,SD卡規(guī)范主要包括物理層規(guī)范[1]、文件系統(tǒng)規(guī)范和安全規(guī)范三部分內(nèi)容,最大支持容量為32 GB,支持的文件系統(tǒng)為FAT16和FAT32。
 SD卡內(nèi)部不僅有大量的存儲單元,還有卡接口控制器、寄存器等,外部控制器不能直接訪問存儲器,所有對SD卡的操作如讀/寫、設(shè)置塊長度、擦除等都是由卡接口控制器根據(jù)收到的命令自動完成,減少了外部控制器對存儲器操作的負(fù)擔(dān)[2]。SD卡支持SD和SPI兩種工作模式,兩種模式下SD卡的管腳意義如表1所示。SD模式下數(shù)據(jù)采用4線并行傳輸,速度較快。而SPI模式接口協(xié)議簡單,在各嵌入式平臺中的通用性好,故本設(shè)計(jì)中采用SPI模式。 
2 SD卡控制器IP核設(shè)計(jì)
 SD卡工作在SPI模式下,其總線主要有時鐘線CLK、命令線CMD、數(shù)據(jù)線DAT和片選線CS。SD卡控制器主要實(shí)現(xiàn)三大功能:
 (1)復(fù)位和初始化SD卡。控制器按照SD卡總線協(xié)議產(chǎn)生控制時序?qū)ζ溥M(jìn)行復(fù)位和初始化。
 (2)讀寫SD卡。控制器首先通過CMD線發(fā)送讀或?qū)懨詈蜕葏^(qū)地址,等收到正確的命令回執(zhí)后,將DAT線上傳輸?shù)拇袛?shù)據(jù)進(jìn)行串/并轉(zhuǎn)換,然后存儲在控制器內(nèi)部緩存中(寫數(shù)據(jù)則將控制器內(nèi)部緩存中的數(shù)據(jù)并/串轉(zhuǎn)換后從DAT線發(fā)送到SD卡),一個扇區(qū)數(shù)據(jù)(512 B)傳輸完畢后將就緒信號置為有效。
 (3)設(shè)置SD卡。設(shè)置操作與讀寫操作相同,都是發(fā)送命令和參數(shù),只是不接收和發(fā)送數(shù)據(jù)。
 需要特別指出的是:CLK信號由控制器產(chǎn)生,對SD卡的命令或數(shù)據(jù)傳輸?shù)纫幌盗胁僮骶c該時鐘同步(SD卡的最大工作時鐘為25 MHz)。
 SD控制器的功能模塊劃分如圖1所示。

2.1 總線接口模塊
    總線接口模塊SDInterface是整個SD卡控制器的核心,其端口信號遵循Avalon協(xié)議規(guī)范[3],主要負(fù)責(zé)連接Avalon總線、緩存SD卡命令、緩存扇區(qū)地址、將要發(fā)送的數(shù)據(jù)送至緩存(雙口RAM)以及從緩存中讀取數(shù)據(jù)等。
 當(dāng)處理器要對SD卡進(jìn)行初始化時,需要寫SDInterface模塊的特定地址,之后SDInterface選擇啟動復(fù)位/初始化模塊(SDInit),由SDInit完成SD卡的初始化工作。
 向SD卡寫數(shù)據(jù)時,需要先通過SDInterface模塊將要寫的數(shù)據(jù)緩存到雙口RAM中,然后將扇區(qū)地址和寫命令(CMD24)發(fā)送到SDInterface模塊的特定地址,之后SDInterface會啟動命令控制(SDcmd)模塊并將命令和地址傳遞給后者,最后由SDcmd模塊完成一次寫操作。
    從SD卡中讀數(shù)據(jù)或?qū)D卡進(jìn)行其他操作與向SD卡寫數(shù)據(jù)過程基本一致,處理器首先向SDInterface發(fā)送命令和參數(shù)(如果是讀寫操作,則參數(shù)即為扇區(qū)地址),之后SDInterface啟動SDCmd模塊并由SDCmd模塊完成后續(xù)操作(如果是讀操作則將讀得的數(shù)據(jù)緩存到雙口RAM中)。
2.2 初始化模塊
     對SD卡進(jìn)行讀寫或其他操作前首先應(yīng)將其初始化。初始化模塊SDInit主要負(fù)責(zé)完成SD卡的初始化工作,主要工作流程如下:
 (1)當(dāng)總線接口模塊使能SDInit后,SDInit通過SPITrans模塊向SD卡發(fā)送復(fù)位命令(CMD40)。
 (2)等待復(fù)位命令的回執(zhí),如果復(fù)位成功(返回值為0x01),則轉(zhuǎn)向步驟(3),否則繼續(xù)等待。
 (3)向SD卡發(fā)送初始化命令(CMD41),等待初始化命令的回執(zhí)并將執(zhí)行結(jié)果返回給SDInterface以便通知處理器。
2.3 命令控制模塊
 命令控制模塊SDCmd主要完成SD卡命令、參數(shù)、命令校驗(yàn)值的發(fā)送和命令回執(zhí)的讀?。ㄈ绻亲x寫操作,則還要進(jìn)行數(shù)據(jù)的發(fā)送和接收)。
 SDInterface模塊使能SDCmd前會將SD命令、參數(shù)傳遞給SDCmd,這樣SDCmd使能后,首先通過SPITrans模塊將得到的命令、參數(shù)發(fā)送到SD卡,然后等待命令回執(zhí),如果當(dāng)前命令是讀、寫之外的其他命令,則將執(zhí)行結(jié)果返回給SDInterface模塊即可;如果是讀、寫命令則收到正確的命令回執(zhí)后,則還要將數(shù)據(jù)接收并存到緩存或發(fā)送到SD卡。
2.4 選擇器和雙口RAM
 選擇器模塊Mux主要用來根據(jù)當(dāng)前操作從SDInit模塊和SDCmd模塊的輸出信號中選擇一路送至SPITrans模塊。雙口RAM是SD控制器的緩存,用來存儲發(fā)送到SD卡和從SD卡上讀取的數(shù)據(jù)。
2.5 串/并、并/串轉(zhuǎn)換及時鐘產(chǎn)生模塊
 SPITrans模塊主要負(fù)責(zé)串/并轉(zhuǎn)換、并/串轉(zhuǎn)換和SD卡時鐘產(chǎn)生。當(dāng)SPITrans模塊使能后,它通過對輸入時鐘進(jìn)行分頻產(chǎn)生SD卡時鐘,并在8個SD卡時鐘周期內(nèi)將選擇器輸出的8位并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)發(fā)送到SD卡,同時將SD卡DAT線上的串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)返回給SDInit模塊和SDCmd模塊。
3 基礎(chǔ)讀寫設(shè)計(jì)
 SD卡控制器軟件的編寫在Altera公司的Quartus II中完成,使用SOPC Builder工具將具有Avalon總線接口的SD卡控制器封裝成IP 核并集成到SOPC中,利用Nios II IDE編寫軟件驅(qū)動實(shí)現(xiàn)SD卡的基礎(chǔ)讀寫(以扇區(qū)為單位進(jìn)行讀寫)。寫數(shù)據(jù)到SD卡扇區(qū)操作函數(shù)如下:
    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]);
         /*寫數(shù)據(jù)*/
         IOWR(SD_CARD_BASE, 517, CMD24);   
         /*寫入地址*/
         IOWR(SD_CARD_BASE, 518, addr);
         /*開始運(yùn)行*/
         IOWR(SD_CARD_BASE, 519, 0);
         /*讀命令回執(zhí)*/
         ret = IORD(SD_CARD_BASE, 519); 
         &hellip;
        }
4 文件系統(tǒng)移植
 讀寫操作均以扇區(qū)為單位,SD卡僅相當(dāng)于一塊容量較大的Flash,移植文件系統(tǒng)可方便地與PC機(jī)或其他電子產(chǎn)品數(shù)據(jù)交換以及后期分析處理。&mu;C/FS是一種為其提供基本的硬件訪問功能即可應(yīng)用于任何存儲介質(zhì)的FAT文件系統(tǒng),其使用標(biāo)準(zhǔn)ANSI C編寫可應(yīng)用于幾乎任何CPU。&mu;C/FS具有以下特點(diǎn)[4]:(1)支持DOS/Windows環(huán)境下的FAT12,F(xiàn)AT16 和FAT32。(2)支持多個存儲器共同工作,可以同時訪問多個存儲器。(3)多操作系統(tǒng)支持,可以很方便地移植到幾乎任何操作系統(tǒng)。(4)可以很容易地集成使用SPI模式的MMC/SD卡通用設(shè)備驅(qū)動等。基于以上的特點(diǎn),&mu;C/FS 非常適用于嵌入式系統(tǒng)。
4.1 &mu;C/FS文件系統(tǒng)結(jié)構(gòu)分析
 &mu;C/FS 采取分層工作方式,每一層負(fù)責(zé)不同的功能,由高層的數(shù)據(jù)抽象到底層的硬件實(shí)體分工明確,其系統(tǒng)結(jié)構(gòu)層次劃分如圖2所示。

4.2 文件系統(tǒng)實(shí)現(xiàn)
 在完成SD卡控制器及其軟件驅(qū)動并實(shí)現(xiàn)SD卡基礎(chǔ)讀寫的基礎(chǔ)上,按照&mu;C/FS文件系統(tǒng)的接口函數(shù)編寫設(shè)備驅(qū)動程序并對系統(tǒng)參數(shù)做相應(yīng)設(shè)置即可實(shí)現(xiàn)SD卡文件操作。&mu;C/FS文件系統(tǒng)的接口函數(shù)主要通過一個結(jié)構(gòu)體(FS__device_type)進(jìn)行描述,該結(jié)構(gòu)體包含了驅(qū)動設(shè)備的名稱以及4個基本的驅(qū)動設(shè)備掛接函數(shù)的函數(shù)指針:
    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()函數(shù)主要實(shí)現(xiàn)FAT表狀態(tài)信息的讀取,并表明該SD設(shè)備可以使用;dev_read()函數(shù)實(shí)現(xiàn)對SD卡進(jìn)行文件系統(tǒng)塊數(shù)據(jù)的讀?。籨ev_write()函數(shù)實(shí)現(xiàn)對SD卡進(jìn)行文件系統(tǒng)塊數(shù)據(jù)的寫入;dev_ioctl()函數(shù)則主要實(shí)現(xiàn)文件操作的相關(guān)指令,包括文件格式化、數(shù)據(jù)cache回寫等操作。
5 仿真與驗(yàn)證
 對SD卡控制器的仿真驗(yàn)證工作主要從時序仿真和軟件驅(qū)動控制器讀寫SD卡進(jìn)行文件操作驗(yàn)證兩方面進(jìn)行。
5.1 SD卡控制器的時序仿真
 在Quartus II中創(chuàng)建波形激勵文件后,得到的時序仿真結(jié)果如圖3所示。在仿真圖中可以看出,控制器在初始化過程中,首先將CMD0(0x40)、參數(shù)(0x00000000)和命令校驗(yàn)位(0x95)通過SPITrans模塊進(jìn)行并/串轉(zhuǎn)后發(fā)送到SD卡的CMD線進(jìn)行復(fù)位,等收到SD卡DAT線上發(fā)送回來的回執(zhí)(0x01)后,接著發(fā)送CMD1(0x41)、參數(shù)(0x00000000)和命令校驗(yàn)位(0xFF)到SD卡進(jìn)行初始化。由此可見,SD卡控制器設(shè)計(jì)符合SD卡協(xié)議標(biāo)準(zhǔn)。

5.2文件操作驗(yàn)證
    通過調(diào)用&mu;C/FS 文件系統(tǒng)提供的API函數(shù),如:FS_Fopen()打開文件、FS_FRead()讀文件、FS_FWrite()寫文件等編寫測試程序如下:
    void main(void)
    {
        char *device="sd:"
        const char *WriteMsg="test sd card write\n";
         FS_Init();                           /*初始化文件系統(tǒng)*/
         show_free(device);          /*顯示SD卡空間信息*/
         write_file("test.txt",WriteMsg); /*寫入文件test.txt*/
         show_directory(device);   /*顯示根目錄文件信息*/
         dump_file("test.txt");        /*讀test.txt文件內(nèi)容*/
        &hellip;
    }
 選用4 GB容量的SDHC卡,在PC機(jī)上將其格式化為FAT文件系統(tǒng)并創(chuàng)建文件夾HELLO和文件WORD.DOC。SD卡在線運(yùn)行調(diào)試結(jié)果如圖4所示。由運(yùn)行結(jié)果可知,初始化成功并識別此SD卡為SDHC (Secure Digital High Capacity)卡,卡容量為964 256(總簇?cái)?shù))&times;8(每簇扇區(qū)數(shù))&times;512(每扇區(qū)字節(jié)數(shù))&asymp;3.7 GB。創(chuàng)建test.txt文件成功后讀取根目錄(有文件目錄hello、文件word.doc和文件test.txt),讀取文件test.txt內(nèi)容為test sd card write與寫入一致。運(yùn)行結(jié)果表明文件操作正確可靠。

    通過對SD卡物理層協(xié)議和&mu;C/FS 文件系統(tǒng)的研究,成功設(shè)計(jì)了具有Avalon總線接口的SD卡控制器,并通過時序仿真、軟件驅(qū)動的方式進(jìn)行仿真和調(diào)試,驗(yàn)證了SD卡控制器的工作情況,在此基礎(chǔ)上實(shí)現(xiàn)了SD卡中的文件操作,使SOPC設(shè)計(jì)能與PC機(jī)或各種電子產(chǎn)品方便地進(jìn)行數(shù)據(jù)交換。本設(shè)計(jì)已成功應(yīng)用在基于SOPC架構(gòu)的多用途無線防盜監(jiān)控系統(tǒng)中。
參考文獻(xiàn)
[1] SD Group. SD specifications part 1: physical layer simplified specification version 2.0,september 25, 2006.
[2] 李錦,呂柏權(quán). 基于AT91RM9200的SD卡主控制器的設(shè)計(jì)[J]. 微計(jì)算機(jī)應(yīng)用,2009,30(1):64-67.
[3] Altera.Avalon bus specificational reference manual[EB/OL].  http://www.altera.com, 2002.
[4] User&prime;s & reference manual for &mu;C/FS V1-34a. Micri&mu;m  Technologies Corporation. 2003.
[5] 鄭千洪, 王黎, 高曉蓉. 嵌入式平臺上NAND Flash的驅(qū)動實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息, 2009,25(4-2):102-105.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。