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产品中。
关于接口,总线,驱动就介绍完了,您有什么想法可以联系小编。