基于ARM7的SD卡读写控制在数据采集系统中的应用
一个基于ARM7的应用于便携式数据采集系统中的SD卡读写控制设计。描述了基于LPC2132、USB接口芯片D12和SD卡的硬件系统设计,软件设计主要包括D12驱动、SPI总线协议实现和SD卡接口程序设计等。
关键词: ARM;USB;SD卡协议
SD存储卡(Secure Digital Memory Card)是为音视频消费电子设备的安全性、容量、性能和环境等要求而设计的一种存储卡,其安全系统使用双方认证和“新的密码算法”技术,防止卡中内容被非法使用。SD卡的通信基于一个9引脚接口(时钟、命令、4条数据线和3条电源线),可以在最高25 MHz频率和低电压范围内工作。在便携式监控系统中,SD卡可用来存储监控采集数据。
1 硬件系统设计
应用于数据采集的SD卡读写控制结构如图1所示。使用ARM7芯片LPC2132[1]控制接口芯片D12处理SD卡存储器。
ARM处理器:LPC2132是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-S CPU,并带有64 KB嵌入的高速Flash存储器[2]。LPC2132的实时仿真和跟踪功能方便了代码调试,节省了开发成本。
PDIUSBD12是一款性价比高的USB器件,用于控制系统中与微控制器进行通信的高速通用接口,支持本地DMA传输。PDIUSBD12所具有的低挂起功耗连同LazyClock输出可以满足使用ACPI、OnNOW和USB电源管理的要求,低操作功耗可以应用于使用USB总线供电的外设。LPC2132与D12连接电路如图2所示。
2 软件设计
软件设计主要包括D12驱动、SD卡、SPI总线协议和SD卡接口程序设计。
2.1 D12驱动的实现
USB协议规定了一些基本准则,每个设备的端点0都是可用的,属于控制端点。有了这个基本的沟通途径,主机就开始通过端点0向设备发出一些获得相关设备基本状态的命令。这些基本状态可以反映USB设备所属的类别及子类,反映配置状态、接口状态和端点状态,主机按照USB协议建立设备间数据通道。主机向设备提出的这些命令实际上是USB协议中规定的各种标准请求,设备向主机传送相应的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符等。
为了使软件可移植性强、易维护,采用了分层的方法编写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接收和发送SETUP包完成的。接收主机SETUP包的函数为ep0_rxdone(),所有SETUP包都由函数control_handler()来处理,发送SETUP包的函数为ep0_txdone()。SETUP包的接收和发送通过控制传输结构全局变量CONTROL_XFER ControlData来控制,它实现了以上3个函数之间的通信。CONTROL_XFER结构体的定义如下:
typedef struct _control_xfer
{
DEVICE_REQUEST DeviceRequest; //USB设备请求
//结构体,8 B
unsigned short wLength; //传输数据的总字节数
unsigned short wCount; //传输字节数统计
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中断服务程序完成。因此中断服务程序是应用层的核心部分,也是本驱动程序的核心部分。它要完成以下任务:
①控制端点数据接收与发送中断服务程序,负责处理控制传输的有关工作;
②端点1和端点2数据接收与发送中断服务程序;
③USB总线挂起、复位、DMA结束中断服务程序;
④用户读写端点1和端点2的API函数;
⑤传输控制处理任务,该任务用于处理枚举、标准任务请求、厂商请求等传输控制。
2.2 SD卡总线协议的实现
SD存储卡系统定义了SD和SPI两种通信协议,应用时可以选择其中一种模式。SD卡能使用两种总线协议,因此涉及到协议选择问题。SD卡总是在SD模式下被唤醒,如果系统想要使用SPI模式来对SD卡进行操作,则系统应该在向SD卡发送复位命令(CMD0)期间,保持CS信号有效(低电平),这样SD卡将进入SPI模式。如果想从SPI模式切换回SD模式,只能对卡掉电再上电。图3为SD卡读写操作图。
2.2.1 SD总线
SD总线上的数据通信是基于以起始位开始、以停止位结束的数据位流。
命令:命令是启动一项操作的令牌。命令可以从主机发送到一张卡(寻址命令)或发送到连接的所有卡(广播命令)。命令在CMD线上串行传输。
响应:响应是从被寻址的卡或(同时)从所有连接的卡发送到主机,作为对接收到的命令的回答的令牌。响应在CMD线上串行传输。
数据:数据可以从卡发送到主机或者相反。
SD存储卡的数据传输通过块的形式进行。数据块后面通常有CRC位,它定义了单块和多块操作。在快速写操作中使用多块操作模式最理想。当CMD线出现停止命令时,多块传输结束。主机可以配置数据传输是使用一条还是多条数据线。SD模式读操作如图3(a)所示。
2.2.2 SPI总线
SPI信道是面向字节的。每个命令或数据块都由8位的字节组成,而且字节与CS信号对齐(即长度是8个时钟周期的倍数)。与SD协议相似,SPI报文由命令、响应和数据块令牌组成。主机和卡之间的所有通信都由主机控制。主机通过将CS信号置低电平启动总线处理。
SPI模式中的响应行为在以下三个方面与SD模式不同:
(1)被选中的卡总会响应命令。
(2)使用两种新的响应结构(8 bit和16 bit)。
(3)当卡遇到数据检索错误时会用错误响应(替代要求的数据块),而不是用SD模式中的超时响应。
SPI模式支持单块和多块的写命令。在接收有效的写命令前,卡会用响应令牌响应,并等待主机发送数据块。CRC后缀、块的长度和起始地址的限制都与读操作相同。SPI模式写操作如图3(b)所示。
在接收到数据块后,卡会用数据响应令牌响应。如果数据块被无错接收,它将被烧写(/编程)到卡中。在卡烧写(/编程)期间,卡会向主机发送连续的忙令牌流(有效地保持DataOut线为低电平)。SPI模式写操作函数如下:
/***********************
**函数名称:SD_Write_BlockData()
**功能描述:写块数据
**入口参数:wrbuf 写缓冲区 m=0 写单块 m=1 写多块
**出口参数:操作是否成功
***********************
uint8 SD_Write_BlockData(uint8*wrbuf,uint8 m)
{
SPI_CS_Assert();
if(m==0)
SPI_Send_Byte(SD_TOK_WRITE_
STARTBLOCK); //发写单块令牌
else
SPI_Send_Byte(SD_TOK_WRITE_STARTBLOCK_M);
for(i=0;i SPI_Send_Byte(wrbuf);
i=SD_GetCRC16(wrbuf,SD_BLOCKSIZE);
//生成CRC校验
SPI_Send_Byte((i>>8) & 0xFF);//发校验和
……
SPI_CS_Deassert();
if (SD_WaitBusy() != SD_NO_ERROR)
return tiMEOUT_ERROR; /*写入超时 write time out*/
else
return SD_NO_ERROR;
}
该函数在发送写命令后被调用。首先根据用户请求,向SD卡发送写单块还是写多块的令牌,随后将数据跟在令牌后面发到SD卡。在发送完毕后调用SD_WaitBusy()函数,用以等待SD卡写完成。如果超时就返回一个错误代码。
2.3 SD卡接口及初始化程序设计
SD卡通过卡座与MCU连接,卡座连线如图4所示。J12为卡座;CMD/DI和DAT0/DO两条数据线分别接上拉电阻,确保数据稳定;CARD_INSERT为卡完全插入卡座检测线,为高电平时表明无卡;CARD_WP为写保护检测脚,高电平时表示卡被写保护;DAT3/CS为SD卡使能引脚,低电平时卡被选中,使用SPI总线方式;DAT1/IRQ和DAT2通过电阻接地,SD卡的电源不直接与3.3 V相连,MUC可以通过IO口来控制是否为SD卡供电,这样可以方便地对SD卡进行重起操作。
根据大容量传输协议的需求,对SD卡的操作只需要实现卡的初始化(包括进入SPI模式并获得卡的有关信息);向卡发命令;向卡指定地址写数据;从卡指定地址读出数据。SD卡初始化程序的调用建立在SPI接口已初始化的基础上。
为了可以兼容MMC卡,在初始化的过程中必须把SPI时钟设置为低于400 kHz,在初始化结束时,再恢复到SPI的最大时钟速率。这个时钟速率应该低于CSD寄存器中TRAN_SPEED字段的值。
在ARM7LPC2132嵌入式控制器硬件平台上,实现了对SD卡的读写控制、D12驱动,在SD和SPI总线协议方式下,提供相关的硬件设计和SD卡接口程序设计方法,为数据采集系统中的数据存储提供了一种方便、可靠的方案。
0