ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

eMMC5.1协议中文学习讲(5)

eMMC5.1协议中文学习讲(5)

事先声明本文不用于任何商业行为,仅用于本人学习与记录。所有截图版权均属于《Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1)》

欢迎点赞、收藏、转发分享给朋友,禁止未经书面授权的复制、搬运、二次剪辑。

如有引用请注明出处。

标准规范仍然以《Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1)》为准

写在最前:往后个人见解部分均用实线框出来。


5 e•MMC Device and System e・MMC 器件与系统

5.1 e•MMC System Overview e・MMC 系统概述

本 e・MMC 规范定义了接口以及器件控制器的行为。规范中默认存在主机控制器和存储阵列,但不对这两部分的具体工作方式做完整规定。

5.2 Memory Addressing 存储器寻址

早期 e・MMC 规范(v4.1 及更早版本)采用 32 位字段实现字节寻址。该寻址方式支持的 e・MMC 容量最大为 2GB(含 2GB)。

为支持更大容量,寻址机制更新为扇区寻址(扇区大小 512 字节)。容量大于 2GB 的所有器件都必须使用扇区地址。 主机需要读取 OCR 寄存器的 [30:29] 位,来判断当前器件的寻址模式。


字节寻址(老版本 ≤2GB)

早期 eMMC v4.1 及更早:32 位地址 = 字节地址 之后规范:改用扇区地址,1 扇区 = 512 字节

为什么 32 位字节寻址最大只能到 2GB?

32 位地址,能表示的地址总数:4294967296个地址 字节寻址:1 个地址 = 1 字节理论上限是 4GB?这里规范里限制到2GB是 eMMC 老规范的特殊约定(OCR 寄存器的寻址模式位定义,老模式只使用其中一半地址空间)

扇区寻址(新版本 >2GB)

地址不再代表字节,而是扇区编号规定:1 扇区 = 512 字节同样 32 位地址,现在能访问的容量: (2^32*512B = 2TB) 这就一下子支持大容量了(大于 2GB 的 eMMC 必须用这个模式)

OCR [30:29] 这两位是干嘛的?

eMMC 上电初始化阶段,主机不知道这个芯片是老 2GB 以内、还是大于 2GB 的大容量芯片。OCR 寄存器的 bit30、bit29,就是芯片告诉主机:我现在用哪一套寻址规则

  • 这两位的值,用来区分:字节寻址 / 扇区寻址
  • 主机读这两个 bit,然后切换自己的地址解析逻辑:
    • 如果是字节寻址:发命令时填的地址 = 字节偏移
    • 如果是扇区寻址:发命令时填的地址 = 扇区号,硬件 / 固件要按 ×512 换算

5.3 e•MMC Device Overview e・MMC 器件概述

e・MMC 器件通过可配置数量的数据总线信号传输数据。通信信号如下:

  • CLK:该信号的每个时钟周期,驱动命令线上 1bit 传输,同时在所有数据线上执行 1bit(1 倍速)或者 2bit(2 倍速)传输。时钟频率范围为 0 至最大时钟频率。
  • Data Strobe:该信号由器件产生,在 HS400 模式下用于数据输出。该信号频率跟随 CLK 频率。数据输出时,该信号每个周期在数据线上传输 2bit(2 倍速):上升沿传输 1bit,下降沿传输另 1bit。 对于 CRC 状态应答输出以及 CMD 应答输出(仅在 HS400 增强选通模式下启用),CRC 状态与命令应答仅在上升沿采样锁存,下降沿无效。
  • CMD:该信号为双向命令通道,用于器件初始化以及命令传输。CMD 信号包含两种工作模式:初始化阶段使用开漏模式,高速命令传输阶段使用推挽模式。命令由 e・MMC 主机控制器发送至 e・MMC 器件,应答由器件发回主机。
  • DAT0-DAT7:双向数据通道。DAT 信号工作在推挽模式。同一时刻只能由器件或者主机驱动该信号。上电或复位后,默认仅使用 DAT0 进行数据传输。e・MMC 主机控制器可配置更宽的数据总线,使用 DAT0-DAT3 或者 DAT0-DAT7 进行数据传输。 e・MMC 器件在 DAT1~DAT7 数据线上内置上拉电阻。进入 4bit 模式后,器件立即断开 DAT1、DAT2、DAT3 的内部上拉电阻;对应的,进入 8bit 模式后,器件立即断开 DAT1~DAT7 的内部上拉电阻。

e・MMC 接口上的信号定义见表 2。

个器件都拥有一组信息寄存器(另见第 7 章 器件寄存器):


名称宽度(字节)描述是否必须实现
CID16器件识别号,用于器件的唯一标识必选
RCA2相对器件地址,是器件的系统地址,由主机在初始化阶段动态分配必选
DSR2驱动级寄存器,用于配置器件的输出驱动器可选
CSD16器件特定数据,存放器件工作条件相关信息必选
OCR4工作条件寄存器,通过一条专用广播命令识别器件支持的电压类型必选
EXT_CSD512扩展器件特定数据,包含器件能力以及已选定模式的相关信息,自 v4.0 版本标准引入必选

主机可通过以下方式对器件执行复位:

  • 断开电源后重新上电。器件自带上电检测电路,上电后将器件置为确定状态。
  • 复位信号
  • 发送一条专用命令

5.3.1 Bus Protocol 总线协议

上电复位之后,主机必须通过一套基于消息的 e・MMC 总线专用协议完成器件初始化。每条消息由下面其中一种令牌构成:

  • 命令:命令是用于启动一次操作的令牌。命令由主机发往器件,在 CMD 线上串行传输。
  • 应答:应答是器件发给主机的令牌,用于回复之前收到的命令。应答在 CMD 线上串行传输。
  • 数据:数据可由器件发往主机,也可反向传输。数据通过数据线传输,传输可用数据线数量可以是 1 根(DAT0)、4 根(DAT0-DAT3)或者 8 根(DAT0-DAT7)。

对于每一根数据线,每个时钟周期可以传输 1bit(单数据速率)或者 2bit(双倍数据速率)。

器件寻址采用会话地址,该地址由总线控制器在初始化阶段分配给连接的器件。器件依靠 CID 编号识别。该方式要求每个器件拥有唯一的 CID 编号。为保证 CID 的唯一性,CID 寄存器包含 24 位(MID 和 OID 字段,见 7.2 节),由 JEDEC/MMCA 定义。所有器件厂商必须申请唯一的 MID(OID 可选)编号。

e・MMC 总线传输由命令、应答、数据块结构令牌组成。一次数据传输称为一次总线操作。操作一定包含命令令牌和应答令牌;部分操作还额外携带数据令牌。

e・MMC 命令是面向块的命令:这类命令传输一个数据块,数据块后紧跟 CRC 校验位。读、写操作均支持单块传输或者多块传输。多块传输依靠 CMD 线上后续发送的停止命令来结束,和顺序读操作的方式类似。

块写操作会在 DAT0 数据线上使用简单的忙信号,用来标识写操作持续的时间(见图 3)。


这边CMD和response在干什么。

host下发cmd,这个很合乎常理,我要发命令做事情了。

这个时候device要回:1、好的,我这就去,或是2、稍等,我在忙。

注意,他绝对不会回我做完了!这么短的时间是不可能的。所以device的response有一种我还在,我还活着的作用。并不是说回我做完了。那么主机怎么知道我的数据写已经写下去了,可以发下一笔写了?主机同样可以发一个命令询问,你写好了没?这时候device回一个1、我空闲2、我在忙就ok了。

绝大部分命令都有response,response与cmd之间的时间有规定,超过规定时间视作无相应,这在后文中有介绍。


命令令牌采用如下编码方案:

每一个命令令牌以起始位(0)开头,以结束位(1)结尾,总长度为 48 比特。每个令牌带有 CRC 校验位,用于检测传输错误,出错后可以重传操作。

应答令牌根据内容分为五种编码格式,令牌长度为 48 比特或者 136 比特。命令与应答的详细定义见 6.10 节和 6.12 节。


命令格式在后文中有介绍,命令格式对我们来时,前期还是算比较重要的,需要花心思掌握。尤其是response,可以极大程度区分eMMC从业者对协议的敏感度和熟练度。

从图中也可以看出cmd是带crc的噢。

CRC的功能不必多少,这是确保数据传输正确性的高效手段。任何数据的传输都离不开校验,CRC算是非常常用的一种,我挺想写一篇关于数据传输的文,谈谈自己的看法,这以后再说。


由于连续数据流传输没有预先定义结束边界,这类传输不携带 CRC 保护。块数据使用的 CRC 保护算法为 16 位 CCITT 多项式。所有用到的 CRC 类型都在8.1章节说明。


那么上面就是说1线制,4线制,8线制,数据如何传输从而合成最终数据,不做硬件得话不必深究。

还有就是讲了一个SDR和DDR模式,由于有同步时钟,那么采集信号就是以时钟来,可以一个跳变采集一位(上升沿或下降沿,规定好就用其中一个),这就是SDR,DDR顾名思义就是上升沿和下降沿都用上咯~


5.3.2 Bus Speed Modes 总线速率模式

e・MMC 定义了多种总线速率模式,表 4 汇总了各类模式。


规定五种速率模式,名字如上表所说,然后有寄存器会提供自己支持什么模式反馈给host,host获取到支持的模式会选择当下最适合的。

这里说一个概念,我们当然追求速度,但是同步时钟有一道坎,速率越高误码率越高,想要更高的速度硬件很难做的,再加上如果你焊到设备上,你与设备还需要进行tuning,也就是较准,也就是对准相位,那么对设备的要求也高。所以为了确保数据传输准确,这是最重要的,如果在高速时数据容易出现错误,不如降速~另外频率越低,功耗也越低不是。

那么为了解决同步时钟的这个问题,我们可以采用异步时钟啊,为了减少信号被干扰,我们可以采用差分信号啊~所以你看到的那些高速率的传输,基本上具备这两个特征。那么在移动存储上,更高的速度就是UFS,就完全不走你同步时钟这一套。


5.3.3 HS200 Bus Speed Mode HS200 总线速率模式

HS200 模式具备以下特性:

  • SDR 数据采样方式
  • 时钟频率最高 200MHz,数据速率最高 200MB/s
  • 支持 4 位或 8 位总线位宽
  • 单端信号,提供 4 档驱动强度
  • 信号电平支持 1.8V 与 1.2V
  • 读操作支持调谐机制

5.3.4 HS200 System Block Diagram HS200 系统框图

图 12 为典型的 HS200 主机与器件系统。主机内部包含时钟发生器,向器件提供 CLK 时钟信号。 写操作时,时钟与数据传输方向一致,写数据可以和 CLK 同步传输,不受传输线延时影响。 读操作时,时钟与数据传输方向相反;主机收到的读数据会受到往返延时、输出延时以及主机、器件本身的时延影响。因此在读操作场景下,主机需要具备可调节采样点,保证可靠接收输入数据。

5.3.5 HS200 Adjustable Sampling Host HS200 可调采样(主机侧)

主机可以采用可调采样机制来确定正确的采样点。器件内部预先存放了调谐块,主机可借助它找到最优数据采样点。主机可以使用 CMD21 调谐命令读取该调谐块。

5.3.6 HS400 Bus Speed Mode HS400 总线速率模式

HS400 模式具备以下特性:

  • DDR 数据采样方式
  • 时钟频率最高 200MHz,数据速率最高 400MB/s
  • 仅支持 8 位总线位宽
  • 信号电平支持 1.8V 和 1.2V
  • 最多支持 5 档驱动强度
  • 数据选通信号仅在数据输出、CRC 应答、命令应答时翻转

5.3.7 HS400 System Block Diagram HS400 系统框图

图 13 是典型的 HS400 主机与器件系统。主机内置时钟发生器,向器件提供 CLK 时钟信号。 在读操作时,数据选通信号由器件输出电路产生。主机接收的数据、CRC 状态以及(开启增强选通模式时的)命令应答,都与数据选通信号边沿对齐。


这里可以讲一个Data Strobe数据选通,他是干什么的,比方说一个时钟,一个发送发,一个接收方,如果两个人都能卡在节拍上收发数据,那自然是最好的,但是有时接收方回数据并不在节拍上,速度越高越容易不在节拍上(eMMC里HS400模式才需要数据选通)。那怎么办,发送发就说:没事,我给你一个Data Strobe信号线,我接受你的消息用Data Strobe当作时钟采样,这样双方收发数据即使不在一个节拍上也没问题了。

另外,Flash上也有一个DS pin,其作用也是增强数据采样,增强稳定性的作用,我没有细细研究,原理应该比较类似。


RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进