[emmc] emmc总线设置

本文详细介绍了EMMC总线设置的过程,包括时钟频率、总线速度模式、总线宽度模式和信号电压的设置方法。针对每个设置,文章不仅阐述了理论知识,还提供了代码示例和操作步骤,确保EMMC与主机之间的通讯正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说明

1、设置总线时需要设置的内容

  • 时钟频率
    host需要提供给emmc对应的时钟。如上述所说,不同的总线速度模式对应不同的最大时钟频率。
    只需要设置host侧即可。
  • 总线速度模式的设置
    这是host和emmc card通讯的一种时序规范,因此,host和emmc的总线速度模式必须匹配起来才能正常通讯。
    需要设置host侧和emmc侧。
  • 总线宽度模式的设置
    host和emmc通讯的DATA脚数量的定义,同样会影响他们之间的通讯。因此,双方也必须规定一个固定的宽度来进行后续的数据传输。
    需要设置host侧和emmc侧。
  • 信号电压的设置
    也就是IO电压。对于sd card来说,card侧需要知道host提供的信号电压(3.3V或者1.8V)。但是emmc并不需要。
    只需要设置host侧即可。

2、emmc支持的总线速度模式

信号电压、时钟频率、总线宽度很大程度上都取决于总线速度模式。以下来看一下他们的关系。
从《emmc 5.1》协议上看,有如下几种总线速度模式

avatar

  • 总线速度模式说明
    • legacy mode
      单边采样(SDR),支持3V/1.8V/1.2V的信号电压,总线宽度支持1、4、8bit模式。
      最大频率支持到26Mhz。
      对应kernel中host的MMC_TIMING_LEGACY时序。
    • HS mode
      单边采样(SDR),支持3V/1.8V/1.2V的信号电压,总线宽度支持1、4、8bit模式。
      最大频率支持到52Mhz
      对应kernel中host的MMC_TIMING_MMC_HS时序。
    • HSDDR mode
      双边采样(DDR),支持3V/1.8V/1.2V的信号电压,总线宽度支持4、8bit模式。
      最大频率支持到52Mhz
      对应kernel中host的MMC_TIMING_UHS_DDR50时序。
    • HS200 mode
      单边采样(SDR),支持1.8V/1.2V的信号电压,总线宽度支持4、8bit模式。
      最大频率支持到200Mhz
      对应kernel中host的MMC_TIMING_MMC_HS200时序。
    • HS400 mode
      双边采样(DDR),支持1.8V/1.2V的信号电压,总线宽度支持8bit模式。
      最大频率支持到200Mhz。
      对应kernel中host的MMC_TIMING_MMC_HS400时序。

二、总线参数设置方法

1、时钟频率的设置

  • 各个总线速度模式下的最大时钟频率在协议中已经是固定的了。
    在代码中定义如下
   #define MMC_HIGH_26_MAX_DTR             26000000
   #define MMC_HIGH_52_MAX_DTR             52000000
   #define MMC_HIGH_DDR_MAX_DTR     52000000
   #define MMC_HS200_MAX_DTR    200000000
   #define MMC_HS400_MAX_DTR    200000000
  • 设置时钟频率方法
    mmc core已经提供了接口,mmc_set_clock,直接调用即可。
    示例如下
    mmc_set_clock(host, MMC_HIGH_52_MAX_DTR);

2、总线速度模式的设置

  • 如何获取emmc支持的总线速度模式?
    从ext_csd中获取:

avatar

kernel中定义如下

#define EXT_CSD_CARD_TYPE_26    (1<<0)    /* Card can run at 26MHz */
#define EXT_CSD_CARD_TYPE_52    (1<<1)    /* Card can run at 52MHz */
#define EXT_CSD_CARD_TYPE_MASK    0xFF    /* Mask out reserved bits */
#define EXT_CSD_CARD_TYPE_DDR_1_8V  (1<<2)   /* Card can run at 52MHz */     /* DDR mode @1.8V or 3V I/O */
#define EXT_CSD_CARD_TYPE_DDR_1_2V  (1<<3)   /* Card can run at 52MHz */     /* DDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_DDR_52       (EXT_CSD_CARD_TYPE_DDR_1_8V  | EXT_CSD_CARD_TYPE_DDR_1_2V)
#define EXT_CSD_CARD_TYPE_SDR_1_8V    (1<<4)    /* Card can run at 200MHz */
#define EXT_CSD_CARD_TYPE_SDR_1_2V    (1<<5)    /* Card can run at 200MHz */    /* SDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_HS200        (EXT_CSD_CARD_TYPE_SDR_1_8V  | EXT_CSD_CARD_TYPE_SDR_1_2V)
#define EXT_CSD_CARD_TYPE_HS400_1_8V    (1<<6)    /* Card can run at 200MHz */    /* DDR mode @1.8V I/O */
#define EXT_CSD_CARD_TYPE_HS400_1_2V    (1<<7)    /* Card can run at 200MHz */    /* DDR mode @1.2V I/O */
#define EXT_CSD_CARD_TYPE_HS400        (EXT_CSD_CARD_TYPE_HS400_1_8V  | EXT_CSD_CARD_TYPE_HS400_1_2V)

使用示例:

card->ext_csd.card_type & EXT_CSD_CARD_TYPE_SDR_1_2V
  • 如何设置emmc的总线速度模式
    主要是设置ext_csd的HS_TIMINIG寄存器

avatar

使用示例

    //HS SDR(mmc_select_hs):
       err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,EXT_CSD_HS_TIMING, 1,card->ext_csd.generic_cmd6_time);
    //HS DDR(mmc_select_hsddr->mmc_select_hs):
        err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,EXT_CSD_HS_TIMING, 1,card->ext_csd.generic_cmd6_time);
        其ddr和总线宽度模式一起设置。
    //HS 200(mmc_select_hs200)
        err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 2, 0);
    //HS 400(mmc_select_hs400)
       err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, 3, 0);
  • 如何获取host支持的总线速度模式
    根据mmc_host的caps属性和caps2属性进行判断。
#define MMC_CAP2_HS400_1_8V    (1 << 22)        /* can support */
#define MMC_CAP2_HS400_1_2V    (1 << 23)        /* can support */
#define MMC_CAP2_HS400        (MMC_CAP2_HS400_1_8V | MMC_CAP2_HS400_1_2V)
#define MMC_CAP2_HS200_1_8V_SDR    (1 << 5)        /* can support */
#define MMC_CAP2_HS200_1_2V_SDR    (1 << 6)        /* can support */
#define MMC_CAP2_HS200        (MMC_CAP2_HS200_1_8V_SDR | 
<think>嗯,用户想了解eMMC总线,首先得明确eMMC是什么。eMMC全称是嵌入式多媒体卡,主要用于移动设备的存储。总线部分可能涉及接口类型、通信协议这些。 我记得eMMC内部结构包括控制器、闪存和标准接口。总线应该负责控制器和闪存之间的数据传输,还有主机和eMMC之间的通信。需要确认eMMC使用的总线标准,比如是不是基于MMC架构的,可能涉及时钟、数据线数量等。 接下来,总线的物理层特性,比如引脚定义,可能包括CLK、CMD、DATA线。eMMC版本不同,总线速度也不同,比如4.5版本可能支持HS400模式,数据速率更高。需要查证不同版本的总线速度差异。 然后是协议层,总线通信的指令和响应机制。eMMC使用命令帧结构,主机发送命令,设备响应。可能涉及CMD线和DAT线的分工,数据传输时的块大小、错误校验等。 还要考虑总线对性能的影响,比如并行数据线的数量,8位总线比4位或1位更快。总线模式如SDR、DDR、HS200、HS400的区别,各自的数据传输速率。 另外,总线的电源管理,是否有低功耗模式,如何通过总线控制设备的电源状态。错误处理和重传机制也是总线协议的一部分,确保数据可靠性。 可能用户还关心应用场景,比如手机、平板为什么选用eMMC,与其他接口如UFS的比较。需要简要说明eMMC总线的优缺点,比如成本低但速度不如UFS。 需要确保回答结构清晰,分物理层、协议层、性能等部分,举例说明总线参数,同时对比不同版本的变化。避免技术错误,比如确认eMMC确实使用并行数据线,不同版本的最高速度数值准确。</think>好的,我将逐步介绍eMMC总线的关键信息: ### 一、eMMC总线的基本定义 eMMC(embedded MultiMediaCard)总线是连接主机处理器与eMMC存储芯片的通信通道,遵循JEDEC制定的MMC协议标准。它整合了以下三部分: 1. **NAND Flash存储器**:存储数据的核心介质 2. **Flash控制器**:负责执行协议和存储管理 3. **标准接口**:通过11个信号引脚实现通信 总线拓扑示意图: $$ \begin{array}{ccc} \text{主机(CPU)} & \leftrightarrow & \text{eMMC控制器} \\ & \text{通过总线} & \downarrow \\ & & \text{NAND Flash阵列} \end{array} $$ ### 二、总线物理层特性 1. **信号线组成**(共11线): - CLK(时钟线):频率范围0-200MHz(版本5.1) - CMD(命令线):双向传输控制指令 - DAT0-DAT7(数据线):双向数据传输 - VCC/VSS(电源/地) 2. **传输模式演进**: - 默认模式:20MHz,单数据速率(SDR) - HS200模式:200MHz,双数据速率(DDR) - HS400模式:200MHz,差分时钟,8位数据总线 ### 三、协议层关键机制 1. **命令帧结构**: - 48位固定长度 - 包含起始位、传输方向、命令索引、参数、CRC校验 - 示例命令格式: $$ \text{CMD}[47:0] = \underbrace{0}_{\text{起始位}} \parallel \underbrace{1}_{\text{传输方向}} \parallel \underbrace{6\text{bit索引}}_{\text{命令类型}} \parallel \underbrace{32\text{bit参数}}_{\text{地址/数据}} \parallel \underbrace{7\text{bit CRC}}_{\text{校验}} \parallel \underbrace{1}_{\text{结束位}} $$ 2. **数据传输类型**: - 单块传输:默认512字节/块 - 多块传输:连续读写多个数据块 - 交错传输:混合命令与数据 ### 四、性能参数对比 | 版本 | 总线模式 | 最大速率 | 数据线宽度 | |---------|------------|----------|------------| | 4.41 | HS200 | 200MB/s | 8-bit | | 5.1 | HS400 | 400MB/s | 8-bit | | 5.1A | HS400ES | 600MB/s | 8-bit | ### 五、实际应用特点 **优势**: - 集成化设计减少PCB面积(相比分立式设计节省30%空间) - 自动坏块管理和磨损均衡 - 兼容性强(向下兼容旧版本协议) **局限性**: - 半双工通信限制并发操作 - 延迟较高(典型读写延迟约50μs) - 逐渐被UFS接口取代(UFS支持全双工) ### 六、调试要点 1. 信号完整性: - 时钟抖动需<0.15UI(单位间隔) - 数据线建立/保持时间需满足时序裕量 2. 电源管理: - 支持1.8V/3.3V双电压操作 - 睡眠模式功耗<100μA 需要更深入了解某个具体方向(如时序分析、错误处理机制等),可以继续提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值