当前位置:文档之家› SD卡编程指南

SD卡编程指南

SD卡编程指南——如何使用MMC/SDC2011-11-05 苏勇安全数字存储卡(Secure Digital Memory Card,SDC)作为事实上的标准存储卡广泛应用于移动设备上。

SDC曾作为高层兼容多媒体卡(Multi Media Card,MMC)进行开发。

SDC设备一般也兼容MMC。

还存在一些功能相同但尺寸更小的版本,如RS-MMC、miniSD和microSD。

MMC/SDC内置一个微控制器,读取、写入、错误控制和功耗平衡(Wearleveling))。

数据以512字节为单位在存储卡与主机控制器之间传输,从高层看来,卡可以被看作是通用硬盘设备。

当前定义的用于存储卡的文件系统为FAT12/16并使用FDISK分区规则。

FAT32仅用于大容量卡(>=4G)。

本文讲述作者在小型嵌入式系统中使用MMC/SDC中的基本知识和一些琐碎的内容。

作者相信,这些信息对于即将在电子硬件工程中使用MMC/SDC的人会有一些帮助。

1. 引脚下图展示了SDC/MMC的外观,MMC有7个引脚,SDC有9个引脚。

其中三个引脚为电源引脚,故负责通信的引脚MMC有4个,SDC有6个。

主机与卡之间的通信是通过同步串行接口实现的。

工作电源电压范围是有工作状况寄存器(Operation Conditions Register,OCR)指示的,应读该寄存器并确定工作电压范围。

无论怎样,电源应固定在3.0/3.3V,因为所有的MMC/SDC的电源至少是在2.7~3.6V的范围内。

在执行写入操作时,电流消耗能达到几十毫安,因此,主机系统应至少保证能够为卡提供100mA的电流供应。

2. 命令与应答在SPI模式下,信号线上的数据方向是确定的,数据按字节以串行方式传输。

从主机传向卡的命令帧是定长(6个字节)数据包,如下图所示。

当一个命令帧被传送到卡上,命令的应答(R1,R2或R3)从卡上反馈回主机。

由于数据传输是有主机产生的串行时钟驱动的,主机需在读到有效的应答之前保持读取状态以提供时钟,DI信号线上在读通信过程中保持高电平(发送0xFF交换数据)。

应答应在命令响应时间内(NCR)反馈回来,对于SDC为0到8个字节,对于MMC为1到8个字节。

,CS信号线上的电平需在发送命令帧之前被拉低,并在通信过程中(发送命令,接收应答及读写数据)保持低电平。

在SPI模式下,CRC校验功能是可选的,但是CRC字段始终要填充内容以构成一个完整的命令帧。

2.1 常用的SPI模式命令(1)命令由6个字节组成:01+6位命令号+4个字节的命令参数+7位校验码+结束位1。

(2)命令分为10个类:SPI支持:类0——基本控制(0复位、1激活初始化、9读CSD寄存器、10读CID寄存器、12多块过程中停止传输、13读状态寄存器);类2——块读(16设置块长度、17读一个数据块、18读多个数据块,直到发命令12);类4——块写(24写块、25写多个块、27写CSD的可编程为);类5——擦除(32设置擦除块的起始地址、33设置终止块地址、38擦除先前选择的所有块);块6——写保护(可选28设置写保护、29清除写保护、30读写保护状态);类7——锁卡命令(可选42上锁或者解锁);类8——指定应用(55通知SD卡下个是特殊应用命令、56获取或写入一个数据块);类10与类11——保留。

其中,SPI模式不支持类1,类3,类9。

2.2 SPI命令的响应状态有三种命令应答的格式,R1(1个字节)、R2(两个字节)和R3 R3(五个字节),因发送命令而不同。

大部分命令的响应是R1,R1的位段如下图所示,值为0x00表示运行成功,否则由相应状态位置1标识错误。

读取状态寄存器响应R2,只有读取32位的OCR(命令58)使用应答R3。

一些命令的执行时间比NCR长,它们使用应答R1B(1个字节)。

R1B同R1类似(有些命令只需要0或非0反馈,就用R1B,比如停止传输、擦除等命令),即为R1跟在忙标志后(在内部执行命令时DO保持低电平)。

主控制器应等待命令执行完毕直到DO转为高电平3. SPI模式下的初始化过程上电复位之后,MMC/SDC进入原生工作模式(SD模式)。

若要进入SPI模式,须如下图所示执行过程。

3.1 上电(插卡)卡供电达到2.2V以上后,还需等待至少1毫秒才能接收命令。

设定主机控制器的SPI 时钟频率在100kHz到400kHz之间。

设定DI和CS为高电平,同时发送至少74个时钟脉冲到SCLK上。

此时,卡将进入原生工作模式(SD模式)并准备接收原生命令。

3.2 软件复位在CS为低电平时发送命令0,对卡进行复位。

卡在接收命令0成功时对CS信号采样,若CS信号为电平,则卡进入SPI模式并且回应R1进入空闲状态(R1=0x01)。

由于命令0必须作为原生命令发送,CRC字段必须包含有效值。

卡一旦进入SPI模式,CRC功能就被关闭,不再进行CRC校验。

命令0和命令8需要CRC校验时,可将该字段写0。

命令59可以启动CRC功能。

3.3 初始化在空闲状态,卡只接收命令0、命令1、命令41、命令58和命令59。

其它的命令被拒绝执行。

此时,读OCR寄存器并查看卡的工作电压。

若系统供电不在卡的正常供电范围,则卡不工作。

注意,所有的卡工作电压范围为2.7~3.6V。

当接收到命令1时,卡执行初始化过程。

若要检测初始化过程是否结束,主机需持续发送命令1并查看回应直到初始化结束。

当卡成功完成初始化,应答R1的空闲状态位将清零(R1由0x01变为0x00)。

初始化过程将持续几百毫秒(卡容量越大,时间越长),故而需要考虑超时时间的设定。

在空闲状态位被清零后,卡可以接收正常的读写命令。

对于SDC建议时候用命令41(ACMD41)取代命令1,若命令41被拒绝后在用命令1尝试,在理想情况下,所有的卡都支持这两个命令。

若要提高对卡的读写性能,可将SPI通信速率尽量提高。

CSD寄存器中的TRAN_SPEED 字段指示了卡支持的最大工作频率。

大多数情况下,MMC最大工作频率为20MHz,SDC最大工作频率为25MHz。

注意,在SPI模式下时钟需要确定为20/25MHz,因为没有开环条件限制时钟频率。

对于2GB容量的卡,初始读写块长度为1024,这就需要使用命令16将读写块长度重新设定为512以适应FAT文件系统的工作要求。

3.4 支持SDC v2和高容量的卡卡通过命令0进入空闲状态后,以0x000001AA为参数发送命令8并发送正确的CRC,之后进入初始化进程。

若命令8被拒绝并回应非法命令错误(0x05),则表示此卡可能为SDC v1或是MMC。

若命令8被接收,并回应R7(R1(0x01)后跟着32位数据),返回值的低12位为0x1AA,则表示此卡为SDC v2,工作电压范围为2.7~3.6V。

否则,此卡将拒绝访问,此时,可使用以HCS(位30)为参数发送命令41(ACMD41)进行初始化。

完成初始化后,读OCR寄存器并检查CCS(位30),若该位置1,则下文说明的子序列数据读取操作中将使用块地址而不是字节地址。

块地址固定为512字节。

4. 数据传输4.1 数据包与数据回应在数据通信过程中,命令回应后将会有一个或多个数据块被发送/接收。

数据块以数据包发送。

数据包包含令牌(Token)、数据块(Data Block)和CRC校验码,数据包格式如下图所示。

停止传输令牌(Stop Tran Token)表示写入多个块的结束,以单个字节使用而无需数据块和CRC字段。

4.2 读单个块参数指定读取内容的起始地址,以字节或块为单位。

扇区地址是由高层指定的。

当命令17被接收,一个读操作即被启动并将读到数据发送到主机。

检测到有效的令牌后,主机控制器接收数据域和两个字节的CRC。

若不需要进行CRC校验,CRC字段数值必须被填充为偶数。

在读操作过程中,若发生错误,则将返回错误令牌而不是数据包。

4.3 读多个块读多块命令可以从指定地址连续读多个块。

在执行读命令之前,若未指定读取块的数量,传输过程将作为一个开放结束的多块读操作启动,读操作将连续执行,直到发送命令12结束。

发送命令12后,紧接着接收到(交换)的是一个填充字节,在接收到命令12的回应之前应将其抛弃。

4.4 写单个块当卡成功接收一个写命令时,主机控制器在一个空字节后发送数据包,发送数据包格式与块写入命令的格式相同。

若未启动CRC校验功能,CRC字段可以为任何值。

当主机发送一个数据包,卡将在接收数据包后立刻回应一个数据应答,数据应答跟随一个处理写操作的忙标志位。

大多数卡不能被更改写入块的大小,一般固定为512字节。

在基本的SPI模式下,CS信号在传输过程中应为有效,但存在一个例外。

当卡为忙时,主控制器可以关闭CS信号以释放与卡的SPI总线连接供其它SPI设备使用。

在进行内部处理过程中,卡将再次拉低DO信号。

由此,一个预先的忙查询过程(等待准备好后立刻发送命令或数据)取代消极地等待将有效地减少浪费时间。

附加的一个内部过程是在数据回应后发送的一个字节,这以为着启动内部写操作需要8个时钟驱动。

在8个时钟期间,CS信号的状态为无效,以便执行上述的释放总线的过程。

4.5 写多个块多块写命令将按序在指定地址上写入多个块。

若未指定写入块的数量,则写如过程将以开放结束多块写入(open-ended multiple block write)命令开始,连续写入多块数据,以停止传输令牌(Stop Tran token)结束。

在停止传输令牌发送后的一个字节,DO信号线上将会有忙标志。

对于SDC,对块写通信过程必须以一个结束传输令牌结束,与传输类型、预定义或是开放结束无关。

4.6 读CSD和CID读CSD和CID与单块读命令相同,但是读取长度不同。

CSD和CID以16字节的数据块发送给主机控制器。

关于命令(CMD)、CID和OCR,请参见MMC/SDC的说明。

5. 关于总线悬空与热插拔任何可能悬空的信号都应该通过一个上拉/下拉电阻设定初始电平,对于MOS设备,这是一个通用的设计标准。

由于DI和DO在默认情况下为高电平,所以它们应被上拉。

根据SDC/MMC的说明,上拉电阻的阻值建议为50K~100K ohms。

但是,在SDC/MMC说明中未提到时钟信号,这是由于这个信号始终是由主机控制器驱动。

如果有可能悬空,应被拉低到默认状态。

MMC/SDC支持热插拔,但需要考虑主机电路得避免误操作。

例如,若系统供电(Vcc)直接连在卡的接口上,Vcc将在卡接入的一瞬间被拉低,这是因为卡内部的电容上流过充电电流造成的,如A图所示,图中示波器显示电压下降了600mV,这已经足够触发掉电检测了。

B图所示为一个电感插入到接口电路中,瞬间压降为200mV。

一个小的ESR电容,比如6. 考虑多从机配置在SPI总线上,每个从机信号由CS信号选中,可以有多个设备挂载到SPI总线上。

相关主题