摘 要: 一個基于ARM7的應(yīng)用于便攜式數(shù)據(jù)采集系統(tǒng)中的SD卡讀寫控制設(shè)計。描述了基于LPC2132、USB接口芯片D12和SD卡的硬件系統(tǒng)設(shè)計,軟件設(shè)計主要包括D12驅(qū)動、SPI總線協(xié)議實現(xiàn)和SD卡接口程序設(shè)計等。
關(guān)鍵詞: ARM;USB;SD卡協(xié)議
SD存儲卡(Secure Digital Memory Card)是為音視頻消費電子設(shè)備的安全性、容量、性能和環(huán)境等要求而設(shè)計的一種存儲卡,其安全系統(tǒng)使用雙方認(rèn)證和“新的密碼算法”技術(shù),防止卡中內(nèi)容被非法使用。SD卡的通信基于一個9引腳接口(時鐘、命令、4條數(shù)據(jù)線和3條電源線),可以在最高25 MHz頻率和低電壓范圍內(nèi)工作。在便攜式監(jiān)控系統(tǒng)中,SD卡可用來存儲監(jiān)控采集數(shù)據(jù)。
1 硬件系統(tǒng)設(shè)計
應(yīng)用于數(shù)據(jù)采集的SD卡讀寫控制結(jié)構(gòu)如圖1所示。使用ARM7芯片LPC2132[1]控制接口芯片D12處理SD卡存儲器。
ARM處理器:LPC2132是基于一個支持實時仿真和跟蹤的16/32位ARM7TDMI-S CPU,并帶有64 KB嵌入的高速Flash存儲器[2]。LPC2132的實時仿真和跟蹤功能方便了代碼調(diào)試,節(jié)省了開發(fā)成本。
**函數(shù)名稱:SD_Write_BlockData() uint8 SD_Write_BlockData(uint8*wrbuf,uint8 m)
PDIUSBD12是一款性價比高的USB器件,用于控制系統(tǒng)中與微控制器進(jìn)行通信的高速通用接口,支持本地DMA傳輸。PDIUSBD12所具有的低掛起功耗連同LazyClock輸出可以滿足使用ACPI、OnNOW和USB電源管理的要求,低操作功耗可以應(yīng)用于使用USB總線供電的外設(shè)。LPC2132與D12連接電路如圖2所示。
2 軟件設(shè)計
軟件設(shè)計主要包括D12驅(qū)動、SD卡、SPI總線協(xié)議和SD卡接口程序設(shè)計。
2.1 D12驅(qū)動的實現(xiàn)
USB協(xié)議規(guī)定了一些基本準(zhǔn)則,每個設(shè)備的端點0都是可用的,屬于控制端點。有了這個基本的溝通途徑,主機就開始通過端點0向設(shè)備發(fā)出一些獲得相關(guān)設(shè)備基本狀態(tài)的命令。這些基本狀態(tài)可以反映USB設(shè)備所屬的類別及子類,反映配置狀態(tài)、接口狀態(tài)和端點狀態(tài),主機按照USB協(xié)議建立設(shè)備間數(shù)據(jù)通道。主機向設(shè)備提出的這些命令實際上是USB協(xié)議中規(guī)定的各種標(biāo)準(zhǔn)請求,設(shè)備向主機傳送相應(yīng)的描述符,包括設(shè)備描述符、配置描述符、接口描述符、端點描述符等。
為了使軟件可移植性強、易維護(hù),采用了分層的方法編寫PDIUSBD12驅(qū)動程序。USB驅(qū)動程序分層結(jié)構(gòu)表如表1所示。
硬件接口(D12HAL.c)包含最底層的函數(shù)。D12命令接口(D12CI.c)實現(xiàn)PDIUSBD12的命令接口以簡化器件的編程。該層的函數(shù)及其功能如下:
(1)讀取芯片ID號:uint16 D12_ReadChipID(void)
(2)設(shè)置地址/使能:void D12_SetAddressEnable(UINT8 bAddress,UINT8 bEnable)
(3)設(shè)置端點使能:void D12_SetEndpointEnable(UINT8 bEnable)
(4)設(shè)置模式:void D12_SetMode(uint8 bConfig,uint8 bClkDiv)
協(xié)議層(Chap_9.c)和Descriptor.c用來處理標(biāo)準(zhǔn)的USB設(shè)備請求及特殊的廠商請求,如DMA等。USB主機通過標(biāo)準(zhǔn)USB設(shè)備請求,可設(shè)定和獲取USB設(shè)備的有關(guān)信息,完成USB設(shè)備的枚舉。
所有請求都是通過端點0接收和發(fā)送SETUP包完成的。接收主機SETUP包的函數(shù)為ep0_rxdone(),所有SETUP包都由函數(shù)control_handler()來處理,發(fā)送SETUP包的函數(shù)為ep0_txdone()。SETUP包的接收和發(fā)送通過控制傳輸結(jié)構(gòu)全局變量CONTROL_XFER ControlData來控制,它實現(xiàn)了以上3個函數(shù)之間的通信。CONTROL_XFER結(jié)構(gòu)體的定義如下:
typedef struct _control_xfer
{
DEVICE_REQUEST DeviceRequest; //USB設(shè)備請求
//結(jié)構(gòu)體,8 B
unsigned short wLength; //傳輸數(shù)據(jù)的總字節(jié)數(shù)
unsigned short wCount; //傳輸字節(jié)數(shù)統(tǒng)計
unsigned char*pData; //傳輸數(shù)據(jù)的指針
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
//請求的數(shù)據(jù)
} CONTROL_XFER;
應(yīng)用層(D12Driver.c)實現(xiàn)PDIUSBD12的所有功能。USB設(shè)備控制驅(qū)動、USB接口控制驅(qū)動和協(xié)議層都在應(yīng)用層的控制之中。應(yīng)用層要實現(xiàn)的任務(wù)包括:
(1)初始化PDIUSBD12,包括初始化PDIUSBD12的硬件連接、復(fù)位PDIUSBD12、配置PDIUSBD12的中斷服務(wù)程序地址、初始化應(yīng)用層相關(guān)的全局變量。
(2)編寫PDIUSBD12中斷服務(wù)程序,PDIUSBD12幾乎所有功能都通過PDIUSBD12中斷服務(wù)程序完成。因此中斷服務(wù)程序是應(yīng)用層的核心部分,也是本驅(qū)動程序的核心部分。它要完成以下任務(wù):
①控制端點數(shù)據(jù)接收與發(fā)送中斷服務(wù)程序,負(fù)責(zé)處理控制傳輸?shù)挠嘘P(guān)工作;
②端點1和端點2數(shù)據(jù)接收與發(fā)送中斷服務(wù)程序;
③USB總線掛起、復(fù)位、DMA結(jié)束中斷服務(wù)程序;
④用戶讀寫端點1和端點2的API函數(shù);
⑤傳輸控制處理任務(wù),該任務(wù)用于處理枚舉、標(biāo)準(zhǔn)任務(wù)請求、廠商請求等傳輸控制。
2.2 SD卡總線協(xié)議的實現(xiàn)
SD存儲卡系統(tǒng)定義了SD和SPI兩種通信協(xié)議,應(yīng)用時可以選擇其中一種模式。SD卡能使用兩種總線協(xié)議,因此涉及到協(xié)議選擇問題。SD卡總是在SD模式下被喚醒,如果系統(tǒng)想要使用SPI模式來對SD卡進(jìn)行操作,則系統(tǒng)應(yīng)該在向SD卡發(fā)送復(fù)位命令(CMD0)期間,保持CS信號有效(低電平),這樣SD卡將進(jìn)入SPI模式。如果想從SPI模式切換回SD模式,只能對卡掉電再上電。圖3為SD卡讀寫操作圖。
2.2.1 SD總線
SD總線上的數(shù)據(jù)通信是基于以起始位開始、以停止位結(jié)束的數(shù)據(jù)位流。
命令:命令是啟動一項操作的令牌。命令可以從主機發(fā)送到一張卡(尋址命令)或發(fā)送到連接的所有卡(廣播命令)。命令在CMD線上串行傳輸。
響應(yīng):響應(yīng)是從被尋址的卡或(同時)從所有連接的卡發(fā)送到主機,作為對接收到的命令的回答的令牌。響應(yīng)在CMD線上串行傳輸。
數(shù)據(jù):數(shù)據(jù)可以從卡發(fā)送到主機或者相反。
SD存儲卡的數(shù)據(jù)傳輸通過塊的形式進(jìn)行。數(shù)據(jù)塊后面通常有CRC位,它定義了單塊和多塊操作。在快速寫操作中使用多塊操作模式最理想。當(dāng)CMD線出現(xiàn)停止命令時,多塊傳輸結(jié)束。主機可以配置數(shù)據(jù)傳輸是使用一條還是多條數(shù)據(jù)線。SD模式讀操作如圖3(a)所示。
2.2.2 SPI總線
SPI信道是面向字節(jié)的。每個命令或數(shù)據(jù)塊都由8位的字節(jié)組成,而且字節(jié)與CS信號對齊(即長度是8個時鐘周期的倍數(shù))。與SD協(xié)議相似,SPI報文由命令、響應(yīng)和數(shù)據(jù)塊令牌組成。主機和卡之間的所有通信都由主機控制。主機通過將CS信號置低電平啟動總線處理。
SPI模式中的響應(yīng)行為在以下三個方面與SD模式不同:
(1)被選中的卡總會響應(yīng)命令。
(2)使用兩種新的響應(yīng)結(jié)構(gòu)(8 bit和16 bit)。
(3)當(dāng)卡遇到數(shù)據(jù)檢索錯誤時會用錯誤響應(yīng)(替代要求的數(shù)據(jù)塊),而不是用SD模式中的超時響應(yīng)。
SPI模式支持單塊和多塊的寫命令。在接收有效的寫命令前,卡會用響應(yīng)令牌響應(yīng),并等待主機發(fā)送數(shù)據(jù)塊。CRC后綴、塊的長度和起始地址的限制都與讀操作相同。SPI模式寫操作如圖3(b)所示。
在接收到數(shù)據(jù)塊后,卡會用數(shù)據(jù)響應(yīng)令牌響應(yīng)。如果數(shù)據(jù)塊被無錯接收,它將被燒寫(/編程)到卡中。在卡燒寫(/編程)期間,卡會向主機發(fā)送連續(xù)的忙令牌流(有效地保持DataOut線為低電平)。SPI模式寫操作函數(shù)如下:
/***********************
**功能描述:寫塊數(shù)據(jù)
**入口參數(shù):wrbuf 寫緩沖區(qū) m=0 寫單塊 m=1 寫多塊
**出口參數(shù):操作是否成功
***********************
{
SPI_CS_Assert();
if(m==0)
SPI_Send_Byte(SD_TOK_WRITE_
STARTBLOCK); //發(fā)寫單塊令牌
else
SPI_Send_Byte(SD_TOK_WRITE_STARTBLOCK_M);
for(i=0;i
根據(jù)大容量傳輸協(xié)議的需求,對SD卡的操作只需要實現(xiàn)卡的初始化(包括進(jìn)入SPI模式并獲得卡的有關(guān)信息);向卡發(fā)命令;向卡指定地址寫數(shù)據(jù);從卡指定地址讀出數(shù)據(jù)。SD卡初始化程序的調(diào)用建立在SPI接口已初始化的基礎(chǔ)上。
為了可以兼容MMC卡,在初始化的過程中必須把SPI時鐘設(shè)置為低于400 kHz,在初始化結(jié)束時,再恢復(fù)到SPI的最大時鐘速率。這個時鐘速率應(yīng)該低于CSD寄存器中TRAN_SPEED字段的值。
在ARM7LPC2132嵌入式控制器硬件平臺上,實現(xiàn)了對SD卡的讀寫控制、D12驅(qū)動,在SD和SPI總線協(xié)議方式下,提供相關(guān)的硬件設(shè)計和SD卡接口程序設(shè)計方法,為數(shù)據(jù)采集系統(tǒng)中的數(shù)據(jù)存儲提供了一種方便、可靠的方案。
參考文獻(xiàn)
[1] 周立功,張華.深入淺出ARM7——LPC213X/214X(上)(下).北京:北京航空航天大學(xué)出版社,2006.
[2] 周立功.ARM嵌入式系統(tǒng)基礎(chǔ)教程.北京:北京航空航天大學(xué)出版社,2005.
[3] 周立功.PDIUSBD12 USB固件編程與驅(qū)動開發(fā).北京:北京航空航天大學(xué)出版社,2003.