一篇文章让你彻底弄懂Emmc协议
解读一下EMMC文档协议,下面的内容是我们在coding写代码的时候,必须要弄明白的东西,Emmc规格书的内容很多,下面是我自己总结的核心内容,希望对大家的学习工作都有所帮助。
创作不易,给点赞收藏加关注,感谢,哈哈哈。
目录
总体概括:
eMMC架构图
eMMC引脚定义
Memory Addressing
eMMC Device Overview
Register Introduction
Bus protocol
Bus Speed Mode
详解 HS400 System Block Diagram
Memory Addressing
Bus
Host Controller
相关寄存器
OCR Register
CID Register
CSD寄存器
eMMC总流程状态图
两种boot模式:
eMMC工作模式转换
Command 命令
Command classes(命令分类)
Command types(命令类型)
Command format(命令格式)
Detailed command description(命令详细说明)
Device state transition table (设备状态转换表)
Responses
R1类型
R2类型
R3类型
R4 R5类型
总体概括:
第1-5章主要将讲解的是eMMC协议整体框架 协议类型,
协议总线特性(CLK CMD DS DATAD等总线),第六章主要讲述的是eMMC的状态机,分区管理等,第7 章主要 详解设备寄存器(OCR register CID CSD externed CSD Rsegister RCA DSR QSR。不同寄存器操作原理都是类似的。具体看手册。等),第八章(错误保护), eMMC机构标准 分区管理,其实呢内容最多最重要的还是第六章。

eMMC架构图
eMMC(Embedded Multi Media Card)好处就是emmc提供统一的访问接口,把不同nandflash的访问差异交给模块中eMMC,处理器只需要用统一的标准eMMC接口即可访问 Nandflash

eMMC引脚定义
和SPI通信方式相似,都是一主多从模式 SPI通信方式:主设备发送命令字通知从设备的鉴别访问 的类别,而后发送访问地址和数据 。
简单介绍一下SPI:
SPI:是全双工且SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps
CS/SS :从设备片选信号 ,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备 ,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
SCLK :串行时钟信号 ,由主设备产生。


具体更多的details网上查阅相关资料。
eMMC所有的命令和响应都是Command总线上发送的,CMD分很多类具体可以查看一下手册。

Memory Addressing
在4.1规范之前使用32位地址,最高容量达到2G;4.1之后采用512Byte扇区访问模式(eMMC中1Block=512Byte NANDFLASH 1Block=1024BYTE),可支持大于2G的存 储空间。
host读取OCR寄存器位[39:29]确定寻址模式。 How to set具体看手册第七章寄存器详解
OCR**(Operation Conditions Register,操作条件寄存器)** : 作用:OCR用于识别Host设备支持的电压类型。
应用场景:在设备初始化时,主机通过发送特殊命令读取OCR,以确认设备的工作电压。

eM MC Device Overview****
eMMC接口与Host(主机)进行通信,实现eMMC的协议逻辑: CLK:时钟信号,用于主机与eMMC卡间的同步。
Data Strobe:数据锁存信号,eMMC卡端的输出信号 用于HS400模式
CMD:用于传输从主机端发出的命令command和eMMC卡端发出的回应respons DATA0 ~ DATA7:用于在主机和eMMC卡间传输数据
Reset:复位信号线,主要用于主机对eMMC卡进行复位操作


VCCQ对GPIO引脚供电
GPIO的几种配置模式:
PP: PUSH PULL推挽输出 通常用于输出模式,表示信号线可以驱动高电平或低电平,
OD open-Drain开漏输出 这是一种输出配置 ,其中晶体管的漏极连接到负载,源极接地,用于实现高阻抗输出(默认情况下为高电平)。
Register Introduction
CID 16BYTE 128bit 其中bit127:120]为MID bit[113:112]为CBX(indicates device type)。。。。如何设置具体也可看手册。

Bus protocol
Nand-FLASH的每个Block大小为1024Byte,eMMC则为512Byte。
分为读 写总线协议 每一个命令都是由CMD总线传输,Host发送Command命令,设备回复
responce,数据以Block的形式在数据线上发送,每个block都包含一个CRC校验码。
读操作

写操作

从设备没有响应的回复

四种Token形式

Command token format

总长度48bits;
固定以0开始,以1结束;
transmiter bit表示数据的传输方向,1代表从host to device;
通过CRC7保护,device 端在接收到CMD时同样会计算一个CRC值,如果与host发送的CRC不一致,则被认为是传输错误;
response token format

有5种格式,使用哪种格式依赖于CMD,长度为48bits或136bits;
start bit 总是0,在没有数据传输的情况下,CMD 信号保持高电平,当 eMMC Device 将 Start Bit 发送到总线上时,Host 可以很方便检测到该信号,并开始接收 Response
transmitter bit 代 表 传 输 方 向 ,0 表 示 device to host; Content 为 Response 的具体内容,不同的 Command 会有不同的 Content
CRC7 是包含 Start Bit、Transmission Bit 和 Content 内容的 CRC 校验值
后面同理,详细看这篇文档
3 : eMMC 总线 token_emmc crc token- 博客
Bus Speed Mode
五种总线工作模式。常用的SDR DDR HS400

详解 HS400 System Block Diagram

Memory Addressing
4.1规范之前使用32位地址,最高容量达到2G;4.1之后采用512B扇区访问模式,可支持大于2G的存储空间。host读取OCR寄存器位[39:29]确定寻址模式。
Bus
CLK:进行数据传输的同步和设备运作的驱动;
CMD:用于Host向eMMC发送Command和eMMC向Host发送对应的Response;
Data Strobe:由eMMC发送给Host,用于Host端进行数据接收的同步,用于HS400速率模式;
DAT0-7:数据传输
Host Controller
通过发送CMD读写device端数据或通过CMD对device端进行配置
eMMC Device Controller
实现对memory的管理,接收bus端的CMD,实际读写I/O寄存器
Flash Memory
包含了实际的存储介质nand flash
HS400的主要功能是提供一种高速、可靠的数据传输机制 ,允许eMMC设备与主机之间进行高效的数据交换。
| 特性 | 描述 |
|---|---|
| 高速数据传输 | HS400模式支持高达400 MB/s的读写速度,远超低速模式(如HS200和之前的模式),使得eMMC设备能够高效处理大容量数据。 |
| 时钟与数据同步 | 在HS400模式下,主机通过时钟发生器向设备提供时钟信号(CLK),数据传输中的数据锁相环(DLL)确保数据在高速传输中的正确时序和同步性。 |
| 数据strobe | 设备通过输出电路生成数据 strobe 信号,主机利用这个信号精确定时接收到的数据、CRC状态和命令响应,确保数据传输的准确性和稳定性,有效减少时序误差。 |
HS400 System Block Diagram Figure 13 shows a typical HS400 Host and Device system. The host has a clock generator that supplies CLK to the Device. For read operations, Data Strobe is
generated by device output circuit. Host receives the data, CRC Status, and CMD Response (when
Enhanced Strobe is enabled), that are aligned to the edge of Data Strobe

HS400 Host and Device block diagram
| 组件**/**功能 | 描述 |
|---|---|
| 时钟生成器**(Clock Generator)** | 主机用于生成系统操作所需时钟信号的组件。 |
| 输出电路**(Output Circuit)** | 设备上用于生成数据选通信号的电路。 |
| 命令**/数据输入(CMD-In****/**DAT) | 主机用于接收设备发送的命令和数据输入信号的接口。 |
| 闪存**/存储器(Flash****/**Memory) | 设备上用于存储数据的部分。 |
|---|---|
| 可调采样点**(Adjustable Sampling Point)** | 在数据传输中用于调整数据采样时刻的功能。 |
| 命令响应输出**(CMD Resp Output)** | 设备发送给主机的命令响应信号。 |
| 命令输入电路**/命令输出(CMDInputCircuit********/**CMD-Out) | 主机用于接收命令输入信号和设备发送命令响应的输出。 |
| 数据选通模式**(Data Strobe Mode)** | 数据传输时使用的选通信号模式,如增强模式。 |
| 增强数据输入电路**/数据输出(Emanced DATInput Circuit/**DAT-Out) | 设备上用于接收增强数据输入和数据输出信号的电路。 |
这些寄存器得每个位的意义相当多的,具体的要看一下eMMC5.1协议芯片手册,下面介绍一下常用寄存器的概述
| Register | 作用 | 应用场景 |
|---|---|---|
| CID(Device Identification number) | 每个eMMC设备的唯一身份标识符。 | 设备初始化时,主机读取CID来识别设备。 |
| RCA(Relative Device Address) | 设备在系统中的地址。 | 设备初始化过程中,主机动态分配 RCA给eMMC设备,用于后续通信。 |
| DSR(Driver Stage Register) | 用于配置eMMC设备的输出驱动,以适应不同的电气特性。 | 调整设备的电气特性,如信号强度或输出阻抗的配置。 |
| CSD(Device Specific Data) | 包含了设备操作条件的信息, 如读写速度、块大小等。 | 主机读取CSD来了解正确操作设备所需的参数,如读写速度和块大小。 |
| OCR(Operation Conditions Register) | 用于识别设备支持的电压类型。 | 设备初始化时,主机通过OCR确认设备的工作电压。 |
| EXT_CSD(Extended Device Specific Data) | 提供了设备能力和选择模式的详细信息,eMMC v4.0引入。 | 用于配置高级特性,如分区信息、安全功能、性能参数等。 |
这些寄存器就像设备的配置手册,告诉主机如何与eMMC设备正确地交流和操作。在设备启动和过程中,主机需要读取和可能写入这些寄存器,以确保设备按照预期工作。
SD/MMC 内部寄存器 - Efronc - 博客园 (cnblogs.com)
相关寄存器
OCR Register
用于存储设备(如多媒体卡或eMMC)的电源电压配置文件和访问模式指示。此外,它还包括一个状态信息位,该位在设备完成上电过程后会被设置。 主要是配置设备的电压用的。

以下是eMMC OCR寄存器每一位的配置值说明:

OCR(操作条件寄存器)是一个32位的寄存器,用于存储设备(如多媒体卡或eMMC)的电源电压配置文件和访问模式指示。此外,它还包括一个状态信息位,该位在设备完成上电过程后会被设置。以下是OCR寄存器每一位的配置值说明:
位[6:0]:保留位,通常设置为000 0000b。
位[7]:用于1.70 - 1.95V的VCCQ电压窗口,设置为0b表示低电压,1b表示高电压。
位[14:8]:用于2.0 - 2.6V的VCCQ电压窗口,设置为000 0000b。
位[23:15]:用于2.7 - 3.6V的VCCQ电压窗口,设置为1 1111 1111b。
位[28:24]:保留位,通常设置为0 0000b。
位[30:29]:访问模式,设置为10b表示扇区模式。
位[31]:设备上电状态位(忙),如果设备已完成上电过程,则该位被设置为LOW。
CID Register
设备标识(CID)寄存器是128位宽(16BYTE)。它包含设备标识阶段(即MMC协议)使用的设备标识信息。每个单独的闪存或I/O 设备应具有唯一标识号。每种类型的e•MMC都应具有唯一的标识号。表75列出了这些标识符。

Table75 --CID Files

每一字段具体含义看手册。
CSD寄存器
CSD Register 16Byte 以下部分描述CSD字段和相关数据类型。如果没有明确定义,所有位串都被解释为从左位开始的二进制编码数。

Table78 --CSD Files

eMMC总流程状态图****

拆解:

两种boot模式:
- Original Boot:拉低 CMD 信号并保持不少于 74 个时钟周期(发CMD0 带参数0XF0F0F0F0之后,构造一个cmd,cmd的cmdarg参数为任意比如0XFFFFFB ,应为后面不需要发送命令,只将clk拉高就行即boot区域的数据会自动返回,此时我们需要传入一个data来接收boot分区吐出来的数据, 调用mmc_send_cmd()接口,底层会调用dwmci_send_cmd函数,设置flags标志位,即boot_mod设置为1.)


2.Alternative Boot:保持 CMD 信号为高电平,74 个时钟周期后,发送参数为 0xFFFFFFFA 的 CMD0 命令


eMMC工作模式转换
[eMMC工作模式 - 超详细原理讲解_emmc cid只能修改一次吗-博客]( "eMMC工作模式 - 超详细原理讲解_emmc cid只能修改一次吗-博客")
eMMC Device 在 Power On、HW Reset 或者 SW Reset 时,Host 可以触发 eMMC Boot,让 eMMC 进入 Boot Mode。在此模式下,eMMC Device 会将 BootData 发送给 Host,这部分内容通常为系统的启动代码,如 BootLoader。
如果 Host 没有触发 Boot 流程或者 Boot 流程完成后,eMMC Device 会进入 Device Identification Mode。在此模式下,eMMC Device 将进行初始化,Host 会为 eMMC Device 设定工作电压、协商寻址模式以及分配 RCA 设备地址。
Device Identification Mode 结束后,就会进入 Data Transfer Mode。在此模式下,Host 可以发起数据读写流程。
进入 Data Transfer Mode 后,Host 可以发起命令,让 eMMC Device 进入 Interrupt Mode。在此模式下,eMMC Device 会等待内部的中断事件,例如,写数据完成等。eMMC Device 在收到内部中断事件时,会向 Host 发送 Response,然后切换到 Data Transfer Mode,等待 Host 后续的数据读写命令。
几种模式的详情具体看手册:
- eMMC 5.1A协议中p31、p36、p39、p40,有四个状态机转移图,这几个状态转移图可以连起来的。
- Power on之后eMMC设备依次进入Boot mode(可跳过),然后CMD 1之后进入Device identification mode,再然后进入到Data transfer mode,最后可以在Interrupt mode之间切换。还有一个inactive mode ,它出现在eMMC协议Figure 25中,通过CMD 15主动进入或在对应情况下自动进入。
- Boot mode :是eMMC设备启动的初始模式,用于检查eMMC的健康状况(温度、电压、电容等)并加载配置信息(容量、扇区大小、坏块表等),初始化eMMC存储空间等。
- Device identification mode :用于向主机提供设备信息,如设备类型、容量、版本等。
- Data transfer mode :是eMMC设备的主要工作模式,用于执行主机的命令,eMMC的读、写、擦除等数据传输功能都在此模式下实现。
- Interrupt mode :eMMC device可以向host发送中断,用于通知主机发生了某些事件。eMMC支持多种中断,包括写完成中断、擦除完成中断等。
- Inactive mode :通常是eMMC设备的一种低功耗状态,用于降低功耗和延长设备寿命,尤其在设备长时间不被访问时。在非活动模式下,eMMC设备通常处于一种较低的功耗状态,以节省电能。
Command 命令
这个Command讲的是主机发送的命令 在CMD总线上传输。
"Commands"在eMMC架构中是Host用来控制eMMC设备的一系列指令,它们通过CMD线传输。CMD线是物理连接,而Command是逻辑上的指令。这些命令是eMMC操作的基础,用于执行各种存储操作,而在eMMC的通信协议中,

Command classes(命令分类)
每个设备支持那个class命令CSD寄存器的CCC[95:84] FEILDS来查询。

Command types(命令类型)
一共有四种命令来控制eMMC:
•无应答广播命令(bc),
•有应答广播命令(bcr),
•寻址(点对点)命令(ac),(但在DAT线上没有数据传输。)
•寻址(点对点)数据传输命令(adtc),(在DAT 线上进行数据传输)
所有命令和响应都通过eMMC总线的CMD线发送。命令传输总是从对应于命令编码的最左边比特串的比特作为开始。也就是从最高位开始传输
Command format(命令格式)
所有命令都有一个固定的48位的代码长度,传输时间为0.92微秒,52 MHz。
表1 命令格式表,表中x的值表示该变量取决于命令
由此表可知,命令总是开始于一个起始位(总是“0”),然后是指示方向[]的位传输(主机=“1”)。接下来6位表示命令索引,该值为一个二进制编码的数字(0到63之间),有些命令需要一个参数(例如一个地址),它是32比特的编码,所有命令都受CRC保护。每个命令代码由结束位(始终为“1”)终止。

Detailed command description(命令详细说明)


Device state transition table (设备状态转换表)
这些状态分别为空闲(idle) 、准备(ready) 、识别(ident) 、等待(stby) 、传输(tran) 、发送(data)、 接收(rcv)、 程序(prg) 、不断开连接(dis) 、活动(ina) 、slp(休眠)、irq(等中断) 这些。详见6.3~6.6.1

Responses
主机通过CMD线发送命令,那么从机肯定有个responses

R1类型
下面为5种应答类型及其格式。R1(正常应答类型):编码长度为48位,表5为R1应答格式表。
R1b比R1多一个busy信号,当设备接收命令变得busy后他可以通过拉低DAT0来反馈给主机,详见6.15

R2类型
R2(CID寄存器、CSD寄存器):编码长度为136位,CID 寄存器的内容作为对 CMD2 和 CMD10的应答发送。CSD 寄存器的内容作为 CMD9 的应答发送,只有1~127位会被发送,表6位R2应答格式表。

R3类型
R3(OCR寄存器):编码长度为48位,OCR寄存器的内容作为CMD1的应答发送,表7为R3应答格式表。无CRC保护

R4 R5类型

