1.SD卡状态回顾

2.SD卡数据传输模式

  • SD卡在接收到CMD3之后就会进入data transfer state,初始状态时standby state,表示空闲状态
  • SD卡在standby state下,可以接收CMD4,9,10,3的设置
  • SD卡在standby state下,SD Host发送过来CMD7,CMD7会携带一个RCA值(这个RCA值是在identification state的时候接收CMD3时SD卡发送给SD Host的),SD卡接收CMD7后,在内部会进行比较RCA值,如果相同,SD卡就进入Transfer state,如果RCA值不同表示SD Host想要访问的是另外一张卡,当前SD卡就会维持在standby state
  • SD卡在Transfer state的时候可以接收传输的CMD和一些设置传输属性的CMD,比如在上图中,CMD6,17,18,30,56表示进行读操作,SD卡进入Sending data State,如果是single block传输,传输完成后就返回transfer state,如果是multiple block传输,传输完成后需要借助CMD12来停止传输,回到transfer state
  • CMD12 - 表示操作完成
  • SD卡在transfer state接收到CMD7,进行比较RCA之后发现不同,SD卡会直接从transfer state转到IDLE
  • SD卡在transfer state接收到CMD24,25,26,27,42,56(w)的写操作,此时SD卡会先接收数据,然后写数据,先进入receive data state,如果是single block write,接收数据完成之后直接进入programming state,如果是multiple block的写则通过CMD12表示接收数据完成,然后进入programming state
  • SD卡内部会有buffer和存储颗粒,对SD卡进行写操作是将SD卡buffer中的数据存储到SD卡的存储颗粒中的过程,receive state是将数据从data总线接收到SD卡内部buffer上,programming state是将buffer中的数据存储到SD卡的存储颗粒中
  • SD卡在programming state接收到CMD7,如果RCA不同,那么就会进入Disconnect state;在Disconnect state接收到CMD7,如果RCA相同,就又会回到programming state
  • SD卡进入到Disconnect state时,programming是还在进行的(从Buffer到存储颗粒的写),只是卡的总线卡的连接断开了,当SD卡内部识别到program结束,会回到standby状态
  • SD卡没有进入Disconnect state,正常program结束,会回到transfer state
  • SD卡在任何状态收到CMD0,都会进入到IDLE状态



  • SD卡在卡识别阶段的时候主要是读取一些寄存器的值以及RCA发布,没有大量的数据搬移,所以SD卡在卡识别阶段的频率比较低,fOD frequency是比较低的频率,SD卡在data transfer阶段的频率比较高,fpp frequency
  • CMD24(single block write)
  • CMD35(mutlti block write)

2.1 standby state cmd

Standby状态下SD Host可以发送一些指令获取一些信息,CMD9,4,7

  • CMD9 - 可以获取卡的CSD(card specific data),可以得到SD卡的block length和card storage capacity等信息
  • CMD4 - 可以获取SD卡的DSR(Driver Stage register),系统上挂载的卡的数量越多和总线越长,卡的驱动能力就越强
  • CMD7 - 本身携带RCA值(SD Host-->SD卡),SD卡内部进行比较,判断是不是和自己通信,如果CMD7携带的RCA是0x0000,那么所有的SD卡都回到Standby state

2.2 data transfer state cmd

SD卡处于data transfer state可以接收一些指令

  • CMD17 - single block read
  • CMD18 - multiple block read
  • CMD12 - stop command(terminate data transfer)
  • CMD24 - single block write
  • CMD25 - multiple block write
  • CMD27 - 对于CSD等寄存器进行写操作
  • 什么时候开始program:传输write block的时候(data+crc),bloc datak和crc都接收传输完成才开始program操作
  • 当SD卡的buffer满了之后,会将DATA0总线拉低,表示当前数据总线busy,SD Host不能再往SD卡里写数据,如果写SD卡中的寄存器就不用buffer,可以直接写,如果是将数据写到SD卡的存储颗粒中,需要使用buffer
  • SD卡是busy的时候(DATA0被拉低),不能写其中的寄存器,因为当前卡正在用这些寄存器中的值
  • 如果当前卡处于erase和program状态,此时接收到CMD7,CMD7携带的RCA与当前卡不同,当前卡会进入disconnect状态,但是erase和program操作不会结束,当erase和program结束之后,当前卡会进入standby状态
  • SD卡在disconnect状态,如果收到CMD7中RCA的值和当前SD卡一致,又会重新连接
  • CMD0/CMD15 - 将卡设置为IDLE,当前正在进行的操作就会终止,这种操作可能会毁掉数据,因为不知道传输是否完成
  • CMD16 - set block length
  • CMD32 - erase block start
  • CMD33 - erase block end
  • 当SD卡正在进行programming的时候,是不能进行读操作的
  • A card在data transfer state下进行擦写操作,此时Host想要控制B card进行操作,会发送CMD7,CMD7携带B card的RCA值,B card从standby模式进入到data transfer state,A card此时会从data transfer state进入standby模式,但是A card的擦写操作是不会结束的,因为擦写过程不需要Host发送信息

3.Bus width

Bus总线是4bit的,可以使用其中的4bit Bus或者是使用其中的1bit Bus,通过ACMD6进行选择Bus的位宽

  • SD卡上电之后或者使用CMD0进行复位操作回到IDLE,默认是1bit Bus
  • SD卡在data transfer 状态的时候可以使用ACMD6命令指定Bus位宽
  • 在ACMD6设置Bus位宽的时候,SD卡不能被锁定(比如当前正在使用4bit data bus传输数据,此时发送ACMD6设置data bus为1bit,就是不允许的)

4.Block Read

  • SD卡的读写都是以block为单位
  • block最大容量是512bytes,可以设置其他的值,但是不能超过这个值
  • Block length通过CMD16进行设置,在data transfer state下进行设置
  • 每个block在进行传输的时候都会添加一个crc,确保数据传输完整
  • CMD17,18 - single block read,multiple block read
  • CMD12 - multiple block传输时,在最后一个block传输后停止传输

  • 出现block misalignments是不允许出现的,如果出现SD卡会设置ADDRESS_ERROR error给状态寄存器,停止传输

5.Block Write

  • 在进行写操作的时候,设置Block length超过512bytes,仍然会使用512byte进行传输
  • data总线4bit传输的时候,4条总线都要添加crc

6.Speed switch

  • CMD6 - 在data transfer state,使用CMD6切换SD卡的传输速率
  • 默认使用12.5MB/s的速率,可以设置为25MB/s
  • 可支持的指令集可以进行定义:标准指令集,电子商务指令集,自定义指令集

7.Clock Ctrl

  • SD卡的时钟是通过SD Host传过来的

  • 可以进行低功耗设计,功耗与电压的平方成正比,与频率成正比

  • 当进行数据传输或者命令传输的时候,当不需要卡在总线上传输数据的时候,可以关闭卡的时钟

  • CMD和response之间的时钟关系

  • CMD发送之后,没有响应,需要等8个时钟之后才能进行重新发送CMD

  • 读数据完成之后,8个时钟周期后关断时钟

8.CRC

  • 发送命令或数据的时候,都需要经过芯片的IO口,SD Host和SD卡是通过PCB的走线连接在一起的,SD Host IO --> PCB线 --> SD Card IO,PCB走线容易受到电磁干扰,所以在传递的数据的时候可能出现错误
  • 在进行数据或者指令传输的时候,会跟一段数据的编码(CRC),CRC的位宽通常比数据位宽小很多

  • 在传输数据和命令的时候,发送端有一个CRC生成器,当数据发送完之后,再传输CRC生成器生成的CRC(CRC-m)
  • 在接收端,不断接收数据,一边接收数据,也会一边生成自己的CRC(CRC-s),然后通过比较器cmp比较CRC-m和CRC-s,如果相同,就表示数据没有问题
  • 如果CRC-m和CRC-s如果不同,有两种情况,数据传输出现错误或者CRC传输的时候出现错误,就不能使用这一笔数据,接收端会发送信息给发送端,将接收到数据并出错的信息返回给发送端,发送端一般会再次发送一次数据
  • CRC的作用主要是为了校验发送的数据是不是传输正确

8.1 CRC生成

  • 对于CMD来讲使用的是CRC7,7bitCRC
  • CRC生成多项式:CRC7,最高次幂是7,系数为1;其他次幂前的系数是0或者是1
  • 最高次幂是多少就有多少个寄存器,data out和data in做异或逻辑,输入到第一个寄存器
  • x3之前的系数是1,就在第三个寄存器后面加异或逻辑,哪一项系数是1,就在其所在次幂的寄存器之后加一个异或逻辑

  • DATA位宽比较宽,使用的是CRC16

SD协议-状态机的更多相关文章

  1. linux tcp协议状态机

    截图来自百度文库 TCP状态-有限状态机

  2. STM32之SD卡

    目录 一.SD卡概述 1.定义 2.容量等级 3.SD卡框图 4.SD卡与TF卡的区别 二. SD卡内部结构 1. SD卡内部结构简图 2. 存储阵列结构图 3.Buffer 4.“存储阵列Block ...

  3. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  4. 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  5. VRRP协议具体解释

    转帖:http://blog.chinaunix.net/space.php?uid=11654074&do=blog&id=2857384 Contents              ...

  6. [转帖]SD卡&FLASH&USB

    来源:http://www.cypress.com Cypress官网,了解任何芯片都应该从它的官网入手,资料一定是最多最原始的,像Ronnie学习. Cypress’s EZ-USB® FX2LP™ ...

  7. [笔记]SD卡相关资料

    ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...

  8. 基于stm32f103zet6的FAT16文件系统学习0(读SD卡扇区)

    SD卡已经看了两天了,主要是因为测试出来的卡容量不对,所以一直找原因,最终还是发现了,总比不过是单位上面出现了问题,或许是之前没有接触到SD的缘故吧,所以对其中的一些寄存器很不了解,一切都是重新开始, ...

  9. Keepalived原理与实战精讲--VRRP协议

    . 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...

  10. 【协议逆向工程】Part 1 概述

    1 协议逆向工程概述 1.1 协议 协议是计算机网络与分布式系统中各种通信实体键相互交互信息时必须遵守的一组规则和约定,这些规则明确规定了所交换的数据格式以及有段的同步问题,从而保证了双方通信有条不紊 ...

随机推荐

  1. 前端 JS 安全对抗原理与实践

    作者:vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的,为了提高代码的破解成本.保证JS代码里的一些重要逻辑不被居心叵测的人利用,需要使用一些加密和混淆的防护手段. 一.概念解 ...

  2. bash shell笔记整理——date命令

    date命令初步了解 简单来说date的主要作用大多数用于以给定的格式来显示时间. 在后期我们写一些脚本当中也会使用到,比如说按照日期来给文件备份打包等. 下面我们来看看帮助信息: [root@ngi ...

  3. Windows上安装jenkins

    官网下载jenkins https://www.jenkins.io/zh/download/ 选择Windows版本下载,安装 注意,需要java11,17或21才能安装 java下载地址  htt ...

  4. ACTF flutter逆向学习

    参考了许多大佬的博客,在此特别诚挚感谢oacia大佬和其他大佬的博客和指导! 1.flutter和apk基础结构介绍 首先下载附件,是一个apk文件,用jadx打开 可以看见flutter字样,而fl ...

  5. IDM HOSTS本地注册 屏蔽的网址

    127.0.0.1 registeridm.com127.0.0.1 www.registeridm.com127.0.0.1 www.internetdownloadmanager.com127.0 ...

  6. echo详解

    linux下echo命令详解 linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法 echo命令的功能是在显示器上 ...

  7. springboot整合apollo配置中心

    springboot整合apollo配置中心 springboot整合apollo配置中心官网文档说明得比较清楚,但还是有一些坑注意的. 官网文档:https://www.apolloconfig.c ...

  8. hutool的常用方法

    https://www.hutool.cn/docs/#/ 官方文档 Hutool 是一个 Java 开发工具包,提供了丰富实用的工具类,包括字符串处理.日期处理.文件操作.加密解密.网络请求等等.以 ...

  9. 实证与虚无,抽象和具象,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang接口(interface)的使用EP08

    看到接口这两个字,我们一定会联想到面向接口编程.说白了就是接口指定执行对象的具体行为,也就是接口表示让执行对象具体应该做什么,所以,普遍意义上讲,接口是抽象的,而实际执行行为,则是具象的. 接口(in ...

  10. 云图说 | 华为云MCP多云容器平台,让您轻松灾备!

    摘要:多云容器平台是华为云基于多年容器云领域实践经验和社区先进的集群联邦技术,提供的容器多云和混合云的解决方案. 多云容器平台(Multi-Cloud Container Platform,MCP)是 ...