注:本文翻译自Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1)6.6 Data transfer mode章节,仅供大家参考,若翻译有误,请大家批评指正
读数据
-
没有数据传输时,DAT0-DAT7总线电平为高。 传输的数据块由每条DAT线上的起始位(LOW)组成,然后是连续的数据流。 数据流包含有效负载数据(和纠错位(如果使用了设备外ECC))。 数据流在每条DAT线上以结束位(HIGH)结尾。 除了HS400以外,所有接口的数据传输都与时钟信号同步,而HS400接口的数据传输与DS信号同步。
-
在每条DAT线路上,面向块数据传输的有效负载在单数据速率模式下由一个CRC校验和保护,在双数据速率模式下由两个CRC校验和保护。
-
在单数据速率模式下,数据传输的基本单位是一个块,其最大尺寸由CSD(READ_BL_LEN)定义。如果设置了READ_BL_PARTIAL,则其起始和结束地址完全包含在一个物理块中的较小块(由READ_BL_LEN定义)也可以被传输。每个块的末尾都会附加一个CRC,以确保数据传输的完整性。CMD17 (READ_SINGLE_BLOCK)启动块读取,完成传输后,设备返回传输状态。在双数据速率模式下,块读取的数据大小始终为512字节,不支持部分块数据读取,在每个块的末尾附加两个CRC,一个为偶数字节,一个为奇数字节。CMD18(READ_MULTIPLE_BLOCK)开始传输几个连续的块。
-
定义了两种类型的多块读取事务(主机可以在任何时候使用其中一种):
- 开放式多块读取:未定义用于读取多块操作的块数。 设备将连续传输数据块,直到收到停止传输命令 为止。
- 多块读取,预先定义块数:设备将传输所要求的数据块数量,终止交易并返回传输状态。在这种类型的多块读取结束时不需要停止命令,除非因错误而终止。为了以预定义的块数启动多块读取,主机必须在READ_MULTIPLE_BLOCK (CMD18)命令之前使用SET_BLOCK_COUNT命令(CMD23)。否则,设备将开始一个开放式的多块读取,可以使用STOP_TRANSMISSION命令停止。
-
在一个多块操作中,主机可以随时中止读取,无论其类型如何.事务中止是通过发送停止传输命令来完成的。如果发生以下任何一种情况,设备将拒绝该命令,保持在Tran状态,并以相应的错误位设置进行响应。
- 主机提供超出范围的地址作为CMD17或CMD18的参数。设置了ADDRESS_OUT_OF_RANGE。
- 当前定义的块长度对于读取操作是非法的。 设置了BLOCK_LEN_ERROR。
- 地址/块长度组合将第一个未对准设备物理块的数据块定位。 设置了ADDRESS_MISALIGN。
-
如果设备在多块读取操作(两种类型)中检测到错误(如超出范围、地址错位、内部错误等),它将停止数据传输并保持在数据状态。然后,主机必须通过发送停止传输命令来中止该操作。读取错误会在停止传输命令的响应中报告。
-
如果主机在设备发送了具有预定义数量的块的多块操作的最后一个块后发送了停止传输命令,则该命令被视为非法命令,因为设备不再处于数据状态。
-
如果主机使用其累积长度未按块对齐的部分块,并且不允许块未对齐,则设备应在传输第一个未对齐块的过程中检测到块未对齐错误情况,并且其他传输位的内容不确定。 主机发送CMD12时,设备将以ADDRESS_MISALIGN位置1进行响应,并返回到Tran状态。
-
如果主机将SET_BLOCK_COUNT命令(CMD23)的参数设置为全0,则该命令被接受; 但是,后续读取将遵循开放式多块读取协议(需要STOP_TRANSMISSION命令CMD12)。
-
如果主机已将密码设置的CMD16发送到高于2GB容量的设备,则该主机必须在读取数据传输之前重新发送CMD16; 否则,设备将响应BLK_LEN_ERROR并保持TRANS状态而不进行数据传输,因为数据块(密码应用程序除外)传输是扇区单位(512B)。 如果不支持部分读取访问,则相同的错误适用于2GB的设备密度。
写数据
-
写入操作的数据传输格式类似于读取的数据。 对于面向块的写数据传输,将单数据速率模式下的一个CRC校验位或双数据速率模式下的两个CRC校验位添加到每个数据块。 在写操作之前,设备会对每个接收到的数据块执行CRC奇偶校验。 通过这种机制,可以防止写错传输的数据。
-
一般来说,中断写入过程不应导致任何其他地址的现有数据损坏。然而,在不同的应用中,在写操作期间断电的风险是不同的。另外,对于一些用于实现eMMC的技术来说,在断电期间,保护现有数据(如之前完成的写入操作所写入的数据)与写入性能之间存在着权衡。主机有能力设置所需的数据可靠性类型。当EXT_CSD(WR_REL_SET)中的写数据可靠性参数(WR_DATA_REL_USR、WR_DATA_REL_1、WR_DATA_REL_2、WR_DATA_REL_3和WR_DATA_REL_4)设置为1时,将向主机指示相关分区中的写机制已经实施,以保护该分区中的现有数据。这意味着,一旦设备向主机指示写入已成功完成,被写入的数据以及之前写入的所有数据将不会被主机启动、控制器启动或意外的其他操作破坏。这些位的值为0,将表明如果电源被移除,这些分区中先前写入的数据会有一定风险。此可靠性设置仅影响主用户区和通用分区的可靠性。引导分区和 RPMB 分区中的数据必须具有与 WR_DATA_REL 位设置为 1 相同的可靠性,这些分区的可靠性不会受到 WR_DATA_REL 位值的影响。
-
主机可以选择更改设备上一个或多个分区中写入的可靠性。 整个寄存器被视为一次写入,因此主机有一次机会将寄存器中的所有位写入。 (不允许单独写入来更改各个位)此写入必须在分区过程中进行,并且必须在设置PARTITION_SETTING_COMPLETED位之前进行。 在完成分区过程之前(即,在重新启动电源并成功完成分区之后),对WR_REL_SET寄存器所做的更改不会有影响。 设备中不存在的分区的数据可靠性设置对设备没有影响。
-
所有写操作必须按它们到达的顺序完成。 顺序限制适用于设备接收的每个写入命令,不适用于特定写入命令中的数据。
-
在单数据速率模式下,在块写入(CMD24-27)期间,一个或多个数据块从主机传输到设备,并且主机将CRC附加到每个块的末尾。 支持块写入的设备应始终能够接受由WRITE_BL_LEN定义的数据块。 如果CRC失败,则设备应在DAT0线上指示失败; 传输的数据将被丢弃而不写入,并且所有后续传输的块(在多块写入模式下)将被忽略。 在双数据速率模式下,块写入的数据大小始终为512字节,不支持部分块数据写入,并且在每个块的末尾附加两个CRC,一个用于偶数字节,一个用于奇数字节。 CMD25(WRITE_MULTIPLE_BLOCK)开始传输几个连续的块。 定义了三种类型的多块写事务(主机可以随时使用这三种类型中的任何一种):
- 开放式多块写入:未定义用于写入多块操作的块数。 设备将连续写入数据块,直到收到停止发送命令为止。
- 具有预定义块数的多块写入:设备将接受预定义数量的数据块,所有数据块写入完成后终止事务并返回传输状态。 在这种类型的多块写操作结束时,不需要停止命令,除非因错误而终止。 为了开始使用预定义的块数进行多块写入,主机必须在紧接WRITE_MULTIPLE_BLOCK(CMD25)命令之前使用SET_BLOCK_COUNT命令(CMD23)。 否则,设备将启动无限制的多块写操作,可以使用STOP_TRANSMISSION命令停止该写操作。
- 可靠写入,具有预定义块数和可靠写入参数的多块写入:此事务类似于基本的预定义多块写入(在上一个项目符号中定义),但以下情况除外。 逻辑地址指向的旧数据必须保持不变,直到已成功编程写入相同逻辑地址的新数据为止。 这是为了确保由可靠写入事务更新的目标地址永远不会包含未定义的数据。 即使在编程过程中突然断电,数据也必须保持有效。
- SET_BLOCKLEN(CMD16)定义的块大小将被忽略,所有块的长度均为512B。如果激活了大扇区大小模式,则数据传输将以512 B扇区的倍数或八个512 B扇区的倍数进行。可靠写入的大小没有限制。
- 通过将SET_BLOCK_COUNT命令(CMD23)参数中的Reliable Write Request参数(位31)设置为“ 1”来激活该功能。
- 可靠的写事务必须按扇区对齐,如果可靠的写操作不按扇区对齐,则将设置错误位19,并且事务将无法完成。
- 如果在可靠的写入过程中发生断电,则写入所修改的每个扇区都是原子的。断电后,扇区可能包含旧数据或新数据。被中断的写操作修改的所有扇区都可能处于以下状态之一:所有扇区都包含新数据,所有扇区都包含旧数据,或者某些扇区包含新数据,某些扇区包含旧数据。
- 如果高优先级中断操作中断了可靠的写操作,则寄存器标记为完成的扇区将包含新数据,而其余扇区将包含旧数据。
- REL_WR_SEC_C [222]寄存器应设置为1,并且对可靠的写操作没有影响。
-
无论其类型如何,主机都可以在多块操作中随时中止写入。 通过发送停止传输命令来完成事务中止。 如果中止具有预定义块计数的多块写入,则未定义其余块中的数据。
-
如果发生以下任一情况,则设备将拒绝该命令,保持在“ Tran”状态,并以相应的错误位置1进行响应。
- 主机提供超出范围的地址作为CMD24或CMD25的参数。 设置了ADDRESS_OUT_OF_RANGE。
- 当前定义的块长度对于写操作是非法的。 设置了BLOCK_LEN_ERROR。
- 地址/块长度组合将第一个未对准设备物理块的数据块定位。 设置了ADDRESS_MISALIGN。
-
如果设备在多块写入操作(两种类型)中检测到错误(例如,违反写保护,超出范围,地址未对准,内部错误等),它将忽略任何进一步的传入数据块并保持在接收状态 。 然后,主机必须通过发送停止传输命令来中止操作。 在对停止传输命令的响应中报告写错误。
-
如果主机在设备接收到具有预定义数量的块的多块写操作的最后一个数据块后发送了停止传输命令,则该命令将被视为非法命令,因为设备不再处于rcv状态。
-
如果主机使用部分累积的长度未对齐的块,并且不允许块未对齐(未设置CSD参数WRITE_BLK_MISALIGN),则设备应在接收第一个未对齐块的过程中检测到块未对齐错误,并中止写入操作 ,然后忽略所有其他传入数据。 主机发送CMD12时,设备将以ADDRESS_MISALIGN位置1响应并返回到Tran状态。
-
如果主机将SET_BLOCK_COUNT命令(CMD23)的参数设置为全0,则该命令被接受;但是,随后的写入将遵循开放式多块写入协议(需要STOP_TRANSMISSION命令CMD12)。
-
CID和CSD寄存器的编程不需要先前的块长设置。 传输的数据也受CRC保护。 如果CSD或CID寄存器的一部分存储在ROM中,则此不可更改的部分必须与接收缓冲区的相应部分匹配。 如果匹配失败,则设备将报告错误,并且不会更改任何寄存器内容。
-
某些设备可能需要长时间且不可预测的时间来写入数据块。 接收到数据块并完成CRC检查后,设备将开始写入并保持DAT0线为低电平。 主机可以随时使用SEND_STATUS命令(CMD13)轮询设备的状态,并且设备将以其状态进行响应(处于休眠状态时除外)。 状态位READY_FOR_DATA指示设备是否可以接受新数据。 主机可以通过发出CMD7来取消选择设备,然后将设备置于断开状态并释放DAT0线而不会中断写入操作。 当重新选择设备时,它将通过将DAT0拉为低电平来重新激活忙碌指示。 有关忙碌指示的详细信息
-
如果主机已将密码设置的CMD16命令发送到高于2GB容量的设备,则该主机必须在数据传输之前重新发送CMD16;否则,设备将响应BLK_LEN_ERROR并保持TRANS状态而不进行数据传输,因为数据块(密码应用程序除外)传输是扇区单位(512B)。 如果不支持部分写访问,则相同的错误适用于高达2GB的设备密度。