1. SDIO(SD/SDIO MMC卡主机模块)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡和CE-ATA设备间提供了操作接口。(SDIO没有SPI兼容的通信模式 )
1.1.什么是MMC卡
MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗电量低,传输速度快,广泛应用于消费类电子产品中。
1.2.什么是SD卡
SD:SD卡为Secure Digital Memory Card, 即安全数码卡。它在MMC的基础上发展而来,增加了两个主要特色:SD卡强调数据的安全安全,可以设定所储存的
使用权限,防止数据被他人复制;另外一个特色就是传输速度比2.11版的MMC卡快。在数据传输和物理规范上,SD卡(24mm*32mm*2.1mm,比MMC卡更厚一点),向前兼容了MMC卡.所有支持SD卡的设备也支持MMC卡。SD卡和2.11版的MMC卡完全兼容。
1.3.什么是SDIO
SDIO:SDIO是在SD标准上定义了一种外设接口,它和SD卡规范间的一个重要区别是增加了低速标准。在SDIO卡只需要SPI和1位SD传输模式。低速卡的目标应用是以最小的硬件开销支持低速IO能力。
现在已经有非常多的手机或是手持装置都支持 SDIO 的功能(SD 标准原本就是针对 mobile device 而制定),而且许多 SDIO 外围也都被开发出来,让手机外接外围更加容易,并且开发上更有弹性(不需要内建外围)。目前常见的 SDIO 外围(SDIO 卡)有:
· Wi-Fi card(无线网络卡)
· CMOS sensor card
· GPS card
· GSM/GPRS modem card
· Bluetooth card
· Radio/TV card
SDIO 的应用将是未来嵌入式系统最重要的接口技术之一,并且也会取代目前 GPIO 式的 SPI 接口。
1.4. CE-ATA 一种基于为了节省接口IO数量,专为轻薄笔记本硬盘设计的笔记本硬盘高速通讯接口
2. SDIO功能描述
2.1 复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。(通过SDIO时钟控制寄存器(SDIO_CLKCR) 改变)
2.2 如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。MMC版本V3.31和之前版本的协议只支持1位数据线,所以只能用SDIO_D0。
2.3 如果一个SD或SD I/O卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0或SDIO_D[3:0]。所有的数据线都工作在推挽模式。
2.4 SDIO_CMD有两种操作模式:
● 用于初始化时的开路模式(仅用于MMC版本V3.31或之前版本)
● 用于命令传输的推挽模式(SD/SD I/O卡和MMC V4.2在初始化时也使用推挽驱动)
2.5 SDIO_CK是卡的时钟:每个时钟周期在命令和数据线上传输1位命令或数据。对于多媒体卡V3.31协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体卡V4.0/4.2协议,时钟频率可以在0MHz至48MHz间变化;对于SD或SD I/O卡,时钟频率可以在0MHz至25MHz间变化。(初始化时不大于400KHz)
SDIO使用两个时钟信号:
● SDIO适配器时钟(SDIOCLK=HCLK) 72MHz
● AHB总线时钟(HCLK/2)
3. SDIO命令传输
3.1 命令:命令是用于开始一项操作。主机向一个指定的卡或所有的卡发出带地址的命令或广播命令(广播命令只适合于MMC V3.31或之前的版本)。命令在CMD线上串行传送。所有命令的长度固定为48位,下表给出了多媒体卡、SD存储卡和SDIO卡上一般的命令格式。
命令通道操作于半双工模式,这样命令和响应可以分别发送和接收。如果CPSM不处在发送状态,SDIO_CMD输出处于高阻状态,SDIO_CMD上的数据与
SDIO_CK的上升沿同步。
所有的命令都是由 STM32F1 发出,其中开始位、传输位、CRC7 和结束位由 SDIO硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引(如 CMD0,CMD1 之类的)在 SDIO_CMD 寄存器里面设置,命令参数则由寄存器 SDIO_ARG 设置。一般情况下,选中的 SD卡在接收到命令之后,都会回复一个应答(注意 CMD0 是无应答的),这个应答我们称之为响应,响应也是在 CMD线上串行传输的。STM32F1 的 SDIO控制器支持 2 种响应类型,即:短响应(48 位)和长响应(136 位),这两种响应类型都带 CRC 错误检测(注意不带 CRC 的响应应该忽略 CRC 错误标志,如 CMD1 的响应)。
3.2 响应:响应是由一个被指定地址的卡发送到主机,对于MMC V3.31或以前版本所有的卡同时发送响应;响应是对先前接收到命令的一个应答。响应在CMD线上串行传送。
SDIO支持2种响应类型,2种类型都有CRC错误检测: (如果响应不包含CRC(如CMD1的响应),设备驱动应该忽略CRC失败状态)
● 48位短响应
● 136位长响应
命令寄存器(SDIO_CMD)包含命令索引(发至卡的6位)和命令类型;命令本身决定了是否需要响应和响应的类型、48位还是136位
同样,硬件为我们滤除了开始位、传输位、CRC7 以及结束位等信息,对于短响应,命令索引存放在 SDIO_RESPCMD 寄存器,参数则存放在 SDIO_RESP1 寄存器里面。对于长响应,则仅留 CID/CSD位域,存放在 SDIO_RESP1~SDIO_RESP4 等4 个寄存器。
例如:CMD9和CMD10
命令索引 是否需要响应 命令参数 响应的类型、48位还是136位
响应格式有:R1,R1b,R2,R3,R4,R4b,R5,R6,R7(stm32参考手册SDIO响应格式)
4. 命令与响应
应用相关命令和通用命令
SD卡主机模块系统是用于提供一个适用于多种应用类型的标准接口,但同时又要兼顾特定用户和应用的功能,因此标准中定义了两类通用命令:应用相关命令(ACMD)和通用命令(GEN_CMD)。 当卡收到APP_CMD(CMD55)命令时,卡期待下一个命令是应用相关命令。应用相关命令(ACMD)具有普通多媒体卡相同的格式结构,并可以使用相同的CMD号码,因为它是出现在APP_CMD(CMD55)后面,所以卡把它识别为ACMD命令。如果跟随APP_CMD(CMD55)之后不是一个已经定义的应用相关命令,则认为它是一个标准命令;例如:有一个SD_STATUS(ACMD13)应用相关命令,如果在紧随APP_CMD(CMD55)之后收到CMD13,它将被解释为SD_STATUS(ACMD13);但是如果卡在紧随APP_CMD(CMD55)之后收到CMD7,而这个卡没有定义ACMD7,则它将被解释为一个标准的CMD7(SELECT/DESELECT_CARD)命令。
如果要使用生产厂商自定义的ACMD,SD卡主机需要做以下操作:
1. 发送APP_CMD(CMD55)命令 ,卡送回响应给多媒体/SD卡模块,指示设置了APP_CMD位并等待ACMD命令
2. 发送指定的ACMD ,卡送回响应给多媒体/SD卡模块,指示设置了APP_CMD位,收到的命令已经正确地按照ACMD命令解析;如果发送了一个非ACMD命令,卡将按照普通的多媒体卡命令处理同时清除卡中状态寄存器的APP_CMD位。如果发送了一个非法的命令(不管是ACMD还是CMD),将被按照标准的非法多媒体卡命令进行错误处理。
GEN_CMD命令的总线操作过程,与单数据块读写命令(WRITE_BLOCK,CMD24或READ_SINGLE_BLOCK,CMD17)相同;这时命令的参数表示数据传输的方向而不是地址,数据块具有用户自定义的格式和意义。发送GEN_CMD(CMD56)命令之前,卡必须被选中(状态机处于传输状态),数据块的长度由SET_BLOCKLEN(CMD16)定义。GEN_CMD(CMD56)命令的响应是R1b格式。
5. Card Initialization and Identification Process :
程序太多,不会写,只能参考网上的。。。。。╮(╯▽╰)╭