基于S3C2410控制器实现SDMMC卡驱动的设计

基于S3C2410控制器实现SDMMC卡驱动的设计,第1张

引言

MMC、SD卡和SDHC卡都是基于Flash技术的新一代存储器,具有体积小、容量大、数据传输快、移动灵活等优点,是许多便携式电子仪器理想的外部存储介质.在数码相机、MP3、手机与大容量存储设备中被广泛使用。MMC卡是基于NAND快闪记忆技术开发的存储卡:SD卡是在MMC卡的基础上开发研制的一款具有大容量、高性能、安全性好等特点的多功能存储卡.存储容量最高可达4G:SDHC是高容量SD存储卡.SD2.0系统规范中规定SDHC卡的容量范围为大于2GB小于等于32GB.速度最高可达25MB/秒。近年来.虽然MMC卡技术已逐渐被SD卡所代替.但SD卡接口向下兼容MMC卡.因此MMC卡仍在很多应用场合使用。SD/MMC卡有SD和SPI两种通信模式。前者可获得比后者更高的通信速率。目前的SD/MMC接口多采用SPI通信模式。为了能获得更快的卡访问速度.并且在同一个接口中支持对MMC、SD和SDHC三类卡的访问,笔者基于S3C2410控制器设计并实现了一个采用SD通信模式的通用的SD/MMC卡驱动。下面具体描述该驱动的实现过程。

1 S3C2410片内SD接口

S3C2410是三星公司的16/32位RISC控制器,它内部具有丰富的系统外围设备控制器.包括一个SD接口(SDI)。该SDI兼容SD1.0、MMC2.1l、SDIO1.0规范:支持l位/4位数据总线模式以及块,流读写模式切换:SD时钟最高达25MHz,MMC时钟最高达10MHz。SDI内部寄存器众多.主要分为三大类:通用控制类寄存器,如:控制寄存器、波特率预分频因子寄存器等:命令控制类寄存器,如:命令参数寄存器、命令控制寄存器、命令状态寄存器、4个命令响应寄存器;数据传输类寄存器,如:数据控制寄存器、数据状态寄存器、FIFO状态寄存器、数据寄存器。主机通过这些寄存器完成卡命令的发送、接收卡回送的响应以及与卡进行数据交换。

2 S3C2410 与 SD/MMC卡的SD模式接口电路

2.1 SD总线通信模式下卡引脚定义

虽然SD/MMC卡有两种通信模式.但在具体通信过程中主机只能选择其中一种通信模式。不同模式下各引脚的功能不完全相同。表1为SD模式下的卡引脚定义。

表1 SD模式下卡的引脚定义

基于S3C2410控制器实现SDMMC卡驱动的设计,基于S3C2410控制器实现SD/MMC卡驱动的设计,第2张

MMC卡除了接口中没有第8和第9脚外,其余与SD卡接口相同。

2.2 SD通信模式下的SD/MMC卡接口电路

S3C2410与SD/MMC卡座的接口电路如图1所示。接口电路原理图说明如下:


 

基于S3C2410控制器实现SDMMC卡驱动的设计,基于S3C2410控制器实现SD/MMC卡驱动的设计,第3张

图1 SD/MMC卡SD模式接口电路原理图

CD/DAT3(第1脚)通过10KΩ电阻上拉到3.3V,使SD/MMC卡上电后自动进入SD模式。本接口中该引脚用于卡上电后的模式选择。

CLK(第5脚)为时钟输入信号,SDCMD(第2脚)为命令响应线,DATO-DAT;涕7,8,9引脚加上CD/DAT3组成4位数据线。

CD(第10脚)为卡插入检测信号。由于CD/DAT3引脚用于模式选择,故在卡座中增加该引脚作为卡检测信号。由于该引脚被上拉,当卡未插入卡座内时,从INT0/GPF0引脚读到的是高电平;当卡完全插入到卡座内时,卡座内部触点接地,则从INT0/GPF0读到的是低电平。通常通过检测该引脚的电平值来判断卡的动态拔插动作。

WP(第12脚)为卡座中增加的卡写保护检测信号.检测原理与CD脚相同。应当注意,SD/MMC卡并不检测该引脚,因此.卡写保护控制必须由主机实现。在设计SDfMMC卡座接12时。WP不是必需的。

为保证输入的稳定性.除VCC、VSS1和VSS2、GND外的引脚均通过10Kfl上拉到3.3V。

3 S3C2410与SD/MMC的通信实现

在SD/MMC卡与主机的通信过程中.卡一直是从设备.由主机发送命令来控制它。当S3C2410(下称主机)以查询方式获取卡已插入卡座.或者当卡插人卡座后通过CD引脚发送中断给主机后.主机首先应完成卡的初始化.之后才能对卡上的数据进行读写。

3.1 卡的初始化和识别

SD/MMC卡在上电后进入空闲状态(Idle State)。此时.主机需要按照一定的处理流程完成卡的初始化。该过程主要的工作就是卡的识别(Card IdenTIficaTIon),包括识别卡的类型、读取卡上的信息、为卡分配地址等。卡的初始化处理流程见图2。

图2 卡初始化处理流程

在卡识别过程中.首先发送CMD8命令判断卡是否支持V2.00及以上协议。关键语句如下(语句中的SD_HC_SEND_IF_COND为CMD8命令描述的简写,其余同):

SdmmcSendCmd(SD_HC_SEND_IF_COND,0x1aa);

if((rSDIRSPO & Ox1aa) == 0x1aa ) {/* V2.00及以上协议卡 */

。..。..

}

此处CMD8命令参数中bit[7]一[0]为0/1交替的0blOl01010即0xaa.是推荐使用的检测模式;bit[1l]-[8]则用于检测卡能否在主机提供的电压下运行,Ob0001表示2.7-3.6V电压.其他取值目前不可用.若卡支持v2.00及以上协议.且能够在指定的电压下运行.则返回0xlaa。

V2.00及以上协议的卡有两种类型:标准SD卡和SDHC卡。由于本驱动支持SDHC卡,在发送ACMD41命令时,将其参数中的HCS域(第30位)置为1。判断语句如下:

SdmmcSendCmd(MMC_APP_CMD,SDmmcCardRca);

SdmmcSendCmd(SD_APP_OP_COND,Ox40ff8000);

if(rSD1RSPO==0xcOff8000){

SdmmcCardType=HC_SD_CARD; /* SDHC CARD */

。..。..;

}

else if(rSDIRSP0 == Ox80ff8000){

SdmmcCardType = SD_CARD;/*S D CARD */

}

由于ACMD41命令为扩展命令.故需要在该命令前面发送MMC_APP_CMD(CMD55)命伽知卡后面紧跟的命令为扩展命令。

若卡不响应CMD8.则有可能是MMC卡或V2.00以下的SD卡。由于SD卡支持ACMD命令.而MMC卡不支持该命令。故当卡能正确响应时.则可判断为SD卡。判断语句如下:

SdmmcSendCmd(MMC_APP_CMD,SdmmcCardRca);

SdmmcSendCmd(SD_APP_OP_COND,OxOOff8000);

if(rSDIRSP0 == 0x80ff8000){

SdmmcCardType = SD_CARD; /* SD卡 */

⋯⋯⋯:

}

在识别完卡的类型后.便可发送CMD2获取卡标识等后续共同的初始化过程.

3.2 卡的读 *** 作

在初始化和识别完成后并被选中后,SD/MMC卡进入传输模式.此时主机可使用读命令来读取卡上数据。每次读 *** 作通常以块(一般为512字节)为单位。MMC卡还可以按字节流的方式读取。若一次读取的数据在一块以内,可使用单块读命令:若超过一块.则应使用多块读命令.此时还应在接收完预期数据后给卡发送停止传输命令(CMDl2)通知卡停止传送数据。

读命令的4字节参数为欲读取数据的地址。MMC卡和SD卡的最大容量为4G,地址以字节为单位,通常与512对齐。SDHC卡的容量为2G-32G,字节地址不能寻址全部空间.此时以块为单位。命令的参数为欲读数据的起始块号。

3.3 卡的写 *** 作

写卡 *** 作也有单块写命令和多块写命令. *** 作流程与读 *** 作类似。SD/MMC卡接收完主机传送过来的数据之后进入编程状态。卡内部为写 *** 作提供了一个缓存.该缓存使得卡在编程的同时可以接收下一块数据。当该缓存满时.卡从DAT0线输出低电平,表示正处于写的忙状态.否则从DAT0输出高阻态。因此.在往卡发送数据前应检查卡是否处于忙状态。另外,为了提高某些卡的写速度.建议在多读写命令之前发送预擦除命令.预擦除的块数在该命令的参数中给出。

4 结束语

本文的创新点是以SD通信模式实现了一个通用的、能同时支持MMC卡、SD卡和SDHC卡的SD/MMC卡驱动。目前它已被集成到基于FAT文件格式的嵌人式文件系统中.并被成功应用到MP3产品中。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2502020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存