陳正江
(電子科技大學(xué) 自動化工程學(xué)院,成都611731)
陳正江(碩士研究生),主要研究領(lǐng)域為測控技術(shù)與儀器。
德州儀器(TⅠ)公司的OMAP-L138處理器是一款將ARM和DSP整合在一起的低功耗應(yīng)用處理器,其中ARM核采用的是主頻為375MHz的ARM926EJ-S核,而DSP核采用TⅠ公司的型號為TMS320C6748的浮點型DSP[1]。
作為一款針對移動設(shè)備和高速數(shù)據(jù)處理的高性能應(yīng)用處理器,SD卡的引入有一定的必要性。在大部分應(yīng)用中OMAP-L138處理器會產(chǎn)生大量的數(shù)據(jù),SD卡的使用可以大大降低板上存儲數(shù)據(jù)的成本,減少數(shù)據(jù)的轉(zhuǎn)移時間,提高數(shù)據(jù)的轉(zhuǎn)移效率。而在SD卡上實現(xiàn)文件系統(tǒng),有利于管理卡上數(shù)據(jù),使之準(zhǔn)確而迅速地轉(zhuǎn)移至PC機??紤]到FAT文件系統(tǒng)較高的可移植性,且與PC機上常用的Windows操作系統(tǒng)兼容,因此在本課題中采用了FAT文件系統(tǒng)以便于在PC機上對數(shù)據(jù)進行分析和備份。
由于在成本控制、安全性、移動性和讀寫速度等方面都有不錯的表現(xiàn),SD卡的應(yīng)用越來越廣泛。下面針對SD卡在本課題中的應(yīng)用進行一些簡要的介紹。
SD卡內(nèi)部結(jié)構(gòu)如圖1所示。SD卡有9個引腳,以下是對除供電和接地引腳外的6個引腳的功能介紹。
①CLK:時鐘信號。每個時鐘周期能傳輸一個命令或數(shù)據(jù)位。
② CMD:命令(Command)和響應(yīng)(Response)線。用于主機與SD卡之間的協(xié)調(diào)通信。
圖1 SD卡內(nèi)部結(jié)構(gòu)
③DAT0~3:數(shù)據(jù)線。用于主機與SD卡之間的數(shù)據(jù)交換。
另外,SD卡內(nèi)部有6個長短不一的寄存器,存儲著SD卡的出廠日期、生產(chǎn)廠商、容量大小、操作條件和SD卡狀態(tài)等信息。
根據(jù)SD卡的相關(guān)標(biāo)準(zhǔn)可知[3],SD卡支持兩種總線模式:一種是SPⅠ模式,即使用SPⅠ接口總線來進行數(shù)據(jù)的傳輸,只使用4位數(shù)據(jù)線中的DAT0進行數(shù)據(jù)傳輸,而CD/DAT3引腳用于片選;另一種是SD模式,該模式下可以使用單線或4線傳輸數(shù)據(jù)。只要主控設(shè)備提供了SPⅠ接口,SD卡就能應(yīng)用于該設(shè)備,這使SD卡更具有通用性;而SD模式相比于SPⅠ模式可以提供更快的SD卡讀寫速度,這正是高速數(shù)據(jù)處理所需要的。
Command和Response都是在CMD線上串行傳輸?shù)?,只是傳輸?shù)姆较虿灰粯印?/p>
Command代表著一次主機到從卡操作的開始,是從主機到單卡或所有卡。
Response是對之前Command的響應(yīng),可以來自單卡或所有卡。
1.3.1Command介紹
Command分為標(biāo)準(zhǔn)CMD和ACMD,它們之間的區(qū)別就是在使用ACMD之前須向SD卡發(fā)送APP_CMD Command(CMD55)[3],而標(biāo)準(zhǔn) CMD 是可以直接對 SD 卡使用的。以下是幾個常用的Command[3]。
① GO_ⅠDLE_STATE(CMD0):重置所有卡,使它們都處于空閑態(tài),無Response。
② ALL_SEND_CⅠD(CMD2):向所有卡詢問 CⅠD號碼,響應(yīng)類型為R2。
③SEND_RELATⅠVE_ADDR(CMD3):詢問卡的RCA(Relative Card Address,相對卡地址)。是SD卡的本地系統(tǒng)地址,是由SD卡在初始化期間動態(tài)分配并得到主機承認(rèn)的[3],響應(yīng)類型為 R6。
④ SELECT/DESELECT_CARD(CMD7):CMD7使用RCA作為命令參數(shù),當(dāng)某卡收到的是自己本身的RCA,那么它將被選擇。反之,則該卡將被取消選定。當(dāng)發(fā)送的RCA為0時將取消選定的所有卡,響應(yīng)類型為R1b。
⑤SEND_CSD(CMD9):命令參數(shù)為 RCA,其作用是使地址為該RCA的卡給主機設(shè)備發(fā)送它的CSD信息,響應(yīng)類型為R2。
⑥ STOP TRANSMⅠSSⅠON(CMD12):強制卡結(jié)束數(shù)據(jù)傳輸,通常用于SD卡多塊讀寫時,響應(yīng)類型為R1b。
⑦SET_BLOCKLEN(CMD16):設(shè)置 SD卡的塊長度,通常的塊長度都是512字節(jié),響應(yīng)類型為R1。
⑧ READ_SⅠNGLE_BLOCK(CMD17),READ_MULTⅠPLE_BLOCK(CMD18):塊的讀命令,前者讀單塊,后者讀多塊,響應(yīng)類型都是R1。
⑨ WRⅠTE_SⅠNGLE_BLOCK(CMD24),WRⅠTE_MULTⅠPLE_BLOCK(CMD25):塊的寫命令,前者寫單塊,后者寫多塊,響應(yīng)類型都是R1。
⑩ APP_CMD(CMD55):指明下一個命令為ACMD,響應(yīng)類型為R1。
[11]SET_BUS_WⅠDTH(ACMD6):設(shè)置SD卡的數(shù)據(jù)寬度,參數(shù)為數(shù)據(jù)寬度,響應(yīng)類型為R1。
[12]SD_SEND_OP_COND(ACMD41):讓SD卡返回OCR寄存器內(nèi)容,參數(shù)為SD卡的電壓范圍,響應(yīng)類型為R3。
1.3.2Response介紹
Response分為R1、R1b、R2、R3、R6和R7,除去R2長度為136位外,其他的全為48位,但它們的功用和意義不一致。
R1為普通命令的響應(yīng),而R1b與R1唯一的區(qū)別就是R1b代表該卡接到命令時數(shù)據(jù)線會處于忙態(tài)。R2用于卡向主機返回SD卡CSD或CⅠD寄存器內(nèi)容,R3作為ACMD41的響應(yīng),返回SD卡OCR寄存器的內(nèi)容。R6返回SD卡的RCA,R7作為CMD8的響應(yīng)[3]。
之所以引入FAT文件系統(tǒng),一是便于SD卡上數(shù)據(jù)的管理,二是便于將SD卡上的數(shù)據(jù)轉(zhuǎn)移至PC機上進行備份和處理。
目前FAT文件系統(tǒng)有FAT12、FAT16和FAT32三種類型,它們是由FAT表中每個FAT項所占長度來分類的,即它們的FAT表中每個FAT項占用的位數(shù)分別為12、16和32位[4]。由于FAT12文件系統(tǒng)能支持的最大分區(qū)容量只有8MB,再加上不能支持長文件名,現(xiàn)在已經(jīng)很少能看到它的蹤影了。FAT16能支持的分區(qū)容量為16 MB~2GB[4],F(xiàn)AT32能支持的分區(qū)容量為32MB~32 GB[4]。在本課題中可以靈活地選擇將SD卡格式化為FAT16或FAT32。
FatFs是在小型的嵌入式系統(tǒng)中的一個通用的FAT文件系統(tǒng)模塊[5],也 就是 FAT 文 件系統(tǒng)的驅(qū)動。它連接著頂層的應(yīng)用和底層的物理實現(xiàn)如圖2所示。FatFs的引入降低了在SD卡上借助文件系統(tǒng)實現(xiàn)讀寫功能的難度。如圖3所示,只需要實現(xiàn)底層SD卡的Ⅰ/O函數(shù)、RTC函數(shù)和頂層的應(yīng)用函數(shù)功能就可以實現(xiàn)FAT文件系統(tǒng)的移植。
圖2 FatFs模塊
下面簡要介紹FatFs模塊中的一些常用庫函數(shù)[5]。
①f_mount:用于裝載或卸載一個工作區(qū)域,在使用FatFs庫函數(shù)進行操作前須裝載一個工作區(qū)域,操作完畢后要卸載該工作區(qū)域。
②f_read,f_write:文件的讀寫函數(shù)。
③f_open:用于打開或創(chuàng)建一個文件,在使用f_read或f_write函數(shù)之前須使用f_open打開文件。
④f_close:關(guān)閉一個文件,在完成文件的讀寫操作過程后須使用此函數(shù)關(guān)閉該文件。
⑤f_mkfs:格式化磁盤。
⑥f_opendir,f_readdir,f_mkdir,f_chdir:作用依次是打開、讀取、創(chuàng)建和更改目錄。
⑦f_unlink:刪除一個文件或一個目錄。
本課題使用的是R0.08b版本的FatFs模塊,編譯調(diào)試軟件為TⅠ公司的CCS v3.3;硬件平臺是合眾達的DEC-138開發(fā)板,其使用的芯片便是本文一開始介紹的OMAP-L138處理器,同時也提供了SD卡的接口,滿足設(shè)計要求。
FatFs的移植工作主要是根據(jù)硬件平臺的不同對底層disk Ⅰ/O函數(shù)和RTC函數(shù)的編寫。完成上述工作后,在了解FatFs庫函數(shù)功能的情況下就可以根據(jù)自己需要編寫頂層的應(yīng)用函數(shù)。
3.2.1SD卡的初始化和讀寫函數(shù)
(1)初始化函數(shù)SD_Init
SD卡的初始化流程如圖3所示。分為初始化SD控制器和識別SD卡兩個主要步驟,其中關(guān)于SD卡識別中使用到的CMD的相關(guān)解釋請參見1.3.1小節(jié)。另外,流程圖中默認(rèn)在發(fā)送ACMD之前發(fā)送了CMD55。
(2)讀寫函數(shù)
圖3 SD卡初始化函數(shù)流程圖
SD卡讀/寫數(shù)據(jù)示意圖如圖4所示。對OMAPL138而言,SD卡數(shù)據(jù)的讀寫都要通過SD控制器上的FⅠFO,大小可設(shè)置為32字節(jié)或64字節(jié)。MMCDRR(MMC Data Receive Register,數(shù)據(jù)接收寄存器)和MMCDXR(MMC Data Transmit Register,數(shù)據(jù)發(fā)送寄存器)長度都是32位。在讀SD卡上的數(shù)據(jù)的時候,會先將SD卡的數(shù)據(jù)復(fù)制到FⅠFO中,然后 MMCDRR會分次將FⅠFO中的數(shù)據(jù)讀出并發(fā)送至Host;而在寫SD卡時,數(shù)據(jù)也會先放置在FⅠFO中,之后MMCDXR再依次把數(shù)據(jù)讀出來寫到SD卡中[6]。
圖4 SD卡讀/寫數(shù)據(jù)示意圖
SD卡的讀寫函數(shù)分為單塊和多塊,而多塊的讀寫實際上有兩種實現(xiàn)方法:
① 將多塊分成多個單塊來讀寫;
② 直接使用多塊讀寫CMD完成多塊的讀寫。
由于第一種方法在單塊數(shù)據(jù)讀寫之前須發(fā)送多次單塊讀寫CMD,而第二種方法只用在數(shù)據(jù)傳輸之前發(fā)送一個多塊讀寫CMD,并在數(shù)據(jù)傳輸終止處發(fā)送一個傳輸結(jié)束CMD,因此后者的速度明顯快于前者。
3.2.2diskI/O函數(shù)
disk Ⅰ/O函數(shù)的作用就是作為上層FatFs函數(shù)庫與底層存儲設(shè)備Ⅰ/O函數(shù)的紐帶。
(1)磁盤的初始化函數(shù)disk_initialize
初始化SD卡,此函數(shù)的參數(shù)為無符號char型的drv,目前版本的FatFs只支持單塊磁盤,其值只能為0。
(2)磁盤狀態(tài)獲取函數(shù)disk_status
用于獲取磁盤狀態(tài),編寫此函數(shù)時只需判斷drv是否為0。
(3)磁盤讀寫函數(shù)disk_read/disk_write
disk_read/disk_write函數(shù)流程如圖5所示。disk_read/disk_write即磁盤的讀寫函數(shù),其作用是將磁盤的讀寫操作包裝起來供FatFs模塊中的相關(guān)函數(shù)調(diào)用。
圖5 disk_read/disk_write函數(shù)流程圖
(4)磁盤I/O控制函數(shù)disk_ioctl
用于返回塊大小、扇區(qū)大小和容量的函數(shù)。最典型的應(yīng)用是在格式化函數(shù)f_mkfs中。函數(shù)f_mkfs需從disk_ioctl中得到2個參數(shù):磁盤的容量和扇區(qū)大小。只有disk_ioctl得到正確的參數(shù),f_mkfs才能將SD卡正確格式化。
(5)實時時間獲取函數(shù)get_fattime
此函數(shù)用于得到實時時鐘,以標(biāo)示文件的創(chuàng)建時間和修改時間。
本課題成功實現(xiàn)了基于OMAP-L138處理器的SD卡FAT文件系統(tǒng)的移植,使得該處理器對文件的讀寫簡單易行,對文件的管理事半功倍;此外,讓SD卡工作在SD模式下使得OMAP-L138在進行高速數(shù)據(jù)處理過后產(chǎn)生的數(shù)據(jù)能夠快速地存儲到SD卡中。FAT文件系統(tǒng)的成功移植也使OMAP-L138產(chǎn)生的數(shù)據(jù)能更高效地轉(zhuǎn)移至PC機上加以處理和備份。
[1]Texas Ⅰnstruments.OMAP-L138Low-Power Applications Processor[EB/OL].(2009-06)[2011-07].http://www.ti.com/cn/litv/pdf/sprs586b.
[2]Texas Ⅰnstruments.OMAP-L138Applications Processor System Reference Guide[EB/OL].(2010-10-16)[2011-07].http://www.ti.com/cn/litv/pdf/sprugm7d.
[3]SD Group and SD Association.SD Specifications Part 1 Physical Layer Simplified Specification Version 3.01[EB/OL].(2010-05-18)[2011-07].http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs.
[4]劉偉.數(shù)據(jù)恢復(fù)技術(shù)深度揭秘[M].北京:電子工業(yè)出版社,2010.
[5]FatFs Generic FAT File System Module[OL].[2011-07].http://elm-chan.org/fsw/ff/00index_e.html.
[6]Texas Ⅰnstruments.TMS320C674x/OMAP-L1xProcessor Multimedia Card(MMC)/Secure Digital(SD)Card Controller User's Guide [EB/OL].(2010-08)[2011-07].http://www.ti.com/cn/litv/pdf/sprufm2b.