
做嵌入式这些年eMMC相关的调试没少折腾。协议规范翻了几遍各种流程图、状态机的理论看了不少可真到板子上跑系统发现启动不稳定、读写偶尔报错的时候最直接有效的办法反而还是那一招——拿示波器实测eMMC的CLK、CMD和Data信号把波形抓到眼前看个明白。这篇就把我从准备示波器到抓出可用波形的完整过程捋一遍包括那些文档里不会写、但实操中一定会遇到的坑。先说清楚这篇文章能帮你解决什么问题如果你正在调eMMC驱动或者板子用eMMC存数据时总出现偶发读写失败又或者你想从底层信号角度理解eMMC协议到底是怎么工作的那这篇就是给你准备的。我会照着实际操作顺序一步步讲解CLK、CMD、Data三类信号怎么测、怎么设置示波器、如何判断波形正常还是异常。顺便提醒一句这里的CMD是eMMC总线的命令信号线不是电脑上那个cmd命令行别搞混了。下面直接进正题。1. 动手之前先把eMMC接口和示波器准备搞明白1.1 eMMC引脚上到底有什么信号可测eMMC其实就是一块BGA封装的闪存芯片直贴在PCB上跟电脑里那种可插拔的硬盘完全是两回事。它跟主控之间靠一套并行总线通信管脚虽然多但关键信号就那几个CLK时钟、CMD命令/响应线、D0到D7八根数据线外加一个在HS400模式下才用到的DS信号Data Strobe数据选通以及复位脚RST_N和一些电源、地。从协议角度看eMMC 5.1是目前最常见的版本它最大的特点就是支持HS400模式最高时钟频率200MHz数据线在时钟的上下沿都采样所以叫DDR双沿传输。除了HS400还有DS默认速度、HS高速、HS200SDR单沿200MHz、HS400DDR 200MHz几种模式。不管工作在哪个模式CLK的波形都是连续翻转的方波而CMD和Data线只有通信时才动作平时保持在高电平。这就要说到很多人第一次上手时的困惑为什么eMMC信号这么难抓。CLK是周期性信号示波器一放就能看到。但CMD和Data线上的数据是突发性的读写操作可能一秒钟发生很多次也可能空闲很久如果你用Auto触发或者干脆按Stop碰运气那基本抓不到东西。后面我会专门讲怎么设置触发来抓这些突发信号。对eMMC协议还不熟悉的同学可以把这个总线想成一个微型局域网CLK就是大家的公共时钟节拍CMD是主控喊话用的喇叭——主控发命令、设备回响应都走这一根线Data线则是传输实际数据的高速公路。测信号质量本质上就是在看这条“高速公路”上的车辆压线、超速、信号串扰的实际情况。1.2 示波器和探头怎么选为什么不能随便拿个旧探头就上测量eMMC对示波器带宽有硬性要求这不是玄学是可以算出来的。要看到一个方波的真实面貌示波器带宽最好能达到信号基频的5倍以上。HS400模式下CLK是200MHz5倍就是1GHz带宽。如果你手头只有500MHz的示波器也不是完全不能用但测200MHz时钟时上升沿会被明显“钝化”看起来像是信号本身有问题实际是测量系统能力不够。除了带宽采样率也得跟上。示波器标注的采样率决定了波形还原的细腻程度至少需要2.5GSa/s以上。我常用的设置是采样率开到最大存储深度在2Mpts以上这样抓命令序列时才不会出现“波形严重失真”的尴尬。探头方面测1.8V逻辑的eMMC信号普通10:1无源探头就够了但探头带宽一定要标称500MHz以上。这里有个很难发现的坑很多人探头带宽没问题但探头上挂着一条长长的黑色地线夹子那玩意儿在几十兆赫兹以上就变成了一根天线测出来的波形全是毛刺和振铃。正确的做法是使用探头自带的短地弹簧或者用很短的裸铜线搭在地焊盘上。习惯了用长地线夹的人第一次换短地线会以为示波器坏了——波形干净得不像真的。下面是选型参考表照着这个买或者借都不会走偏测量目标信号频率建议示波器带宽建议探头备注初始化阶段CLK400kHz100MHz以上即可100MHz无源探头频率低随便测HS模式CLK25~50MHz200MHz以上200MHz以上探头注意地线长度HS200数据/时钟100~200MHz500MHz以上500MHz以上探头建议用地弹簧HS400数据/时钟200MHz DDR1GHz以上1GHz有源探头有源探头负载更小CMD/Data协议级观察按当前模式500MHz以上500MHz以上探头配合协议解码更佳还有一个细节eMMC的IO电压通常是1.8V有些老设备兼容3.3V。测之前先确认一下VCCQ供电是多高以免误判高电平电压。我的一块板子高电平只有1.2V起初以为信号异常后来查了原理图才发现这板子的VCCQ就是1.2V版本属于正常范围。这就提醒我们测波形前先看电路图比上来就测要重要得多。2. 测点怎么找、示波器参数怎么设2.1 测点选择的三个办法很多人的板子没有预留eMMC测试点这是最让人头疼的事。eMMC是BGA封装引脚藏在芯片底下示波器探头根本够不着焊盘。我常用的办法有三种。最理想的情况是PCB设计阶段在CLK、CMD、Data线上预留了测试焊盘这种直接焊一根短线或者顶针就能测。没有预留的话可以找eMMC连接的主控端排阻、串联电阻、或线上经过的电容两端这些元件的焊盘往往比BGA球好下探头。实在不行就只能飞线了。飞线时需要特别小心最好从PCB背面的过孔引出而不是强行撬开芯片底部的焊球。我之前见过有人拿刀片刮开eMMC附近的走线阻焊层结果把旁边的电阻刮飞了板子直接报废。飞线选线径0.1mm左右的漆包线或者特氟龙线焊接温度控制在300度以下速度要快避免热损伤旁边的元器件。对于维修场景比如给平板换eMMC芯片测点就更麻烦了。这种场景下通常用转接板或者烧录座来做测量把芯片装到转接板上再飞线到主板的焊盘位置探针可以直接点在转接板引脚上。虽然操作麻烦但测量安全很多。2.2 示波器通道、触发电平和时基设置照着抄就行示波器参数设置是新手最容易迷茫的部分。我给出一套我实测后稳定的配置刚开始可以直接照抄理解之后再微调。探头连接方面CH1接CLK、CH2接CMD、CH3接D0这是比较标准的分配方式。垂直档位统一设0.5V/div把波形基线移到屏幕下方第二格左右这样1.8V的高电平大约落在屏幕上方第三格半的位置方便读电压幅值。触发源选CH1CLK触发沿设上升沿触发电平设0.9V约1.8V的一半。这里有个关键点测CLK信号细节和抓CMD命令流时基设置完全不同。看CLK的边沿质量、过冲、振铃时时基要收得很小比如5ns/div这样才能看清200MHz时钟一个周期内发生的事情。但如果目的是抓CMD0、CMD1这些初始化命令的完整波形时基得放到2ms/div甚至更大因为初始化阶段CLK频率低命令之间间隔时间比较长。具体参数可以这样设置测量目的时基触发模式触发条件注意点看CLK频率和占空比10ns/divAutoCH1上升沿开启频率测量功能看CLK边沿质量和过冲2~5ns/divAutoCH1上升沿关注过冲和振铃抓初始化命令序列1~5ms/divNormal/SingleCH2下降沿重新上电触发抓读写数据突发50~200ns/divNormalCH2下降沿配合解码或命令触发HS400模式下DS对齐2~5ns/divNormalCH3DS边沿需显示DSData还有一点容易忽略示波器通道的输入阻抗要设成1MΩ配合10:1探头别误设成50Ω否则信号会被衰减得很厉害。除非你用的是有源探头或者专门的50Ω通路才需要切换阻抗匹配。3. 先量CLK看时钟频率、占空比和信号质量3.1 正常CLK波形长什么样接通示波器之后第一个观察对象就是CLK。只要主控处于工作状态CLK就不会停——即使CPU休眠CLK也可能以一个很低的频率在维持。所以CLK是eMMC三个关键信号里最好抓的也是判断系统是否“活着”的第一手证据。正常CLK波形是一个连续翻转的方波但严格来说它更像梯形波上升沿和下降沿都有一定的斜率不可能是理想方波那样的垂直边沿。以1.8V IO为例波形高电平应该在1.8V左右低电平接近0V频率稳定占空比接近50%。HS400模式下CLK是200MHz占空比会略微偏离50%但一般不会差太多。测量时我习惯把示波器的测量项开起来频率、周期、占空比、Vpp、上升时间。这几个参数一次就能看完。需要特别提醒的是你在屏幕上看到的频率是多少决定了当前eMMC工作在什么状态。初始化阶段通常是400kHz左右初始化完成并切换到高速模式后会提升到25MHz或50MHz如果支持HS200/HS400频率会升到100MHz或200MHz。要是屏幕上读出来一个奇怪的频率比如37.5kHz那说明主控配置有问题或者驱动还没初始化完。我遇到过一个很奇怪的现象同一块板子CLK频率在不同固件版本下不一样。后来查代码发现是某个版本的驱动把eMMC的时钟配置分频参数写错了导致工作频率低于预期读写的吞吐率只有正常值的三分之一。这种问题如果只看跑分和速度确实很难定位但示波器一下就能看出端倪。所以CLK测量不仅是硬件调试的工具也是验证驱动配置是否正确的一个快捷手段。3.2 从CLK波形能看出哪些“暗病”CLK波形上藏着很多肉眼可见的信号完整性问题这些问题往往跟板子的稳定性有直接关系。过冲和振铃是最常见的。如果波形的高电平上面冒出一个尖峰超过1.8V很多然后来回震荡几下才稳定这就是过冲和振铃。过冲超过10%就得警惕长期过冲会缩短芯片寿命严重的过冲可能直接触发芯片输入保护电路导致误触发。产生过冲的原因通常是阻抗不匹配比如CLK走线没有控制阻抗、串联电阻阻值不对、探头地线太长搭出了环路电感。区分这两类原因的办法是把探头地线改成最短弹簧后如果毛刺和振铃减少很多那就说明是测量方法的问题不是板子的问题。上升沿过缓也是常见问题。如果CLK的上升沿看起来明显“躺平”占据了半个周期甚至更多说明主控输出驱动能力不足或者PCB上电容负载太大。这种情况下eMMC内部在采样时可能因为电平还没达到阈值而读错数据导致偶发通信错误。上升时间的合格范围一般要求小于时钟周期的10%比如200MHz时钟周期5ns上升时间应在0.5ns左右放宽一些也不能超过1ns。还有一个容易忽略的问题CLK频率不稳定波形看起来是“抖动”的频率计数器的读数来回跳动。这往往是主控时钟源不稳、供电波动或PLL锁定不良造成的。这种问题对eMMC的影响特别隐蔽系统能跑但偶尔就会在某个特定温度或负载下出一次读写超时。抓CLK波形时多看一会儿如果频率读数跳变幅度超过1%就值得排查主控的时钟树配置了。测量CLK时还有个经验不要只看一个时间点。eMMC在不同工作模式下CLK频率不同所以最好在启动过程中全程观察看CLK从400kHz升到25M/50M/100M/200MHz的过程是否顺畅。这个频率跳变的过程本身就是协议初始化的一个侧面体现。4. 抓CMD信号看懂命令与响应的波形交互4.1 CMD线上信号特点和抓取技巧CMD线是eMMC总线里最容易让新手破防的一条信号线。它不像CLK那样周期翻转也不像Data线那样传输时有明显的一串跳变。CMD线上的信号分为两个方向主控发给eMMC芯片的命令和eMMC芯片返回给主控的响应这两类信息共用同一根线分时传输。先说说怎么抓。前面说过CMD空闲时保持在高电平一旦有命令产生信号会先从高电平拉低发出一个START位。熟悉SD/eMMC协议的人知道CMD线上的每个命令帧都以一个0作为起始位。我抓CMD波形时触发方式不是用默认的上升沿而是改成下降沿触发然后触发源选CMD通道。这样每当总线从空闲高电平往下跳变示波器就会开始采集刚好把整个命令帧抓进屏幕里。但触发到了不等于抓全了。eMMC的命令可能在任意时刻发生随机性很强尤其是系统运行时你没法预知下一次读写命令什么时候来。我常用的技巧是把触发模式设成Normal或Single然后给设备重新上电或者触发一次软复位。eMMC每次上电后主控都会依序发送一组固定的初始化命令CMD0、CMD1、CMD2、CMD3、CMD7等等。这些命令是有规律、可预测的所以重上电后示波器必然能抓到开始的CMD0。如果你只想知道协议栈跑得顺不顺抓初始化流程就够了想看读写命令则需要在读写操作发生时同步触发比如用示波器外部触发输入接一个GPIO信号。这里顺便解决一个容易困惑的点CMD线上的命令和响应看起来都是高高低低的方波波形形状上确实不好区分谁是谁。区分方法有两种一是看时序通常是主控先发命令隔一小段时间设备才返回响应二是用示波器的协议解码功能现在不少中端示波器都支持eMMC/SD协议解码能直接标出命令索引和CRC校验结果比人工数位准得多。4.2 用波形反推命令内容不需要每秒都开解码器如果没有协议解码功能光靠波形也能大概看出点名堂。eMMC的命令帧通常是48位结构是1位起始位0、1位传输位1、6位命令索引、32位参数、7位CRC校验、1位结束位0。响应类型里R1、R3、R6也都是48位R2则是136位多加128位的CID或CSD内容。实操中我们可以通过波形的下降沿和上升沿数出每一位的时间宽度然后按CLK周期去对位。比如在初始化阶段CLK是400kHz每一位正好是2.5us屏幕上很清晰地展开一格格的高低电平拿游标一格一格量就能读出命令索引。这个方法看起来很原始但我真的用它验证过一块没有协议解码功能的示波器上的CMD1发送内容结果和逻辑分析仪解出来的完全一致。当然手动数位效率太低大多数时候我建议直接用协议解码。现在主流的示波器品牌都有一键解码功能设置好通道和逻辑电平阈值屏幕上会把每一位的0/1都标出来命令名称也能自动识别。CMD0显示为GO_PRE_IDLECMD1显示为SEND_OP_COND一目了然。不过有一点用解码器看不出来那就是信号的模拟质量。CRC校验位在解码器里显示正常不代表物理层没有问题。我之前遇到过一块板子CMD线上有时候会多出一个很窄的毛刺这个毛刺偶尔会被eMMC识别成有效跳变导致命令解析错乱。解码器因为采样率不够毛刺太小直接忽略了靠波形放大才看到。所以解码器和波形要配合着看解码告诉你“内容是什么”波形告诉你“信号本身干不干净”。抓CMD还有一个非常实用的技巧CMD13SEND_STATUS是主控最常用的轮询命令因为它反复询问设备状态会在总线上周期性出现。如果你想快速验证CMD线信号质量抓CMD13的大批量重复波形能很快暴露出问题。CMD13在波形上表现为一个很短的48位脉冲如果它都出现了毛刺、变形、幅度异常那CMD线的物理连接多半有问题。5. 抓Data信号数据线波形里藏着的读写秘密5.1 Data信号的基本特征和测量要点Data信号的整体特征和CMD类似都是空闲时为高通信时才产生跳变。但Data线和CMD有本质区别它是双向的且在工作时往往多根线同时跳变。测量Data线最关键的思路是一定要把CLK或DS信号放在另一个通道同时显示因为数据线的有效时刻必须结合采样时钟来判断单看一根数据线毫无意义。比如HS200模式下eMMC在CLK的上升沿采样数据那么D0到D7的电平必须在CLK上升沿附近保持稳定才能被正确读入。这个“保持稳定”的时间窗口就是建立时间setup time和保持时间hold time也是信号完整性里最核心的两个参数。实际操作时我会把CH1指向CLKCH2指向D0时基设在50ns/div左右。然后观察数据线的跳变位置相对于CLK上升沿的相位。如果数据线的跳变离CLK上升沿太近甚至正好压在上升沿附近说明时序裕量很小这样一旦温度、电压波动读写就可能偶发失败。如果跳变位置离上升沿有明显距离那么时序裕量就很健康。多根数据线同时跳变时还要看线间串扰。比如D0是低电平、D1是高电平D1跳变时可能会通过寄生电容影响到D0使D0上产生毛刺。这种串扰在高速模式下更明显。测多根数据线时如果示波器有四通道可以同时看CLK、D0、D1、D2观察它们的边沿有没有互相干扰。当然HDMI这类高速接口讲究的“眼图”分析在eMMC上也会用但对大多数嵌入式调试场景看波形的过冲和建立保持时序就已经能解决绝大多数问题了。5.2 HS400模式下的Data和DSDQS信号HS400模式是eMMC 5.1才引入的高速DDR模式CLK频率200MHz数据在CLK的上下沿都有效理论传输速率达到400MB/s。这个模式下总线不再完全依赖CLK来采样而是多了一根DS信号线Data Strobe由eMMC芯片在读数据时产生伴随数据一起发给主控。这就导致HS400模式下实际要看的是DS与Data之间的关系而不是CLK与Data的关系。读数据时DS会与Data同步翻转主控用DS的上下沿来采样D0~D7写数据时DS由主控产生此时DS与Data的关系又跟读方向略有不同。所以测量HS400时如果还把CLK当采样基准去分析时序就会得到一个错误的结论。实操中HS400波形的抓取难度比HS200高不少。原因是HS400只在高速读写时出现而且是突发性的时基设置小了抓不到完整数据设置大了又看不清边沿。我通常分两步第一步时基放到200ns/div左右抓一段完整的读突发确认整段数据的长度和DS的连续翻转情况第二步把时基收到2ns/div放大看DS上升沿对应的Data建立保持时间。还要特别说一个HS400模式下的常见陷阱用普通无源探头去测200MHz DDR信号时探头的输入电容通常在10pF左右本身就是个不小的负载会拖慢信号边沿导致测出来的建立保持时间比实际差很多。有条件的话HS400测量最好用1GHz有源探头它的输入电容只有零点几pF对被测信号的影响小得多。如果只能用无源探头那就接受测量结果“偏保守”这个事实但不要因为波形看起来余量不够就急着改PCB先确认是不是探头负载造成的假象。5.3 Data线上的毛刺和CRC错误怎么对应上数据线测量中最头疼的问题就是偶发的CRC校验错误。这类错误往往没有规律可能跑好几个小时才出现一次示波器不一定会抓到案发现场。但信号质量上的“隐患”通常是一直存在的关键是怎么从波形里把它找出来。我排查CRC错误时的思路是先抓正常的Data波形放大观察每一个跳变沿找到“看起来不干净”的地方。所谓不干净包括过冲过大、振铃幅度明显、在采样时刻附近出现多次翻转等。这些现象不会每次通信都导致错误但当环境条件变差比如温度升高、供电电压下降时它们就会变成压倒骆驼的最后一根稻草。我之前调过一块板子现象是eMMC读操作偶发返回CRC错误重试能成功但系统日志里报错很频繁。用示波器看D0线上的波形发现D0从低跳高时总有一个幅度挺大的振铃位置恰好落在CLK采样点附近。因为振铃不是每次都一样大所以错误不是每次都有。后来排查发现是D0走线在某一段换层时参考平面不连续导致特征阻抗突变反射产生了振铃。在走线里加了一颗22欧的串联电阻之后问题就消失了。这种问题靠软件永远找不到根因但波形上看一眼就知道方向。排查时还有一个辅助技巧用示波器抓大量波形做统计现在有些示波器支持直方图或者模板触发Mask Test可以设定一个波形模板波形一旦触及模板边界就触发保存。比如把D0的波形模板限定在正负0.3V的正常范围内一旦出现异常毛刺就自动抓拍。用这种方式跑一个晚上的压测第二天起来看看抓到多少异常波形就能大致判断信号质量的余量了。6. 实操中的问题和排查技巧速查6.1 我实测时踩过的几个典型坑测eMMC信号这几年我踩过的坑不少最典型的四个分享出来希望大家别再走一遍。第一个就是探头地线的问题。刚开始我用鳄鱼夹地线测CLK测出来的波形边缘简直跟梳子一样全是密密麻麻的振铃。我当时一度以为是主控供电有问题换了电源、加了电容都没解决。后来把地线夹换成了短地弹簧波形瞬间干净了这才意识到振铃是测量方法造成的。所以判断波形之前先排除测量系统自身带来的失真。第二个坑是抓CMD用错了触发沿。CMD线平时是高电平如果触发沿设成上升沿示波器永远不会触发——因为命令产生时最先出现的是高到低的跳变。我第一次抓CMD命令流盯着屏幕看了半天最后才发现触发电平和触发沿都设反了。第三个坑是采样率不足导致的错误判断。有些示波器在时基放大的时候会自动降低采样率屏幕上看着波形没什么问题实际上已经丢了很多细节。我试过用一台存储深度只有1Mpts的示波器抓HS200模式的Data信号时基放到500ns/div之后波形明显失真边沿像一个台阶一个台阶地跳根本没法分析时序。这种情况要把存储深度调到最大或者换更高级的示波器。第四个坑是测点本身的寄生效应。如果飞线很长比如超过5cm那测到的波形就已经不是板子本来的样子了探头和飞线的寄生参数会对信号产生影响。飞线越短越好能点到过孔就点到过孔不要贪图方便找了一段很长的线来引。6.2 小技巧用复位或重上电把通信过程“重放”一遍排查eMMC问题的时候有个特别实用的技巧让系统重新初始化把通信过程“重放”一遍。这句话怎么理解呢eMMC每次上电主控都会按协议规范发送一串几乎固定的初始化命令CMD0、CMD1、CMD2……这些命令的顺序、内容都是确定的。这意味着你不需要去“猜”设备什么时候通信只需要把示波器设成单次触发然后把示波器的触发通道接到CMD线上接着给系统重新上电一帧完整的初始化命令流就会自动撞进你的示波器屏幕。具体设置是触发模式选Normal或者Single触发源选CMD通道触发沿下降沿触发电平0.9V。系统上电后CMD线第一个下降沿就会出现示波器立刻开始采集。如果你想观察整个初始化期间的CLK频率变化可以把时基放得很大比如5ms/div这样整个初始化过程从头到尾的波形都在屏幕上。如果只想看某一条命令的细节那就先抓大范围再局部放大。这个方法的好处在于它能帮你在几分钟内建立第一手现场数据而不需要在系统跑业务的间隙去碰运气。默认初始化顺序每次都是一样的所以无论复现多少次都能看到同样的起点这对排查问题非常方便。6.3 常见问题速查表最后整理一个速查表覆盖我遇到过的绝大部分现场问题照着排查思路走基本能定位到方向。现象可能原因排查办法CLK波形带大量振铃探头地线过长/阻抗不匹配换短地弹簧检查CLK走线阻抗和串联电阻CLK频率读数明显偏低驱动分频配置错误/时钟源不对核对主控时钟树配置检查CLK频率测量参数CMD线无波形触发沿设错/通道接触不良改下降沿触发确认探头点到了正确焊点CMD线波形幅度只有1.2VVCCQ供电是1.2V版本查原理图确认IO电压不要直接判故障Data波形完全抓不到没有突发读写/触发时机不对用协议触发或外部GPIO触发制造读写操作HS400读数据时序余量极小探头负载过大/实际时序确实紧张用有源探头复测排除无源探头负载假象偶发CRC错误波形看不出问题信号在采样点附近有微小抖动使用模板触发或长时间统计抓异常瞬时波形波形上升沿很缓驱动强度不足/飞线太长调整主控drive strength缩短测试引线上电后CLK一直低/一直高主控没初始化/芯片没上电查主控供电、复位信号和系统启动状态再补充一个细节测eMMC波形时尽量保证示波器本身接地良好。示波器探头的地线夹夹到板子的地上同时示波器电源线的地线也要可靠接地这样抗干扰能力最强。如果示波器用两脚插头没有接地外壳上可能会积累感应电压测出来的波形底噪明显变大。实验室的示波器通常都通过电源线接地但用电池供电的便携示波器测eMMC时这个问题会特别突出我实测过几次底噪能差出一个数量级。最后说点个人体会吧。eMMC信号测量这件事真正花时间的地方往往不是操作本身而是你愿不愿意扎下心来看懂波形背后的物理过程。现在很多工具都能自动解码、自动分析我反而觉得即便你有一台能全自动解码的高端示波器也应时不时切到纯波形界面用游标去量一量边沿、看看过冲、感受一下信号在高速翻转时的那种“不完美”。因为那些在协议层面看起来完全正常的通信可能正是靠着一层又一层边界余量在硬撑而示波器就是唯一能让你看到这些余量还剩多少的工具。这块内容后续还可以扩展很多比如用逻辑分析仪做eMMC协议级解码配合示波器的模拟测量一起用就是嵌入式存储调试很完整的一套组合拳了。