SD卡是Secure Digital Card卡的简称,直译成汉语就是"安全数字卡",是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器材等等,尤其是被广泛应用在超薄数码相机上。SD卡在外形上同MultiMedia Card卡保持一致,大小尺寸比MMC卡略厚,容量也大很多。并且兼容MMC卡接口规范。不由让人们怀疑SD卡是MMC升级版。另外,SD卡为9引脚,目的是通过把传输方式由串行变成并行,以提高传输速度。它的读写速度比MMC卡要快一些,同时,安全性也更高。SD卡的特点就是通过加密功能,可以保证数据资料的安全保密。它还具备版权保护技术,所采用的版权保护技术是DVD中使用的CPRM技术(可刻录介质内容保护)。
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协议中规定的各种标准请求,设备向主机传送相应的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符等。
为了使软件可移植性强、易维护,采用了分层的方法编写PDIUSBD12驱动程序。USB驱动程序分层结构表如表1所示。

硬件接口包含层的函数。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)
所有请求都是通过端点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卡身材小巧,一般消费者在购买之前不会有太多了解,因此从外观上辨别有些困难,下面为大家介绍一下市场上常见的SanDisk牌SD卡真假的辨别方法: 首先是看存储卡本身, sandisk储存卡都在正面贴有激光变彩标签,不同角度都会产生激光色彩变化。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的处理流程大同小异,以目前使用多的SPI-4为例来说明SPI的原理。它在发送接口和接收接口都有各自的数据通道和流控状态信息通道,其数据通道和流控状态信息通道是独立的并且是点对点通信。数据是以包的形式发送,根据数据包中的内嵌地址可支持高达256个端口,以下分别说明基本协议及数据通道和流控状态信息的处理过程。
SPI模式中的响应行为在以下三个方面与SD模式不同:
(1)被选中的卡总会响应命令。
(2)使用两种新的响应结构(8 bit和16 bit)。
(3)当卡遇到数据检索错误时会用错误响应(替代要求的数据块),而不是用SD模式中的超时响应。
SPI模式支持单块和多块的写命令。在接收有效的写命令前,卡会用响应令牌响应,并等待主机发送数据块。CRC后缀、块的长度和起始地址的限制都与读操作相同。SPI模式写操作如图3(b)所示。
在接收到数据块后,卡会用数据响应令牌响应。如果数据块被无错接收,它将被烧写(/编程)到卡中。在卡烧写(/编程)期间,卡会向主机发送连续的忙令牌流。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

根据大容量传输协议的需求,对SD卡的操作只需要实现卡的初始化(包括进入SPI模式并获得卡的有关信息);向卡发命令;向卡指定地址写数据;从卡指定地址读出数据。SD卡初始化程序的调用建立在SPI接口已初始化的基础上。在ARM7LPC2132嵌入式控制器硬件平台上,实现了对SD卡的读写控制、D12驱动,在SD和SPI总线协议方式下,提供相关的硬件设计和SD卡接口程序设计方法,为数据采集系统中的数据存储提供了一种方便、可靠的方案。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。