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. svn、git服务器配置进程方式网关不生效常见处理方法

    过华企盾DSC防泄密系统配置svn或者git服务器的时候,网关不生效如何解决? 1.先在cmd中运行一下命令netstat -ano|findstr "8080" 找到svn.gi ...

  2. selenium之鼠标键盘操作

    鼠标操作 1.引入ActionChains类 2.定位相关元素 3.在ActionChains().调用相关鼠标操作方法 from selenium.webdriver.common.action_c ...

  3. 牛客刷Java记录第6天

    第一题 一个文件中的字符要写到另一个文件中,首先需要( ). A System.out.print (buffer[i]); B FileOutputStream fout = new FileOut ...

  4. 技本功|统计信息对SQL执行效率的影响

    在一个风和日丽的下午,奋哥哥突然接到业务方线上业务数据库CPU资源告警信息,立马放下手里的枸杞登录业务方阿里云控制台查看具体问题. 对于数据库当前正在发生中的问题,我们首先从数据库实时会话信息中尝试抓 ...

  5. CentOS安装openGauss2.0.1

    CentOS安装openGauss2.0.1 OpenGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行.openGauss内核源自PostgreSQL,深度融合华为在数据库领域多年 ...

  6. 使用Spring AI让你的Spring Boot应用快速拥有生成式AI能力

    之前分享了关于Spring新项目Spring AI的介绍视频.视频里演示了关于使用Spring AI将Open AI的能力整合到Spring应用中的操作,但有不少读者提到是否有博客形式的学习内容.所以 ...

  7. k8s卷管理-1

    目录 卷管理-1 1. 本地存储 1.1 emptyDir 1.2 hostPath 网络存储 搭建NFS服务器 使用NFS网络存储 搭建iSCSI服务器 使用iSCSI网络存储 卷管理-1 我们之前 ...

  8. Jenkins简介及安装配置详解:开启持续集成之旅

    Jenkins简介及安装配置详解:开启持续集成之旅 一.Jenkins介绍 Jenkins是一个开源的.用Java编写的持续集成和持续交付(CI/CD)工具.它提供了一种简单易用的方式来自动化构建.测 ...

  9. 5大特性,带你认识化繁为简的华为云CodeArts Deploy

    摘要:2月27日,华为云发布持续部署服务CodeArts Deploy,通过模块化自由编排部署流程,实现软件的自动化部署,帮助企业软件产品的快速.高效.高质量交付. 本文分享自华为云社区<化繁为 ...

  10. 常遇到读多写少,教你用ReadWriteLock实现一个通用的缓存中心

    摘要:本文我们就来说说使用ReadWriteLock如何实现一个通用的缓存中心. 本文分享自华为云社区<[高并发]原来ReadWriteLock也能开发高性能缓存,看完我也能和面试官好好聊聊了! ...