​ SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。

1.SD命令格式

SD命令格式固定为48bit,都是通过CMD线连续传输的, 数据线不参与。

  • 起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为0,终止位为1。

  • 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。

  • 命令主体内容: 命令主体内容包括命令、地址信息/参数和CRC校验三个部分。

    ​ 命令主体内容包括命令、地址信息/参数和CRC校验三个部分。

    • 命令号:它固定占用6bit,所以总共有64个命令(代号: CMD0 ~ CMD63 ),每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
    • 地址/参数:每个命令有32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址。
    • CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败, SD卡不执行命令。

2. 命令类型

SD命令有4种类型:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应;
  • 带响应广播命令(bcr),发送到所有卡,同时接收来自所有卡响应;
  • 寻址命令(ac),发送到选定卡, DAT线无数据传输;
  • 寻址数据传输命令(adtc),发送到选定卡, DAT线有数据传输。

​ 另外, SD卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为实现这些功能,在标准中定义了两种类型的通用命令: 特定应用命令(ACMD)常规命令(GEN_CMD)。 要使用SD卡制造商特定的ACMD命令如ACMD6,需要在发送该命令之前无发送CMD55命令,告知SD卡接下来的命令为特定应用命令。 CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。

3. 常用命令

4. 响应

响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。 基本特性如下:

  • SDIO总共有7个响应类型(代号: R1~ R7 ),其中SD卡没有R4、 R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。
  • 与命令一样, SD卡的响应也是通过CMD线连续传输的。
  • 根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型

    是长响应,其长度为136bit。

5. SD卡的操作模式

​ SD卡有多个版本, STM32控制器目前最高支持《Physical LsayerSimplified Specification V2.0》定义的SD卡, STM32控制器对SD卡进行数据读写之前需要识别卡的种类: V1.0标准卡、 V2.0标准卡、 V2.0高容量卡或者不被识别卡。

SD卡系统(包括主机和SD卡)定义了两种操作模式: 卡识别模式数据传输模式。 在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时, SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后, SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。

​ 在每个操作模式下, SD卡都有几种状态, 通过命令控制实现卡状态的切换:

6.卡识别模式

​ 在卡识别模式下,主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围,识别SD卡类型,并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下。

  • 上电后,所有卡处于空闲状态,可发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态。

  • 使用SEND_IF_ COND (CMD8)命令根据响应确定卡的电压支持范围。 CMD8是SD卡标准V2.0版本才有的新命令,所以如果主机有接收到响应,可以判断卡为V2.0或更高版本SD卡(非MMC卡)。

  • 使用SD_SEND_OP_COND(ACMD41)命令识别或拒绝不匹配它的电压范围的卡。 并通过HCS位及其响应判断是SDSC还是SDHC卡。

  • 使用ALL_SEND_CID(CMD2) 来控制所有卡返回它们的卡识别号(CID),处于准备状态的卡在发送CID之后就进入识别状态。

  • 发送SEND_RELATIVE_ ADDR (CMD3)命令,让卡自己推荐一个相对地址(RCA)并响应命令。这个RCA是16bit地址,而CID是128bit地址,使用RCA简化通信。

  • 卡在接收到CMD3并发出响应后就进入数据传输模式,并处于待机状态,主机在获取所有卡RCA之后也进入数据传输模式。

7.数据传输模式

​ 只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。

  • CMD7用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡都是出于待机状态,必须选择一个RCA地址目标卡使其进入传输状态才可以进行数据通信。同时通过CMD7命令也可以让已经被选择的目标卡返回到待机状态。
  • 数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用块的读写以及擦除命令对卡进行数据读写、擦除。
  • CMD12可以中断正在进行的数据通信,让卡返回到传输状态。 CMD0和CMD15会中止任何数据编程操作,返回卡识别模式,这可能导致卡数据被损坏。

初学STM32 SDIO (二)的更多相关文章

  1. 初学Python(二)——数组

    初学Python(二)——数组 初学Python,主要整理一些学习到的知识点,这次是数组. # -*- coding:utf-8 -*- list = [2.0,3.0,4.0] #计算list长度 ...

  2. stm32+lwip(二):UDP测试

    我是卓波,很高兴你来看我的博客. 系列文章: stm32+lwip(一):使用STM32CubeMX生成项目 stm32+lwip(二):UDP测试 stm32+lwip(三):TCP测试 stm32 ...

  3. Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  4. STM32笔记二

    1.STM32编程通常有两种方法:一种是寄存器编程,另外一种是固件库编程.寄存器编程是基础,而固件库是寄存器编程的基础上升级而来的编程方法,是需要重点掌握的编程方法. 2.STM32F103采用的是C ...

  5. Java初学心得(二)

    数组概述 一,数组基本操作 ①一维数组的创建:数组元素类型[] 数组名字=new 数组类型[数组元素个数] 例:int []arr=new int[5];数组长度为5 ②初始化一维数组:第一种:int ...

  6. 关于stm32 SDIO初始化TF卡 失败的问题

    类似问题:http://www.openedv.com/thread-33232-1-1.html 现象:初始化4bit SDIO模式的TF卡,卡死在初始化过程中. 问题现象代码移植于野火开发板相关例 ...

  7. Linux初学:(二)Shell环境与命令基础

    博客园(FOREVER_ENJOY):http://www.cnblogs.com/zyx1314/ 本文版权归作者所有:欢迎转载!请注明文章作者和原文连接 Shell是什么? 1. Shell作为应 ...

  8. 初学Node(二)package.json文件

    package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...

  9. 初学HTML5系列二:HTML5新增的事件属性

    Window事件属性: 属性 值 描述 onafterprint  script 文档打印之后运行的脚本. 属性发生于用户设置页面打印并且打印对话框已出现之后. onbeforeprint  scri ...

  10. python初学笔记(二)

    注释: 任何时候,我们都可以给程序加上注释.注释是用来说明代码的,给自己或别人看,而程序运行的时候,Python解释器会直接忽略掉注释,所以,有没有注释不影响程序的执行结果,但是影响到别人能不能看懂你 ...

随机推荐

  1. 学会了Java 8 Lambda表达式,简单而实用

    OneAPM 摘要:此篇文章主要介绍Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系OneAPM工程师编译整理. Java是一流的面向对象语言,除了 ...

  2. 一文详解云上自动化部署集群管理工具 Nebula Operator

    本文首发于 Nebula Graph 公众号:Nebula Operator 开源啦!一文详解这个云上自动化部署集群管理工具 在介绍 Nebula Operator 之前,让我们先来了解下什么是 Op ...

  3. [Python] 子线程退出孙线程不退出

    遇到了一个大坑! 如图,在子线程ThreadFunc退出之后,ThreadFunc2依旧在运行... 根本不会结束 但是官方文档中说明了,只要设置了daemon不为None 就能设置子线程是守护线程, ...

  4. Java //遍历100以内的偶数,获取所有偶数的和,输出偶数的个数

    1 //遍历100以内的偶数,获取所有偶数的和,输出偶数的个数 2 3 int i =1; 4 int sum = 0; 5 int count = 0; 6 for(i = 1;i<=100; ...

  5. Mutillidae品台上使用sqlmap注入测试

    Mutillidae是一个开放源码的提供安全渗透测试的Web应用程序, Mutillidae可以安装在Linux.windows xp.windows 7等平台上.下载及安装说明文档详见:mutill ...

  6. husky 7.0.4 git hooks 前端 commit 钩子 git转svn [已解决]

    husky 7 的安装,注意下版本 第一步 安装 cnpm install husky@7.0.4 --save-dev 第二步 在package.json script加入 "prepar ...

  7. thinkphp phpstorm xdebug 环境配置

    php5.6 环境配置 phpStudy 开启 Apache 网站 的php版本选择7的 (7的可能自己需要装一下) 获取xdebug前的 检查准备 打开 http://localhost:8033/ ...

  8. Pod的优先级(priorityClass)和抢占策略(preemptionPolicy)

    Pod优先级 Pod优先级是一个用于指示Pod相对重要程度的整数值.优先级高的Pod在调度时会优先被考虑,并且在资源不足时,优先级较低的Pod可能会被驱逐以释放资源给优先级较高的Pod.Pod优先级的 ...

  9. python处理txt文件常用方法总结

    一 打开txt的正确方式 一般人会用到怎么快速打开txt,下面分享两种方式: f = open("data.txt","r") #设置文件对象 f.close( ...

  10. springboot使用pagehelper

    自己写的用户系统项目需要加个分页,之前都是用现成的,或者使用在sql里面拼接分页查询,这次任务紧急想直接找个包实现吧,找了很多博客看了都不行啊,不知道为啥,最后还是找了之前maven使用的包才行,简单 ...