依JEDEC eMMC 5.1及经验辛苦整理,付费内容,禁止转载。
所在专栏 《元带你学: eMMC协议详解》
全文 4700字, 主要内容
1. 数据读取
2. 块读取操作
3. 数据写
4.块写操作
参考
1. 数据读取
当没有数据传输时,DATO-DAT7总线电平高。传输的数据块由每个数据线上的起始位(LOW)组成,后面跟着一个连续的数据流。数据流包含有效载荷数据(如果使用了设备外ECC,则包含纠错位)。数据流在每条数据线上以一个结束位(HIGH)结束。
除HS400外,所有接口的时钟信号同步传输,HS400接口的DS信号同步传输。面向块的数据传输的有效载荷在单数据速率模式下由一个CRC校验和保护,或者在双数据速率模式下由两个CRC校验和保护。
2. 块读取操作
在单数据速率模式下,数据传输的基本单位是一个块,其最大大小在CSD (READ_BL_LEN)中定义。CRC被附加到每个块的末尾,以确保数据传输的完整性。
CMD17 (READ SINGLE_BLOCK)发起块读操作,完成传输后,设备返回到transfer状态。在双数据速率模式下,读取的块数据大小始终为512字节,不支持读取部分块数据。
CMD18 (READ_MULTIPLE_BLOCK)开始传输几个连续的块。定义了两种类型的多块读事务(主机可以在任何时候使用其中一种):
- 开放式多块读取 (Open End Read)
读取多块操作的块数量没有定义。设备将继续传输数据块,直到收到停止传输命令。
- 具有预定义块计数的多个块读取 (Closed End Read)
设备将传输请求的数据块数量,终止事务并返回传输状态。在这种类型的多块读取结束时不需要Stop命令,除非以错误结束。为了启动具有预定义块计数的多块读取,主机必须使用SET_BLOCK_COUNT命令(CMD23) + READ_MULTIPLE_BLOCK (CMD18)命令。否则,设备将开始一个开放式的多块读取,可以使用STOP_TRANSMISSION命令停止。
在一个多块操作中,无论其类型如何,主机都可以在任何时候中止读取。事务中止是通过发送停止传输命令来完成的。如果出现以下任何一种情况,设备将拒绝该命令,保持Tran状态,并设置相应的错误位进行响应。
- 主机将超出范围的地址作为参数提供给CMD17或CMD18。设置ADDRESS_OUT_OF_RANGE。
- 当前定义的块长度对于读操作是非法的。设置BLOCK_LEN_ERROR。
- 地址/块长度组合定位第一个与设备物理块不对齐的数据块。设置ADDRESS_MISALIGN。
如果设备在多块读取操作(两种类型)期间检测到错误(例如,超出范围,地址不对齐,内部错误等),它将停止数据传输并保持在数据状态。然后,主机必须通过发送停止传输命令来中止该操作。在对停止传输命令的响应中报告读取错误。如果主机发送的停止传输命令是在设备发送了一个预定义块数的多块操作的最后一个块之后发出的,那么该命令将被视为非法命令,因为设备已不再处于数据状态。当主机发送CMD12设备将以ADDRESS MISALIGN位集响应并返回到Tran状态。
3. 数据写
写操作的数据传输格式与读操作的数据传输格式类似。对于面向块的写数据传输,在每个数据块上增加一个单数据速率模式下的CRC校验位或两个双数据速率模式下的CRC校验位。
在写操作之前,设备对每个接收到的数据块执行CRC奇偶校验。通过这种机制,可以防止写入错误传输(指在传输线路上发送数据错误)的数据。一般来说,对写过程的中断不应该导致任何其他地址的现有数据损坏。
在不同的应用程序中,写操作期间断电的风险是不同的。此外,对于用于实现e MMC的某些技术,在电源故障期间保护现有数据(例如,以前完成的写操作所写的数据)和写性能之间存在权衡。
主机能够设置所需的数据可靠性类型。当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位所暗示的相同的可靠性。
主机可以选择更改设备上一个或多个分区的写操作的可靠性。整个寄存器被认为是一次写入,所以主机有一次机会写入寄存器中的所有位。(不允许单独写操作来更改单个位)这种写操作必须作为分区过程的一部分进行,并且必须在PARTITION_SETTING_COMPLETED位设置之前进行。对WR_REL_SET寄存器所做的更改在分区过程完成之前(即在电源周期发生并且分区成功完成之后)不会产生影响。设置设备中不存在的分区的数据可靠性对设备没有影响。所有写操作必须按照它们到达的顺序完成。
4.块写操作
在单数据速率模式下,在块写入(CMD24 - 27)期间,主机将一个或多个数据块传输到设备,并在每个块的末尾附加一个CRC。支持块写入的设备应该总是能够接受由WRITE_BL_LEN定义的数据块。如果CRC失败,设备应在DATO线上提示失败(见下文);传输的数据将被丢弃,不写入,所有后续传输的块(多块写模式)将被忽略。双数据速率模式下,一个块写入的数据大小始终为512字节,不支持部分块数据写入,并且在每个块的末尾附加两个CRC,一个为偶数字节,一个为奇数字节。CMD25 (WRITE_MULTIPLE_BLOCK)启动几个连续块的传输。定义了三种类型的多块写事务(主机可以在任何时候使用这三种类型中的任何一种):
Open-ended Multiple-block write
写多块操作的块数量没有定义。设备将持续接受和编程数据块,直到收到停止传输命令。
Multiple-block write with pre-defined block count
设备将接受请求的数据块数量,终止事务并返回传输状态。在这种类型的多块写入结束时不需要Stop命令,除非以错误结束。为了启动具有预定义块计数的多块写入,主机必须使用SET_BLOCK_COUNT命令(CMD23)WRITE_MULTIPLE_BLOCK (CMD25)命令。否则,设备将开始一个开放式的多块写入,可以使用STOP_TRANSMISSION命令停止。
Reliable Write: Multiple block write with pre-defined block count and Reliable Write parameters.
此事务类似于基本的预定义多块写入(在前面的项目中定义),但有以下例外。逻辑地址所指向的旧数据必须保持不变,直到写入同一逻辑地址的新数据被成功编程。这是为了确保由可靠写事务更新的目标地址从不包含未定义的数据。即使在编程过程中突然断电,数据也必须保持有效。
SET_BLOCKLEN(CMD16)定义的块大小被忽略,所有块的长度都是512 B。如果激活大扇区大小模式,数据传输将在512b扇区中的多个扇区中进行,或者在8个512b扇区中的多个扇区中进行。对可靠写入的大小没有限制。
- 该功能通过在SET_BLOCK_COUNT命令(CMD23)参数中将可靠写请求参数(位31)设置为“1”来激活。
- 可靠写事务必须是扇区对齐的,如果一个可靠写不是扇区对齐的,错误位19将被设置,事务将不会完成。
- 如果在可靠写入过程中发生电源丢失,则写入所修改的每个扇区都是原子的。电源故障后,扇区可能包含旧数据或新数据。被中断的写操作修改的所有扇区可能处于以下状态之一:所有扇区都包含新数据,所有扇区都包含旧数据或部分扇区包含新数据,部分扇区包含旧数据。
- 在一个可靠的写操作被高优先级中断操作中断的情况下,寄存器标记为已完成的扇区将包含新数据,其余扇区将包含旧数据。
- REL_WR_SEC_C[222]寄存器应该设置为1,对可靠的写操作没有影响。
在一个多块操作中,无论其类型如何,主机都可以在任何时候中止写操作。事务中止是通过发送停止传输命令来完成的。如果一个具有预定义块计数的多块写操作被终止,那么剩余块中的数据将不被定义。如果出现以下任何一种情况,设备将拒绝该命令,保持Tran状态,并设置相应的错误位进行响应。
主机提供超出范围的地址作为CMD24或CMD25的参数。设置ADDRESS_OUT_OF_RANGE。
当前定义的块长度对于写操作是非法的。设置BLOCK_LEN_ERROR。
地址/块长度组合定位第一个与设备物理块不对齐的数据块。设置ADDRESS_MISALIGN。
如果设备在多块写操作(两种类型)期间检测到错误(例如,写保护违规,超出范围,地址不对齐,内部错误等),它将忽略任何进一步的传入数据块并保持在接收状态。然后,主机必须通过发送停止传输命令来中止该操作。在响应停止传输命令时,报告写错误。如果主机在接收到预先设定的多块写操作的最后一个数据块后发出停止传输命令,则认为该命令是非法的,因为设备已不再处于rcv状态。如果主机使用的部分块的累积长度不是块对齐的,并且不允许块错位(CSD参数WRITE_BLK_MISALIGN未设置),设备将在接收第一个错位块时检测到块错位错误,中止写操作,并忽略所有后续的数据。当主机发送CMD12时,设备将响应ADDRESS_MISALIGN位集并返回到Tran状态。如果主机将SET_BLOCK_COUNT命令(CMD23)的参数设置为所有o,则该命令被接受;然而,随后的写入将遵循开放式多块写入协议(需要STOP_TRANSMISSION命令—CMD12)。CID和CSD寄存器的编程不需要先前的块长度设置。传输的数据也受CRC保护。如果CSD或CID寄存器的一部分存储在ROM中,那么这个不可更改的部分必须与接收缓冲区的相应部分相匹配。如果匹配失败,那么设备将报告一个错误,并且不会更改任何寄存器内容。
有些设备可能需要很长且不可预测的时间来写入数据块。在接收到数据块并完成CRC检查后,设备将开始写入并保持低DATO线。主机可以在任何时候用SEND_STATUS命令(CMD13)轮询设备的状态,设备将用它的状态来响应(睡眠状态除外)。状态位READY_FOR_DATA表示设备是否可以接受新数据。主机可以通过发出CMD7来取消选择设备,这将使设备进入断开状态,并在不中断写操作的情况下释放DATO线。当重新选择设备时,它将通过将DATO拉到低来重新激活忙指示。有关忙指示的详细信息,请参见第6.15节如果一个主机已经发送了一个CMD16用于密码设置到高于2GB的设备密度,那么这个主机必须在写数据传输之前重新发送CMD16;否则,由于数据块(密码应用除外)传输是扇区单位(512B),设备将响应BLK_LEN_ERROR并保持TRANS状态而不进行数据传输。在不支持部分写访问的情况下,相同的错误适用于高达2GB的设备密度。
参考
免责声明:
本文根据公开信息整理,旨在介绍更多的存储知识,所载文章仅为作者观点,不构成投资或商用建议。本文仅用于学习交流, 不允许商用。若有疑问或有侵权行为请联系作者处理。