6.6.6 Bus width selection
host验证总线上的功能引脚后,应使用SWITCH命令相应地更改bus width 。 通过写入EXT_CSD寄存器模式段中的bus_width字节来更改bus width。 通电或软件复位后,BUS_WIDTH字节的内容为0x00。
6.6.7 Data read
-
当没有数据传输时,DAT0-DAT7 bus line levels为高电平。传输的数据块包含了,其实的low bit和后面的数据流。 数据流包含了有效数据,同时如果使用了off-Device ECC,还包含错误校正bits。数据流以HIGH bit结束。
-
除HS400外,所有接口的时钟信号同步传输。HS400信号与DS信号同步传输。以block为传输形式的payload,每根数据线上有CRC校验保护,SDR有一个而DDR上有两个。
6.6.7.1 Block read
-
在sdr模式下,基本的数据传输单元是block,其最大容量在CSD寄存器的READ_BL_LEN中定义。 如果设置了READ_BL_PARTIAL,则也可以发送起始地址和结束地址完全包含在一个物理块(如READ_BL_LEN所定义的)内的较小块。CRC被附加到每个块的末尾,从而确保数据传输的完整性。
-
CMD17 (READ_SINGLE_BLOCK)发起块读操作,传输完成后,设备返回到传输状态 。 在DDR模式下,读取的块数据大小始终为512字节,不支持读取部分块数据,并且在每个块的末尾附加两个CRC,一个为偶数字节,一个为奇数字节。
-
两种读模式
- open-ended:直到收到停止读的命令才会停下来
- 预定义了结束位:预先定义了传输的块数,传输完成后恢复传输模式。一般不需要结束命令,除非遇到error。这种模式下,必须先定义块数量, SET_BLOCK_COUNT(CMD23) , 然后再READ_MULTIPLE_BLOCK (CMD18) 。否则使用open-ended模式进行读取,需要STOP_TRANSMISSION 才能停止。
-
在多块读过程中,host能够使用STOP_TRANSMISSION随时进行停止。 如果出现以下任何一种情况,设备将拒绝该命令,保持Tran状态,并设置相应的错误位:
- 设置CMD17或者CMD18时越界,报错ADDRESS_OUT_OF_RANGE
- 当前定义的块长度对于读操作是非法的,报错 BLOCK_LEN_ERROR
- 地址/块长度组合的第一个数据块位置和EMMC物理位置块不对齐 ,报错 ADDRESS_MISALIGN
-
在读取多个块时,如果eMMC检测到错误,将停止传输并停留在DATA State。host想要终止这个操作就需要发送终止操作命令,eMMC会返回对应的错误。
6. 如果host 在固定数据块读取最后一个块后下发了停止数据传输的命令,则该命令被视为是非法命令,因为此时的EMMC 没有在数据传输状态中。 若host使用的块未对齐,且eMMC必须要块对齐,则eMMC会在第一个未对齐的块处检测到一个未对齐的错误,之后传输内容则未定义。当host发送CMD12(STOP_TRANSMISSION )后,eMMC返回一个 ADDRESS_MISALIGN 错误,并且返回Transfer状态。
-
如果SET_BLOCK_COUNT(CMD23)设置为0,则之后的read模式为 open-ended multiple block,只能使用CMD12来停止读操作。
6.6.8 Data write
-
在写操作之前,设备对每个接收到的数据块执行CRC奇偶校验
-
一般来说,写操作的中断不应导致其他现有数据的错误。如果ECSD设置了WR_REL_SET则表明已经设置好相关的写保护。 boot分区和RPMB分区中的数据必须具有与将WR_DATA_REL位设置为1所类似的可靠性设置。这些分区的可靠性不受WR_DATA_REL位值的影响。
-
主机可以选择更改设备上一个或多个分区的写操作的可靠性。 整个寄存器被认为是一次写入,所以主机有一次机会写入寄存器中的所有位。 这种写操作必须作为分区过程的一部分进行,并且必须在PARTITION_SETTING_COMPLETED位设置之前进行。
6.6.8.1 Block write
- 在sdr模式下,在块写入(CMD24 - 27)期间,主机将一个或多个数据块传输到设备,并在每个块的末尾附加一个CRC。
- 支持块写入的设备应该总是能够接受由WRITE_BL_LEN定义的数据块。如果CRC失败,设备将在DAT0线上显示失败。传输数据失败,后面的数据也不会被保存。在DDR模式下,读取的块数据大小始终为512字节,不支持xie部分块数据,并且在每个块的末尾附加两个CRC,一个为偶数字节,一个为奇数字节。
- 三种写模式:
- Open-ended: 写多块操作的块数量没有定义。设备将持续接受和编程数据块,直到收到停止传输命令
- 具有预定义块计数的多块写入:设备将接受请求的数据块数量,终止事务并返回传输状态。一般不需要结束命令,除非遇到error。这种模式下,必须先定义块数量, SET_BLOCK_COUNT(CMD23) , 然后再WRITE_MULTIPLE_BLOCK (CMD25) 。否则使用open-ended模式进行读取,需要STOP_TRANSMISSION 才能停止。
- 可靠写:多个块写入,具有预定义的块计数和可靠写参数。类似于多块写入,区别在于:逻辑地址所指向的旧数据必须保持不变,直到写入同一逻辑地址的新数据被成功编程。 这是为了确保由可靠写更新的目标地址从不包含未定义的数据。 即使programming过程中突然断电,数据也必须保持有效。
这是为了确保由可靠写更新的目标地址从不包含未定义的数据。 即使programming过程中突然断电,数据也必须保持有效。