编辑: ddzhikoi | 2015-08-25 |
5 宽总线(4bit)模式可以通过 ACMD6 选择/取消选择,默认工作模式为 1bit 模式.为了 改变总线宽度,以下两个条件须满足:1. SD 卡处于 Transfer 状态 2.SD 卡未被锁定 为使用 2Gbyte 的SD 卡,Maximum Block Length(READ_BL_LEN=WRITE_BL_LEN)参数须 设置为 1024byte.但是,由CMD6 设置的 Block Length 须为 512byte,从而可与最大仅可使 用512byte Block Length 的SD 卡相兼容 2Gbyte SD卡: 读数据 DAT 线上没有数据传输时,由外部上拉电阻保持为高电平.传输数据块由一个起始比特 (1 或者
4 个比特的低电平) , 以及紧跟着的连续数据流组成. 数据流包含有效载荷数据 (以 及错误校验比特,如果有使用到 ECC).数据流以数据结束标识符结束(1 或者
4 比特的高 电平).数据传输和时钟信号是同步的.有效载荷数据后紧跟着
1 比特或者
4 比特的 CRC 校验码 : 读命令在出现 BLOCK_LEN_ERROR 或者 ADDRESS_ERROR 的情况下可以被否决,这种情况 下,不会发生数据传输过程;
块读操作 块传输下, 基本的数据传输单位是块, 它最大为 512byte, 小一些的块传输也是可以的, 如果它指向的内容其地址范围处于以
512 字节为边界的某块内(譬如 地址范围为 200~300 的传输是可以的,但是地址范围为 500~600 因为地址横跨了两个块,则不可行) 由CMD16 设置的 Block Length 参数最大可为 512byte,而与 READ_BL_LEN 的大小无关 块数据的结尾都附加有 CRC 校验码,用以保证传输数据的完整性.CMD17 (READ_SINGLE_BLOCK)发起单次的块传输,传输结束后,SD 卡返回 Transfer 状态,CMD18 (READ_MULTIPLE_BLOCK)开始多个连续块的数据传输.块传输会一直持续下去,除非收到 一条 STOP_TRANSMISSION 命令(CMD12).停止传输命令会有执行上的延迟,因为它是串行 传输的,数据传输会在 stop 命令的停止位之后结束 If the host uses partial blocks whose accumulated length is not block aligned and block misalignment is not allowed, the card shall detect a block misalignment at the beginning of the first misaligned block, set the ADDRESS_ERROR error bit in the status register, abort transmission and wait in the Data State for a stop command.If the misaligned block is the first data block of the command (i.e. ADDRESS_ERROR was reported in the actual response to the command), then no data is transferred and the card remains in the TRAN state. 上面一段讲的是 misalignment,理解不够,直接贴英文了 写数据 数据写传输类似读传输,块数据传输的话,在每块数据后面附加有 CRC 校验码 : Emai:[email protected] SD 卡协议学习点滴 第二版本
6 当出现 BLOCK_LEN_ERROR 或者 ADDRESS_ERROR 时,写命令会被拒绝,并不会发生实际的数 据传输 写数据块 写数据块命令(CMD24-27, 42, 56(w))会将一块或多块数据写入 SD 卡,支持块写入操 作的SD卡要求由命令CMD16设定的块长度(Block Lenghth)为512byte, 而不管WRITE_BL_LEN 是1K 还是 2K 下表给出了部分写入禁止(WRITE_BL_PARTIAL=0)情况下 SD 卡的写入行为 如果 WRITE_BL_PARTIAL=1,则更小块数据的写入--精度可以为 1byte---是可以进行的.如果CRC 校验失败,SD 卡会在 DAT 线上给出相应的指示,已传输数据会被丢弃,并且这其后 所传输的数据块(在多块写入模式下)也会被忽略 编程 CSD 寄存器并不需要先前设定好的块长度.传输数据同样附加有 CRC 校验,如果 CSD 的某部分存储在 ROM 里面, 这个不可改变的部分同样会映射到数据缓存的相应部分 (但是这 部分数据不会写入),如果这个匹配条件不满足,SD 卡会回报一个错误信息,并且此次写 入无效 某些 SD 卡会需要比较长并且不可预期的写入时间. 如果 SD 卡的缓存为满, 则其在接收完块 数据并完成 CRC 校验后,SD 卡会开始数据的写入,并拉低 DAT0.任何时刻,控制器可以通 过命令 SEND_STATUS(CMD13)主动查询 SD 卡的状态,SD 卡对应的响应其标志位 READY_FOR_DATA 表明其是否可以接收新数据. 多块写操作之前的预擦除指令 使用预擦除命令(ACMD23)设定多个写入块的预擦除会让随后的多块写入更快完成.控制器 一般会使用这个值(擦除多少块)来决定随后的多块数据写入的块数.如果控制器在写入多 块数据之前使用 stop 名林终止数据传输,那么,余下的数据块里面的值是未知的,可能是 旧的值,也可能是擦除后的空白值(全1).如果控制器传输的数据块数多于预擦除指定的 块数,,