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