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. 用C#也能做机器学习?

    前言 说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说.其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合 ...

  2. 香橙派5plus从ssd启动Ubuntu

    官方接口图 我实际会用到的就几个接口,背面的话就一个M.2固态的位置: 其中WIFI模块的接口应该也可以插2230的固态,不过是pcie2.0的速度,背面的接口则是pcie3.0*4的速度,差距还是挺 ...

  3. Golang标准库 container/list(双向链表) 的图文解说

    Golang标准库 container/list(双向链表) 的图文解说 提到单向链表,大家应该是比较熟悉的了.今天介绍的是 golang 官方库提供的 双向链表. 1.基础介绍 单向链表中的每个节点 ...

  4. uni-app+vue3+ts项目搭建完整流程

    项目代码同步更新至码云 uni-vue3-ts-template 开发前准备 利用 uni-app 开发,有两种方法: 通过 HBuilderX 创建(需安装 HBuilderX 编辑器) 通过命令行 ...

  5. libGDX游戏开发之Box2D(十四)

    libGDX游戏开发之Box2D(十四) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goo ...

  6. 2024年,在风云际会的编程世界里,窥探Java的前世今生,都说它穷途末路,我认为是柳暗花明!

    2024年,在风云际会的编程世界里,窥探Java的前世今生,都说它穷途末路,我认为是柳暗花明! 文编|JavaBuild 哈喽,大家好呀!我是JavaBuild,以后可以喊我鸟哥,嘿嘿!俺滴座右铭是不 ...

  7. mx master 的国产平替 keychron m6 使用体验

    背景 之前在 Mac 系统用mx master3遇到的问题 这篇文章中提到过三点问题,前两点在更换了驱动软件,升级了 macOS 系统之后都解决了,但第三点自动休眠的问题一直无法解决,于是一直想找一个 ...

  8. flutter MaterialApp介绍

    MaterialApp 是 Flutter 中常用的一个 widget,它是构建基于 Material Design 风格应用的根组件,主要负责各种全局状态的管理以及定义应用程序的主题样式等. voi ...

  9. curl使用小记(一)

    目录 1. 概述 2. 实例 2.1. 访问网页 2.2. 显示头信息 2.3. 保存网页 2.4. 下载图片 2.5. 用户代理设置 2.6. 代理设置 3. 参考 1. 概述 curl也就是com ...

  10. 【玩转鲲鹏 DevKit系列】如何快速迁移无源码应用?

    本文分享自华为云社区<[玩转鲲鹏 DevKit系列]如何快速迁移无源码应用?>,作者: 华为云社区精选. 为了帮助广大用户和开发者快速将无源码应用从 x86 迁移到鲲鹏,鲲鹏 DevKit ...