做嵌入式硬件开发的人大概都遇到过这样的噩梦新板子打回来上电串口没有任何输出系统起不来。查电源电压都对查时钟晶振在振查复位复位释放了。最后怀疑到DDR——用示波器一看DDR的时钟和地址线都有信号但就是Training不过系统卡死在DDR初始化阶段。DDR Training失败是嵌入式开发中最常见也最头疼的问题之一。它的现象很单一启动失败、串口无输出但原因可能千差万别——从电源纹波到PCB走线从内存颗粒到控制器配置从焊接问题到固件bug每一个环节出问题都可能导致Training失败。很多人遇到DDR Training失败不知道从何查起只能瞎试——换颗内存、改个时序、重新烧个固件试来试去有时候碰巧好了也不知道为什么好的有时候试了很久都不好项目卡在这里动弹不得。这篇文章从实际排查的角度讲清楚DDR Training到底在做什么Training失败的常见原因有哪些怎么一步步系统地排查以及怎么从设计阶段就预防Training问题。一、先搞清楚DDR Training到底在练什么在讲排查之前先简单搞清楚DDR Training到底在做什么。理解了Training的目的排查起来才有方向。DDR特别是LPDDR4/LPDDR5的信号速率很高动辄几千Mbps。在这么高的速率下PCB走线的延迟、信号的衰减、串扰、电源噪声等因素都会影响信号的完整性。不同的板子、不同的内存颗粒、不同的温度信号的最佳采样点都不一样。DDR Training就是DDR控制器在初始化阶段通过一系列测试自动找到最佳的信号采样点和时序参数的过程。具体来说Training主要包括以下几个方面1. 读训练Read Training调整读数据的采样时钟相位找到最佳的采样点让读数据最稳定。2. 写训练Write Training调整写数据的时序让写数据和写时钟的相位关系最佳。3. 地址/命令训练CA Training调整地址和命令信号的时序确保内存能正确采样地址和命令。4. 阻抗校准ZQ Calibration校准DDR的输出驱动阻抗和ODTOn-Die Termination阻值让信号质量最佳。5. VREF校准VREF Training调整接收端的参考电压找到最佳的判决阈值。Training的过程简单来说就是DDR控制器发出各种测试模式然后调整各种参数看哪个参数下读取的数据最稳定、错误最少最后把最佳参数保存下来用于后续的正常读写。如果Training过程中所有参数下都读不对数据或者找不到稳定的参数区间Training就失败了。Training失败后DDR控制器无法正常工作系统就卡死在DDR初始化阶段表现为串口无输出、系统起不来。理解了Training在做什么就不难理解Training失败的原因要么是信号质量太差所有参数下都读不对要么是某个硬件或配置有问题导致Training无法正常进行。二、Training失败的常见原因分类DDR Training失败的原因很多但可以归纳为几大类。按照出现概率从高到低排列1. 电源问题电源电压不对、纹波太大、瞬态响应差、上电顺序不对。这是最常见的原因占Training失败案例的一半以上。2. PCB设计问题走线不等长、阻抗不对、拓扑结构不合理、电源平面不完整、地弹太大。这是第二常见的原因。3. 内存颗粒问题内存颗粒损坏、焊接不良虚焊、连锡、用了假片或拆机片、型号不对。4. 时钟和复位问题DDR时钟没有输出、时钟频率不对、复位信号异常。5. 软件配置问题DDR控制器固件版本不对、时序参数配置错误、内存容量/位宽配置不对、Training模式配置错误。6. 兼容性问题SoC平台不支持这款内存、内存不在平台的支持列表里、需要更新DDR控制器固件。7. 温度问题高温或低温下信号质量下降导致Training失败通常是高温下更容易失败。8. SoC本身问题SoC损坏、SoC的DDR控制器有硬件bug、SoC的焊接问题。下面逐个维度详细讲以及对应的排查方法。三、系统排查步骤从易到难从外到内遇到DDR Training失败不要一上来就拆芯片、改板子。按照从易到难、从外到内的顺序排查能少走很多弯路。第一步确认基本条件先确认最基本的条件是否满足这些是最容易检查也最容易出问题的1. 电源电压用万用表测量DDR的各路电源VDD、VDDQ、VPP等确认电压在规格范围内。LPDDR4X的VDDQ是0.6V容限通常正负5%即0.57至0.63VVDD是1.1V容限通常正负5%。电压偏高或偏低都可能导致Training失败。2. 电源上电顺序确认各路电源的上电顺序符合要求。LPDDR4X通常要求VDD先上电VDDQ后上电或者同时上电。如果上电顺序反了可能导致内存初始化异常。3. 时钟用示波器测量DDR的时钟引脚确认有时钟输出频率正确比如3200Mbps对应的时钟频率是1600MHz。如果没有时钟可能是SoC的时钟配置不对或者时钟引脚焊接问题。4. 复位测量DDR的复位引脚确认复位信号已经释放高电平而且复位脉宽符合要求。如果复位一直拉低DDR不会响应任何命令。5. 焊接质量用显微镜检查DDR的BGA焊点有没有虚焊、连锡、锡珠。BGA封装的内存焊接问题是常见的Training失败原因特别是手工焊接或者小厂贴片的板子。这一步看起来简单但很多Training失败的问题最后查下来就是这些基本条件没满足——比如VDDQ电压只有0.55V偏低或者复位引脚虚焊了。先把基本条件确认好再往下查。第二步检查电源质量电压对了不代表电源质量就好。Training失败的案例中电源质量问题纹波、瞬态响应占了很大比例。1. 电源纹波用示波器最好是差分探头地线尽量短测量DDR电源的纹波确认纹波在规格范围内。LPDDR4X的VDDQ纹波通常要求小于30mV峰峰值。如果纹波太大比如超过50mV会严重影响信号质量导致Training失败。- 纹波大的常见原因去耦电容不够、去耦电容离DDR太远、电源IC的环路补偿不好、电源IC的负载能力不够。- 解决方法增加去耦电容特别是0.1μF和0.01μF的陶瓷电容尽量靠近DDR的电源引脚、检查电源IC的补偿电路、换负载能力更强的电源IC。2. 瞬态响应模拟DDR的大电流跳变比如Training时的读写操作看电源电压的跌落和恢复情况。如果瞬态响应差电压跌落太大也会导致Training失败。- 瞬态响应差的常见原因输出电容不够、电源IC的带宽不够、PCB走线阻抗太大。- 解决方法增加输出电容特别是低ESR的陶瓷电容或聚合物电容、检查电源IC的补偿、加粗电源走线、缩短电源走线。3. 电源完整性检查DDR电源的平面是否完整有没有被分割、过孔掏空。电源平面不完整会导致电源阻抗增大影响电源质量。电源质量是Training失败的第一大原因一定要重点检查。很多人用万用表测电压是对的就以为电源没问题实际上纹波和瞬态响应可能很差。第三步检查PCB设计如果基本条件和电源质量都没问题接下来检查PCB设计。PCB设计问题是Training失败的第二大原因。1. 走线等长DDR的数据线DQ、选通信号DQS、时钟CK、地址命令线CA都有等长要求。同一组的信号线长度差要控制在一定范围内比如同字节的DQ和DQS差不超过25milDQ之间差不超过50mil。如果走线不等长时序就会错位导致Training失败。- 检查方法用PCB设计软件查看走线长度报告确认各组信号的长度差在规格范围内。- 解决方法调整走线做绕线等长。2. 阻抗控制DDR的信号线通常要求单端50欧姆或差分100欧姆针对时钟和DQS。如果阻抗不对比如阻抗偏高或偏低会导致信号反射影响信号质量。- 检查方法用PCB设计软件的阻抗计算器确认层叠和线宽对应的阻抗是否正确。有条件的话可以用TDR时域反射计实际测量阻抗。- 解决方法调整层叠介质厚度、铜厚或线宽让阻抗符合要求。3. 拓扑结构DDR的信号线拓扑T型、Fly-by、点对点要符合DDR规范和SoC的要求。特别是LPDDR4/5地址命令线通常要求Fly-by拓扑并且要有终端匹配。如果拓扑不对信号质量会很差。- 检查方法对照SoC的硬件设计指南确认拓扑结构是否正确。- 解决方法调整PCB布局改拓扑结构。4. 参考平面DDR的高速信号线下面要有完整的地平面或电源平面作为参考。如果参考平面不完整被分割、被过孔掏空、有裂缝会导致信号回流路径变长信号质量下降。- 检查方法查看PCB的层叠确认DDR信号线下面的参考平面是否完整。- 解决方法调整平面分割确保DDR区域的参考平面完整。5. 串扰DDR的高速信号线之间如果离得太近会产生串扰影响信号质量。特别是数据线和地址线之间、不同字节组之间。- 检查方法用PCB设计软件查看信号线间距确认满足3W原则线中心间距是线宽的3倍以上。- 解决方法加大信号线间距或者在信号线之间加地线隔离。PCB设计问题的排查需要一定的硬件经验如果自己不确定可以找有经验的硬件工程师或者SoC原厂的FAE帮忙review PCB。第四步检查内存颗粒如果基本条件、电源、PCB都没问题接下来检查内存颗粒本身。1. 颗粒型号确认内存颗粒的型号是否正确是不是你想要的型号。有些供应商可能发错货或者用替代型号。2. 颗粒真伪确认内存颗粒是正品不是remark的假片或者拆机片。假片和拆机片的参数可能不达标导致Training失败。- 检查方法查看颗粒表面的丝印laser marking对照官方datasheet的丝印说明确认型号、批次、产地是否正确。remark的颗粒丝印可能模糊、字体不对、位置不对。- 有条件的话可以用X射线检查颗粒内部的die尺寸和正品对比。3. 颗粒损坏确认内存颗粒没有损坏。静电、过压、焊接温度过高都可能导致颗粒损坏。- 检查方法换一颗新的颗粒试试如果换了就好说明原来的颗粒坏了。4. 焊接问题确认BGA焊接良好没有虚焊、连锡、锡珠。BGA焊接问题是常见的Training失败原因特别是手工焊接的板子。- 检查方法用X射线检查BGA焊点确认每个焊点都良好没有虚焊、连锡、空洞。- 解决方法重新焊接或者找专业的贴片厂焊接。第五步检查软件配置如果硬件都没问题那可能是软件配置的问题。1. DDR控制器固件确认SoC的DDR控制器固件firmware版本是最新的并且支持这款内存。有些早期的固件对新内存的支持不好需要更新固件。- 检查方法查看SoC的SDK或文档确认DDR控制器固件的版本以及支持的内存列表。- 解决方法更新到最新的DDR控制器固件。2. 时序参数确认DDR的时序参数tRCD、tRP、tRAS、tWR、tREFI等配置正确符合内存datasheet的规格。如果时序参数配置错误比如太紧会导致Training失败。- 检查方法对照内存datasheet确认每个时序参数的配置值。- 解决方法修改时序参数或者用SoC提供的自动计算工具。3. 内存容量和位宽确认DDR控制器配置的内存容量和位宽与实际硬件一致。如果配置的容量比实际大或者位宽不对会导致Training失败。- 检查方法查看DDR控制器的配置寄存器确认容量和位宽设置。- 解决方法修改配置和实际硬件一致。4. Training模式确认Training模式配置正确。有些SoC的DDR控制器支持不同的Training模式比如快速Training、完整Training、跳过Training如果配置错误比如跳过了必要的Training会导致Training失败。- 检查方法查看DDR控制器的Training配置。- 解决方法使用默认的完整Training模式。第六步兼容性和温度如果以上都没问题那可能是兼容性或温度的问题。1. 兼容性确认这款内存在SoC的支持列表里。有些内存虽然参数符合要求但不在SoC的官方支持列表里可能存在兼容性问题需要更新DDR控制器固件或者调整参数。- 检查方法查看SoC的官方DDR支持列表比如瑞芯微的DDR Reference Vendor List确认这款内存在列表里。- 解决方法如果不在列表里联系SoC原厂的FAE获取支持或者换用列表里的内存。2. 温度确认Training失败是在什么温度下发生的。如果是高温下失败常温下正常可能是高温下信号质量下降需要加强散热或者放宽时序参数。如果是低温下失败可能是低温下内存参数变化需要调整参数。- 检查方法用热风枪或高低温箱在不同温度下测试Training是否成功。- 解决方法加强散热、放宽时序参数、选择工业级温区的内存。排查顺序总结下表总结了DDR Training失败的排查步骤和常见原因按照这个顺序一步步排查大多数Training失败的问题都能找到原因。四、实际案例几个典型的Training失败问题讲了排查方法下面讲几个实际遇到的Training失败案例以及解决过程。案例一VDDQ纹波太大导致Training失败问题某客户的新板子LPDDR4X内存上电后系统起不来串口无输出。测量电源电压都对时钟也有复位也释放了。排查过程1. 基本条件都正常排除了电压、时钟、复位的问题。2. 用示波器测量VDDQ纹波发现纹波有80mV峰峰值远大于规格要求的30mV。3. 检查电源电路发现VDDQ的去耦电容只有2个0.1μF而且离DDR引脚比较远约5mm。4. 电源IC的输出电容也不够只有一个10μF的电解电容。解决方法1. 在DDR的VDDQ引脚旁边增加4个0.1μF的陶瓷电容尽量靠近引脚。2. 增加1个10μF的陶瓷电容作为电源IC的输出电容。3. 调整电源IC的补偿电路改善瞬态响应。结果修改后VDDQ纹波降到20mVTraining成功系统正常启动。经验总结电源纹波是Training失败的第一大原因一定要用示波器差分探头实际测量不能只看万用表的电压值。案例二BGA虚焊导致Training失败问题某客户的小批量板子有30%的板子Training失败系统起不来。剩下70%的板子正常。排查过程1. 好板子和坏板子对比测量电源、时钟、复位都一样。2. 怀疑焊接问题用X射线检查坏板子的DDR BGA焊点发现有几个焊点虚焊焊球没有完全塌陷和PCB焊盘接触不良。3. 询问贴片厂发现这批板子的DDR是手工贴片的因为量小焊接温度和时间控制不好。解决方法1. 把坏板子的DDR拆下来重新用专业的BGA返修台焊接。2. 后续的板子找专业的贴片厂用机器贴片控制焊接温度曲线。结果重新焊接后所有板子都正常了。经验总结BGA封装的内存手工焊接很容易出虚焊。小批量打样也要尽量用机器贴片或者找有经验的BGA返修台焊接。焊接后最好用X射线检查焊点质量。案例三内存不在支持列表导致Training失败问题某客户用了一款新出的LPDDR4X内存在RK3588平台上Training失败系统起不来。换用之前用过的老款内存一切正常。排查过程1. 硬件检查都正常电源、PCB、焊接都没问题。2. 软件配置也正常时序参数是按照新内存的datasheet配置的。3. 查看瑞芯微的官方DDR支持列表Rockchip DDR Reference Vendor List发现这款新内存不在列表里。4. 联系瑞芯微的FAE确认这款新内存需要更新DDR控制器固件才能支持。解决方法1. 更新到最新的DDR控制器固件瑞芯微提供了支持新内存的固件版本。2. 重新编译固件烧录到板子上。结果更新固件后Training成功系统正常启动。经验总结选用内存时最好先确认内存在SoC的官方支持列表里。如果不在列表里要提前和SoC原厂确认是否支持以及是否需要更新固件。不要想当然地以为参数符合就能用。案例四走线不等长导致高温Training失败问题某客户的板子常温下Training成功系统正常。但在高温环境70度下Training失败系统起不来。排查过程1. 常温正常高温失败怀疑是高温下信号质量下降。2. 检查PCB设计发现DDR的数据线等长做得不好同字节的DQ和DQS长度差最大有80mil规格要求不超过25mil。3. 常温下时序裕量还够所以能Training成功高温下信号延迟增加时序裕量不足就Training失败了。解决方法1. 改PCB重新做数据线等长把同字节的DQ和DQS长度差控制在25mil以内。2. 打新板子验证。结果新板子在70度高温下Training成功系统正常运行。经验总结走线等长不是走过场是真的会影响稳定性。特别是工业级产品要在宽温范围内工作时序裕量要留足等长要求要严格遵守。常温下能用不代表高温下也能用。五、怎么从设计阶段预防Training问题排查是事后补救最好的方法是从设计阶段就预防Training问题。以下是一些设计建议1. 选用经过平台验证的内存尽量选用SoC官方支持列表里的内存。这些内存已经经过了平台的验证兼容性和稳定性有保障Training失败的概率低。比如瑞芯微平台的DDR支持列表里就包含了多个主流品牌的工业级LPDDR4X/LPDDR5型号汉四ROCFOUR的工业级LPDDR4X也在列表中覆盖RK3588、RK3568等主流平台。选用列表里的内存可以减少兼容性问题和Training失败的风险。2. 电源设计要留足裕量DDR的电源设计要特别重视去耦电容要足够每个电源引脚旁边都要有0.1μF电容输出电容要足够电源IC的负载能力要留30%以上的裕量。电源纹波要控制在规格范围内VDDQ纹波小于30mV。3. PCB设计要严格遵守规范走线等长、阻抗控制、拓扑结构、参考平面、串扰每一项都要按照DDR规范和SoC的硬件设计指南来做。不要为了省事而降低要求特别是工业级产品要在宽温范围内工作裕量要留足。4. 用工业级内存工业级内存经过全温区测试参数在整个温度范围内都有保证高温和低温下的稳定性更好。消费级内存只在常温下测试高温下可能出现Training失败。5. 专业贴片和X射线检查BGA封装的内存一定要用专业的机器贴片控制焊接温度曲线。贴片后用X射线检查焊点质量特别是小批量打样的板子。6. 做高低温测试产品开发阶段要做高低温测试在低温和高温下都验证Training是否成功、系统是否稳定。不要只在常温下测试常温下正常不代表高低温下也正常。7. 预留调试接口PCB上预留DDR的测试点时钟、地址、数据、电源方便用示波器和逻辑分析仪排查问题。如果板子空间有限至少要预留电源和时钟的测试点。六、总结DDR Training失败是嵌入式开发中最常见也最头疼的问题之一但它不是无解的。只要按照系统的排查步骤从易到难、从外到内一步步查大多数问题都能找到原因。排查的核心顺序是1. 先确认基本条件电压、时钟、复位、焊接2. 再检查电源质量纹波、瞬态响应——这是最常见的原因3. 然后检查PCB设计等长、阻抗、拓扑4. 再检查内存颗粒型号、真伪、焊接5. 然后检查软件配置固件、时序、容量6. 最后检查兼容性和温度预防比排查更重要。从设计阶段就选用经过平台验证的内存、做好电源设计、严格遵守PCB规范、用工业级内存、专业贴片、做高低温测试可以大大降低Training失败的概率。最后一句话DDR Training失败90%的问题出在电源和PCB上剩下10%出在焊接、软件和兼容性上。遇到问题先查电源和PCB不要一上来就怀疑内存颗粒或SoC。有DDR Training和硬件设计相关的问题欢迎评论区交流。