MMC卡除了接口中没有第8和第9脚外,其余与SD卡接口相同。
2.2 SD通信模式下的SD/MMC卡接口电路
S3C2410与SD/MMC卡座的接口电路如图1所示。接口电路原理图说明如下:
图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产品中。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。