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 :

程序太多,不会写,只能参考网上的。。。。。╮(╯▽╰)╭

重学STM32---(八)----SDIO的更多相关文章

  1. 重学 Java 设计模式:实战抽象工厂模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  2. 重学 Java 设计模式:实战适配器模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 擦屁屁纸80%的面积都是保护手的! 工作到3年左右很大一部分程序员都想提升自己的技术 ...

  3. 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)

    作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...

  4. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  5. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

  6. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员‍‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...

  7. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  8. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! @ 目录 一.前言 二.开发环境 三.状态模式介绍 四.案例场景模拟 1 ...

  9. 12天,这本《重学Java设计模式》PDF书籍下载量9k,新增粉丝1400人,Github上全球推荐榜!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言

随机推荐

  1. Java List的深度克隆

    关于java List的深度克隆 List是java容器中最常用的顺序存储数据结构之一.有些时候我们将一组数据取出放到一个List对象中,但是可能会很多处程序要读取他或者是修改他.尤其是并发处理的话, ...

  2. easyui datagrid的列编辑

    [第十五篇]easyui datagrid的列编辑,同时插入两张表的数据进去   看图说话. 需求:插入两张表,上面的表单是第一张表的内容,下面的两个表格是第二张详情表的内容,跟第一张表的id关联 第 ...

  3. JS中把字符串转成JSON对象的方法

    在JS中,把 json 格式的字符串转成JSON对象,关键代码 json = eval('('+str+')'); <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  4. js基础之BOM

    一.window.open 栗子:阿里西西运行代码功能 var oBtn = document.getElementById('btn1'); var oTxt = document.getEleme ...

  5. 二模 (3) day1

    第一题: 题目描述: 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A,B 和 n 的值,要求计算 ...

  6. RM报表的选项 注册表位置

    HKCU\Software\WHF SoftWare\Report Machine\RMReport\Form\RMDesignerForm\ 设计器-工具-选项的设置 HKCU\Software\W ...

  7. jQuery 其他操作

    1. 样式操作 1.1 获取 class 和设置 class : class 是元素的一个属性, 所以获取 class 和设置 class 都可以使用 attr() 方法来完成. 1.2 追加样式: ...

  8. Linux-编译器gcc/g++编译步骤

    gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...

  9. getBoundingClientRect() 来获取页面元素的位置

    getBoundingClientRect() 来获取页面元素的位置   document.documentElement.getBoundingClientRect 下面这是MSDN的解释: Syn ...

  10. 升级Xcode6.4插件失效解决办法

    发现安装的插件无效 后各种尝试后终于解决 1.先找到之前装的插件文件夹 前往文件夹:~/Library/Application Support/Developer/Shared/Xcode/Plug- ...