SD协议-状态机

发布时间 2023-06-01 00:20:26作者: Icer_Newer

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

2.1 standby state cmd

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

  • CMD9 - 可以获取卡的CSD,可以得到SD卡的block length和card storage capacity等信息
  • CMD4 - 可以获取SD卡的DSR(Driver Stage),系统上挂载的卡的数量越多和总线越长,卡的驱动能力就越强
  • 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的时候,block和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,当前正在进行的操作就会终止,这种操作可能会毁掉数据,因为不知道传输是否完成

3.Bus width

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

  • SD卡上电之后或者IDLE,默认是1bit Bus
  • SD卡在data transfer 状态的时候可以使用ACMD6命令指定Bus位宽
  • 在ACMD6设置Bus位宽的时候,SD卡不能被锁定

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进行传输

6.Speed switch

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

7.Clock Ctrl

  • SD卡的时钟是通过SD Host传过来的
  • 可以进行低功耗设计,功耗与电压的平方成正比,与频率成正比
  • 当进行数据传输或者命令传输的时候,当不需要卡在总线上传输数据的时候,可以关闭卡的时钟
  • CMD和response之间的时钟关系