<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于SoPC的SD卡控制器IP核的設(shè)計(jì)

          基于SoPC的SD卡控制器IP核的設(shè)計(jì)

          作者: 時(shí)間:2011-07-08 來(lái)源:網(wǎng)絡(luò) 收藏

          摘 要: 針對(duì)目前在嵌入式平臺(tái)中使用SD卡專(zhuān)用芯片價(jià)格昂貴、軟件模擬SPI時(shí)序控制讀寫(xiě)速度較慢的問(wèn)題,提出了一種基于SoPC技術(shù)的SD卡設(shè)計(jì)的架構(gòu)方案。采用VHDL語(yǔ)言設(shè)計(jì)SD卡,利用自定義模塊技術(shù)將其添加到SoPC中,利用Nios IDE編寫(xiě)SD卡的基礎(chǔ)讀寫(xiě)驅(qū)動(dòng)軟件并移植μC/FS文件系統(tǒng),實(shí)現(xiàn)對(duì)SD卡的文件操作。該設(shè)計(jì)具有使用方便、集成度高、數(shù)據(jù)傳輸可靠、文件格式通用等特點(diǎn),在基于SoPC架構(gòu)的多用途無(wú)線防盜監(jiān)控系統(tǒng)中得到良好的應(yīng)用。
          關(guān)鍵詞: 可編程片上系統(tǒng); SD卡; μC/FS文件系統(tǒng); 控制器;

           隨著電子產(chǎn)品的音頻、視頻等多媒體功能的不斷增強(qiáng),嵌入式系統(tǒng)對(duì)存儲(chǔ)介質(zhì)的容量、安全、性能、價(jià)格等提出了更高的要求,而SD卡因其價(jià)格低廉、速度快、容量大和兼容性好(兼容MMC卡協(xié)議)等特點(diǎn)在嵌入式平臺(tái)中得到了廣泛的使用。目前在嵌入式平臺(tái)中使用SD卡的方式主要有:(1)系統(tǒng)中使用帶SD卡控制器的電路模塊或芯片。(2)將I/O口與SD卡接口連接以軟件模擬SPI時(shí)序控制其讀寫(xiě)。方式(1)使用方便、控制簡(jiǎn)單,但是增加了硬件電路復(fù)雜度和成本;方式(2)電路雖然結(jié)構(gòu)簡(jiǎn)單,但是讀寫(xiě)速度慢。
           針對(duì)上述缺陷,本文提出了基于SoPC技術(shù)的SD卡控制器的架構(gòu)方案,即在Altera公司提供的 軟件中開(kāi)發(fā)SD卡控制器并在SoPC Builder中將其作為一個(gè)獨(dú)立的IP核集成到SoPC中,通過(guò)軟件驅(qū)動(dòng)控制器以實(shí)現(xiàn)SD卡讀寫(xiě)及文件操作,使其系統(tǒng)設(shè)計(jì)靈活、集成度高、讀寫(xiě)速度快,為SOPC設(shè)計(jì)中使用非易失性存儲(chǔ)提供了新的方案。


          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)部不僅有大量的存儲(chǔ)單元,還有卡接口控制器、寄存器等,外部控制器不能直接訪問(wèn)存儲(chǔ)器,所有對(duì)SD卡的操作如讀/寫(xiě)、設(shè)置塊長(zhǎng)度、擦除等都是由卡接口控制器根據(jù)收到的命令自動(dòng)完成,減少了外部控制器對(duì)存儲(chǔ)器操作的負(fù)擔(dān)[2]。SD卡支持SD和SPI兩種工作模式,兩種模式下SD卡的管腳意義如表1所示。SD模式下數(shù)據(jù)采用4線并行傳輸,速度較快。而SPI模式接口協(xié)議簡(jiǎn)單,在各嵌入式平臺(tái)中的通用性好,故本設(shè)計(jì)中采用SPI模式?!?/P>


          2 SD卡控制器IP核設(shè)計(jì)
           SD卡工作在SPI模式下,其總線主要有時(shí)鐘線CLK、命令線CMD、數(shù)據(jù)線DAT和片選線CS。SD卡控制器主要實(shí)現(xiàn)三大功能:
           (1)復(fù)位和初始化SD卡。控制器按照SD卡總線協(xié)議產(chǎn)生控制時(shí)序?qū)ζ溥M(jìn)行復(fù)位和初始化。
           (2)讀寫(xiě)SD卡??刂破魇紫韧ㄟ^(guò)CMD線發(fā)送讀或?qū)懨詈蜕葏^(qū)地址,等收到正確的命令回執(zhí)后,將DAT線上傳輸?shù)拇袛?shù)據(jù)進(jìn)行串/并轉(zhuǎn)換,然后存儲(chǔ)在控制器內(nèi)部緩存中(寫(xiě)數(shù)據(jù)則將控制器內(nèi)部緩存中的數(shù)據(jù)并/串轉(zhuǎn)換后從DAT線發(fā)送到SD卡),一個(gè)扇區(qū)數(shù)據(jù)(512 B)傳輸完畢后將就緒信號(hào)置為有效。
           (3)設(shè)置SD卡。設(shè)置操作與讀寫(xiě)操作相同,都是發(fā)送命令和參數(shù),只是不接收和發(fā)送數(shù)據(jù)。
           需要特別指出的是:CLK信號(hào)由控制器產(chǎn)生,對(duì)SD卡的命令或數(shù)據(jù)傳輸?shù)纫幌盗胁僮骶c該時(shí)鐘同步(SD卡的最大工作時(shí)鐘為25 MHz)。
           SD控制器的功能模塊劃分如圖1所示。

          基于SoPC的SD卡控制器IP核的設(shè)計(jì)

          2.1 總線接口模塊
          總線接口模塊SDInterface是整個(gè)SD卡控制器的核心,其端口信號(hào)遵循Avalon協(xié)議規(guī)范[3],主要負(fù)責(zé)連接Avalon總線、緩存SD卡命令、緩存扇區(qū)地址、將要發(fā)送的數(shù)據(jù)送至緩存(雙口RAM)以及從緩存中讀取數(shù)據(jù)等。
           當(dāng)處理器要對(duì)SD卡進(jìn)行初始化時(shí),需要寫(xiě)SDInterface模塊的特定地址,之后SDInterface選擇啟動(dòng)復(fù)位/初始化模塊(SDInit),由SDInit完成SD卡的初始化工作。
           向SD卡寫(xiě)數(shù)據(jù)時(shí),需要先通過(guò)SDInterface模塊將要寫(xiě)的數(shù)據(jù)緩存到雙口RAM中,然后將扇區(qū)地址和寫(xiě)命令(CMD24)發(fā)送到SDInterface模塊的特定地址,之后SDInterface會(huì)啟動(dòng)命令控制(SDcmd)模塊并將命令和地址傳遞給后者,最后由SDcmd模塊完成一次寫(xiě)操作。
          從SD卡中讀數(shù)據(jù)或?qū)D卡進(jìn)行其他操作與向SD卡寫(xiě)數(shù)據(jù)過(guò)程基本一致,處理器首先向SDInterface發(fā)送命令和參數(shù)(如果是讀寫(xiě)操作,則參數(shù)即為扇區(qū)地址),之后SDInterface啟動(dòng)SDCmd模塊并由SDCmd模塊完成后續(xù)操作(如果是讀操作則將讀得的數(shù)據(jù)緩存到雙口RAM中)。


          2.2 初始化模塊
            對(duì)SD卡進(jìn)行讀寫(xiě)或其他操作前首先應(yīng)將其初始化。初始化模塊SDInit主要負(fù)責(zé)完成SD卡的初始化工作,主要工作流程如下:
           (1)當(dāng)總線接口模塊使能SDInit后,SDInit通過(guò)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寫(xiě)操作,則還要進(jìn)行數(shù)據(jù)的發(fā)送和接收)。
           SDInterface模塊使能SDCmd前會(huì)將SD命令、參數(shù)傳遞給SDCmd,這樣SDCmd使能后,首先通過(guò)SPITrans模塊將得到的命令、參數(shù)發(fā)送到SD卡,然后等待命令回執(zhí),如果當(dāng)前命令是讀、寫(xiě)之外的其他命令,則將執(zhí)行結(jié)果返回給SDInterface模塊即可;如果是讀、寫(xiě)命令則收到正確的命令回執(zhí)后,則還要將數(shù)據(jù)接收并存到緩存或發(fā)送到SD卡。


          2.4 選擇器和雙口RAM
           選擇器模塊Mux主要用來(lái)根據(jù)當(dāng)前操作從SDInit模塊和SDCmd模塊的輸出信號(hào)中選擇一路送至SPITrans模塊。雙口RAM是SD控制器的緩存,用來(lái)存儲(chǔ)發(fā)送到SD卡和從SD卡上讀取的數(shù)據(jù)。


          2.5 串/并、并/串轉(zhuǎn)換及時(shí)鐘產(chǎn)生模塊
           SPITrans模塊主要負(fù)責(zé)串/并轉(zhuǎn)換、并/串轉(zhuǎn)換和SD卡時(shí)鐘產(chǎn)生。當(dāng)SPITrans模塊使能后,它通過(guò)對(duì)輸入時(shí)鐘進(jìn)行分頻產(chǎn)生SD卡時(shí)鐘,并在8個(gè)SD卡時(shí)鐘周期內(nèi)將選擇器輸出的8位并行數(shù)據(jù)轉(zhuǎn)換為串行數(shù)據(jù)發(fā)送到SD卡,同時(shí)將SD卡DAT線上的串行數(shù)據(jù)轉(zhuǎn)換為并行數(shù)據(jù)返回給SDInit模塊和SDCmd模塊。


          3 基礎(chǔ)讀寫(xiě)設(shè)計(jì)
           SD卡控制器軟件的編寫(xiě)在Altera公司的 中完成,使用SOPC Builder工具將具有Avalon總線接口的SD卡控制器封裝成IP 核并集成到SOPC中,利用Nios II IDE編寫(xiě)軟件驅(qū)動(dòng)實(shí)現(xiàn)SD卡的基礎(chǔ)讀寫(xiě)(以扇區(qū)為單位進(jìn)行讀寫(xiě))。寫(xiě)數(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; i512; i++)
            IOWR(SD_CARD_BASE, i, data[i]);
          /*寫(xiě)數(shù)據(jù)*/
          IOWR(SD_CARD_BASE, 517, CMD24);
          /*寫(xiě)入地址*/
          IOWR(SD_CARD_BASE, 518, addr);
          /*開(kāi)始運(yùn)行*/
          IOWR(SD_CARD_BASE, 519, 0);
          /*讀命令回執(zhí)*/
          ret = IORD(SD_CARD_BASE, 519);

          }


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: 控制器 IP核 Quartus II

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();