基于S3C2410控制器实现SD/MMC卡驱动的设计
出处:电子发烧友 发布于:2019-08-19 14:32:44
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模式下卡的引脚定义
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产品中。
上一篇:RJ45以太网接口电路设计
下一篇:如何控制高速数字接口的EMI问题
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
- I2C系统适应性引体向上2024/4/12 17:03:24
- RS-232 和 RS-485 有什么区别?2024/4/11 16:24:08
- spi接口的基本概念2024/4/10 17:52:03
- 总线收发器教程2024/4/8 16:19:32
- 什么是rj45接口?rj45接口有什么用2024/4/2 17:43:28
- 英特尔数据存储如何操作和实现
- 什么是微动开关_微动开关有什么用_微动开关使用方法
- VCC,VDD,VEE,VSS在电源原理图中有什么区别?
- 低压配电系统设计规范_低压配电系统设计注意事项
- xEV 主逆变器电源模块中第四代 SiC MOSFET 的短路测试
- 光耦详细应用教程
- 定义绝缘耐久性评估的电压脉冲测试要求
- 采用沟槽MOS结构,使存在权衡关系的VF和IR相比以往产品得到显著改善 ROHM推出实现业界超快trr的100V耐压SBD“YQ系列”
- NOVOSENSE - 纳芯微推出车规级温湿度传感器NSHT30-Q1,助力汽车智能化发展
- Keysight - EV 电池设计创新:扩大续航里程、延长电池寿命