瀚海微SD NAND之SD 协议(37)SPI总线保护和读写

2024-08-21 09:57:46 浏览数 (2)

总线传输保护

总线上传输的每条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线保持低电平。

下图说明了使用和不使用忙信令的“无数据”总线事务。

sdn

0 人点赞