SD协议-状态机
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