总线传输保护
总线上传输的每条SD卡命令都受到CRC位的保护。在SPI模式下,SD存储卡提供了CRC ON模式,使具有可靠数据链路的系统能够排除实现CRC生成和验证功能所需的硬件或固件。在CRC OFF模式下,命令的CRC位被定义为“不关心”发送端,而被接收端忽略。
缺省情况下,SPI接口初始化为CRC OFF模式。然而,用于将卡切换到SPI模式的RESET命令(CMD0)在SD模式下被卡接收,因此应该有一个有效的CRC字段。
由于CMD0没有参数,所有字段的内容(包括CRC字段)都是常量,不需要在运行时计算。
有效的复位命令为:Ox40, Ox0, Ox0, Ox0, Ox0, ox95卡进入SPI模式后,将根据CMD59设置对包括CMD0在内的所有命令进行CRC检查。
主机可以使用CRC_ON_OFF命令(CMD59)打开和关闭CRC选项。
主机应在发出ACMD41之前启用CRC验证。始终启用CMD8 CRC校验。
主机应在CMD8参数中设置正确的CRC。
如果检测到CRC错误,无论命令索引如何,卡都会在R1响应中返回CRC错误。
数据读取
SPI模式支持单块读取和多块读取操作(SD Memory Card协议中的CMD17或CMD18)。
在接收到一个有效的读命令后,卡将用一个响应令牌和一个数据令牌进行响应,参考下图。
在标准容量卡的情况下,数据令牌中的大小由set BLOCKLEN (CMD16)设置的块长度决定。
对于SDHC和SDXC卡,无论cmd16设置的块长度如何,块长度都固定为512字节。
最大块长度为512字节,与CSD中定义的READ_BL_LEN无关。
如果在标准容量卡中启用部分块访问(即CSD参数READ BL partial等于1),块长度可以是1到512字节之间的任何数字。
起始地址可以是卡有效地址范围内的任意字节地址。但是,每个块应包含在单个物理卡扇区中。
如果禁用部分块访问,则只支持512字节的数据长度。SDHC和SDXC卡只支持512字节的块长度。起始地址应与块边界对齐。
在数据检索错误的情况下,卡将不传输任何数据。相反,一个特殊的数据错误令牌将被发送到主机。
下图显示了一个以错误令牌而不是数据块结束的数据读取操作。
在多块读取操作的情况下,每个传输的块都有其16位CRC后缀。
停止传输命令(CMD12)实际上会停止数据传输操作(与SD Memory Card操作模式相同)。
数据写入
SPI模式支持单块和多块写命令。在接收到有效的写命令(SD存储卡协议中的CMD24或CMD25)后,卡将使用响应令牌进行响应,并等待主机发送数据块。
CRC后缀、块长度和起始地址限制(CSD参数WRITE BL PARTIAL控制部分块写选项和WRITE_BL_LEN除外)与读操作相同,参考下图
每个数据块都有一个“开始块”标记的前缀(一个字节)。在接收到数据块后,卡将使用数据响应令牌进行响应。如果接收到的数据块没有错误,将对其进行编程。
只要卡在忙编程,所有连续的忙令牌流将被发送到主机(有效地保持低数据输出线)。
一旦编程操作完成,主机应该使用SEND_STATUS命令(CMD13)检查编程的结果。一些错误(例如地址超出范围,违反写保护等)仅在编程期间检测到。
在数据块上执行并通过数据响应令牌与主机通信的唯一验证检查是CRC和一般写错误指示。
在多块写操作中,停止传输将通过在下一个块的开始处发送' stop Tran'令牌而不是'Start Block'令牌来完成。
如果出现写错误指示(在数据响应上),主机将使用SEND_NUM_WR_BLOCKS (ACMD22)来获取写好的写块的数量。
当卡忙时,重置CS信号不会终止编程过程。卡将释放数据输出线(三状态)并继续编程。
如果在编程完成之前重新选择卡,则DataOut线将被强制返回低电平,并且所有命令将被拒绝。
重置存储卡(使用CMDO用于SD存储卡)将终止任何挂起的或正在进行的编程。这可能会破坏卡上的数据格式。预防是主机的责任
擦写保护管理
SPI模式的擦写保护管理过程与SD模式的擦写保护管理过程相同。
当卡擦除或更改预定义扇区列表的写保护位时,它将处于忙状态并使DataOut线保持低电平。
下图说明了使用和不使用忙信令的“无数据”总线事务。