尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

STM32MP2x LPDDR4片选与rank映射排查:容量减半和训练失败根因

STM32MP2x LPDDR4片选与rank映射排查:容量减半和训练失败根因 最近在调试一块基于STM32MP2x的新板子LPDDR4颗粒选了一颗某厂家的dual-rank型号。板子第一次点亮时系统能启动串口也能正常进U-Boot但U-Boot打印出来的DDR大小只有1 GiB而我原理图上明明画的是2 GiB。更糟的是后面还伴随随机性的读写超时折腾了两天才定位到根因——不是焊锡问题不是电源抖动而是chipselect的rank映射根本没有配对。这个问题的本质是STM32MP2x的DDR控制器如何通过CS0/CS1选择LPDDR4不同的rank以及软件侧如何把这些片选信号正确映射到初始化参数里。如果你最近正在画STM32MP2x的板子或者刚拿到一块MP2xLPDDR4的开发板正准备跑Linux却遇到内存容量不对、DDR训练失败、压力测试不稳定这类问题这篇文章大概率能帮你省下两天的排查时间。1. 先从概念上把chipselect和rank理清楚1.1 chipselect不是“是否使能”这么简单先从最容易误解的点说起。很多从DDR3转过来的工程师会把片选当成一个芯片使能脚觉得“CS嘛拉低就选上不选就拉高”。在DDR3里这样说还算沾边但在LPDDR4里这个概念必须纠正。LPDDR4的命令/地址总线被压缩成一组10位的CA总线行地址、列地址、bank地址、命令类型都是靠CA线上分时传的。CS_n不是独立的“选通开关”它和CA、CKE一起构成命令接口的一部分。在每一个时钟周期只有CS_n为低时DRAM才会去解码CA线上传过来的命令CS_n为高时DRAM直接忽略当前的CA信号。也就是说chipselect本质上是一个“命令使能”它和CA信号之间存在严格的建立/保持时间要求。正是因为这种关系CS不能随便在板子上加电容滤波不能串联太大阻值的电阻更不能直接拉高当作“常选”。一旦时序裕量被破坏LPDDR4的初始化命令很可能被错误解码表现出来就是训练失败或者随机性的数据错误。1.2 一个CS对应一个rankLPDDR4封装里可能有多个rank打开一颗LPDDR4的数据手册你会看到引脚列表里有两组非常相似的系统接口CS0_n/CKE0和CS1_n/CKE1。这两组信号对应的就是这个封装内的两个rank。rank是JEDEC内存规范里的经典概念多个rank共享同一组CA总线和DQ数据总线它们之间通过CS_n来区分。实际板卡上一颗LPDDR4颗粒可以是single rank也可以是dual rank甚至某些封装内部是dual-die每个die有自己的rank。对STM32MP2x的DDR控制器而言它最多支持两路片选分别对应DDRCTRL的CS0和CS1并配有对应的CKE0/CKE1。我们在配置里常说的“Number of ranks 1或2”最终就是告诉DDR控制器去驱动一路还是两路片选。之前有朋友问我“STM32MP2x不是只有一个DDR控制器吗为什么有条件出两个CS”就是因为一个控制器可以管理的rank不止一个只是同一时刻只允许一个rank占用数据总线而已。1.3 双rank、双die、双channel它们是三件事有一个很容易混淆的情况一颗LPDDR4芯片引脚上有两个CS是不是就是dual-channel不一定。rank和channel是两套完全不同的概念。rank是共享同一条数据总线的多组存储单元channel则是两条完全独立的数据总线各自有各自的CA和DQ命令和数据互不干扰。对STM32MP2x来说DDR控制器对外是单channel的也就是说数据总线只有一组。如果你选用的LPDDR4颗粒内部是dual-channel结构它的两个channel各有独立的CA和DQ总线从物理上就没法直接接在同一个单channel控制器上。很多工程师选型时只看容量不看channel架构买回来之后发现数据总线怎么都对不上这种问题比片选配置错误更难办只能换颗粒。区分方法很简单看数据手册里的“Organization”一栏如果是“2ch x 16bit”那就是两个channel如果写的是“2 ranks x 16bit”那才是同一个channel下的两个rank。这个区别直接决定了这颗料能不能用在STM32MP2x方案里。2. 硬件设计CS0/CS1的接法决定后面好不好调2.1 单颗双rank与两颗单rank的两种接法硬件上STM32MP2x的DDR控制器引出的片选信号就是CS0、CS1它们分别对应LPDDR4颗粒的CS0_n和CS1_n。最常见的设计有两种。第一种是选一颗dual-rank的LPDDR4把控制器的CS0/CKE0接到颗粒的rank0CS1/CKE1接到rank1。优点是器件少、走线短、信号质量好控制缺点是双rank颗粒一般比单rank贵一些而且供货渠道不如单rank那么大众化。第二种方案是选两颗single-rank的LPDDR4第一颗的CS接到CS0/CKE0第二颗的CS接到CS1/CKE1。此时控制器的CA总线、DQ数据总线、DQS这些信号都要并联连到两颗颗粒上。这里要特别提醒因为两颗颗粒共享一切总线数据总线上到底由谁驱动完全取决于CS。如果CS接反比如第一颗接到了CS1、第二颗接到了CS0系统不一定起不来但你的软件rank映射必须跟着反否则会在读写某些地址时出现数据错乱。我把两种接法的对比整理成了表格方案颗粒数量片选连接容量扩展方式注意事项单颗双rank1CS0/CS1分别接颗粒rank0/rank1单颗粒容量翻倍确认颗粒确为dual rank软件配2个rank两颗单rank2CS0接第一颗CS1接第二颗容量翻倍CA/DQ等长要求更高CS顺序不能接反2.2 片选走线的SI问题等长是命令总线的一部分很多人布DDR的时候会认真处理DQ、DQS的等长却常常忽略命令总线。CS0、CS1和CKE是命令总线的一部分它们与CA[9:0]属于同一个时序组。在STM32MP2x这种支持LPDDR4高频率的设计里命令总线的建立/保持时间窗口本身就很紧张如果CS的走线比CA长出一大截或者中间多打了两个过孔轻则DDR初始化不稳定重则直接训练失败。我的经验是在布局布线时把CS0、CS1、CKE0、CKE1这四根信号和CA总线一起做等长约束组内等长误差尽量控制在20mil以内相对CLK的等长控制在200mil以内。当然这些数值只是常规参考具体约束要以STM32MP2x的PCB设计指南为准。另外片选信号尽量不要在上面加测试点。就算为了调试方便要加stub也必须控制得足够短高频命令信号对stub非常敏感一根几毫米的stub都可能把边沿吃掉。2.3 不要让“测试方便”毁了片选信号还有一个硬件上的坑是调试时用飞线强行改片选。比如初始化失败之后有人会想“我把CS1直接飞线到地强制拉低试试”。这个操作在LPDDR4上是灾难性的。前面说了片选必须在时钟边沿和CA一起被采样飞线带来的寄生电感和电容会让本来就不富裕的时序裕量直接消失。而且如果两个片选同时有效两个rank会同时响应命令数据总线就会发生冲突读出来的数据完全是乱的。正确做法不是改硬件而是从软件参数里把rank数量改成和实际硬件一致再重新初始化。这里再补充一个知识点LPDDR4的CS_n和CKE是成对出现的片选和时钟使能必须一起连接。有些人只接了CS把CKE悬空颗粒根本不会进入正常工作状态。画原理图时务必成对检查。3. 把片选配置写进软件CubeMX到TF-A的完整路径3.1 STM32CubeMX里怎么填rank相关字段STM32MP2x的DDR初始化参数官方推荐用STM32CubeMX生成。新建工程后在DDR控制器配置界面里选择LPDDR4类型然后填入颗粒型号或手动填写参数。其中两个字段和chipselect直接相关一个是“Number of ranks”另一个是“ChipSelect connected”或“Rank mapping”不同版本的叫法略有差异。这里我的建议是先打开LPDDR4颗粒的数据手册翻到“Density and Organization”那一页明确这颗颗粒是single rank还是dual rank然后再去CubeMX里填。不要凭印象填也不要因为开发板默认配了dual rank就照抄。填错的结果在硬件上和软件上都会体现后面我会单独说。3.2 TF-A里那组DDR参数的真正含义CubeMX生成代码后DDR初始化序列会以结构体形式放在一个C文件里STM32MP2x平台通常最终用于TF-A的BL2阶段。这个结构体里有一堆时间参数比如tCK、tRCD、tRP、tRAS这些参数决定读写时序同时也有与rank相关的配置比如rank数量、地址映射方式。片选错误最典型的表现就是在这一套参数里rank数量与硬件不符。这里必须强调STM32MP2x平台上DDR的初始化发生在TF-A的BL2阶段U-Boot和Linux内核都是直接使用BL2初始化好的内存不会重新初始化。所以更改DDR配置之后必须重新编译并烧写整个TF-A镜像只改U-Boot或内核是完全没有用的。这个流程不少初学者会搞混辛辛苦苦改了内核设备树里的内存大小结果发现启动日志根本没变化问题其实出在更早的BL2阶段。3.3 验证配置是否生效的常用方法配置生效的直接验证方式是看U-Boot启动日志里“DDR: xxx MiB”这一行。比如你硬件上是2 GiB这里显示1 GiB基本说明rank数配少了。还有一种更细致的验证方式是在U-Boot里执行内存读写命令比如用“mw.l”写一段物理地址再用“md.l”读回来观察高位物理地址是否真的落到了第二个rank上。如果写读不一致重点检查CS1究竟是空接还是接到了颗粒上。在切换rank配置之后还可以用STM32官方的DDR测试工具或一些第三方内存测试工具做全地址校验。这些工具会遍历所有物理地址能快速暴露片选映射错误、地址线虚焊等问题。我之前遇到过一种情况全地址测试跑到后半段就开始报错前半段完全正常。这种“只在某段地址出错”的模式多半就是rank映射配置和实际硬件连接对不上造成的。4. 片选配置错误的三种典型症状与排查思路4.1 症状一容量只剩一半但系统很稳定这个症状迷惑性很强。如果你的板子内存颗粒是2 GiB系统起来后只认到1 GiB而且读写测试在1 GiB范围内每跑必过很多人会先怀疑是颗粒虚焊、地址线断线。但实测下来这种“稳定的减半”大概率是rank数配置少了。原因是控制器把整个物理地址空间都映射到了rank0rank1虽然硬件存在却没有被启用。遇到这种情况直接检查CubeMX和TF-A里的rank配置改成2之后重新编译烧写通常立刻恢复正常。如果你用的是单颗dual-rank颗粒容量减半说明只用了rank0如果你用了两颗single-rank颗粒容量减半说明第二颗从头到尾就没工作过。4.2 症状二DDR训练直接失败卡在DQS gate如果说容量减半还算“幸运”的报错方式那么训练失败就要麻烦得多。我见过一种典型情况颗粒是dual rank但你在软件里配成了2 ranks而硬件上只有CS0有颗粒CS1是悬空的。初始化时控制器会对rank1做DQS gate training从rank1的DQS返回窗口完全定位不到于是训练直接失败日志里通常会看到类似training failed或DFI PHY status异常的报错。这种问题不一定需要改板子。如果硬件设计原本就是单rank那把rank数改回1或者确认CS1确实接到了内存颗粒上再重新走一遍初始化就能解决。但要注意如果你用的是单rank颗粒CS1悬空是没有问题的但必须在软件里明确配置成1 rank不能因为MP2x支持两个片选就顺手配成2。4.3 症状三系统能启动但随机性死机、读写漂移最折磨人的是这种系统能起来但运行几小时甚至几分钟就随机性死机串口打印乱码内存测试时好时坏。这种表现极其像信号完整性问题很多人会去调驱动强度、改ODT、加等长约束调了半天没效果。真正的原因可能只是两个片选信号接反了。比如板子上CS0接到了颗粒的rank1CS1接到了rank0软件里还按照“CS0就是rank0”的默认逻辑来配置。初始化时控制器向rank0发的第一条MRS命令实际作用在rank1上后面的命令全部错位相当于整个寄存器的配置过程都乱了。这个问题的根源在于LPDDR4并不要求CS0必须接rank0但软件里有默认的映射关系一旦接反很多操作会落到错误的rank上导致数据错乱。排查方法其实很直接先看原理图确认STM32MP2x的CS0、CS1对应到芯片封装上哪个球号再追到LPDDR4颗粒的引脚确认连接顺序。如果发现接反了软件里可以调整rank映射次序来匹配硬件但更稳妥的方案还是改版或飞线从根上把逻辑关系理清不然以后维护起来很痛苦。5. 从硬件到软件我总结的片选检查清单5.1 硬件检查项确认LPDDR4颗粒手册里写的是single rank还是dual rank。确认STM32MP2x的CS0/CS1与颗粒的CS0_n/CS1_n一一对应。检查CKE0/CKE1是否与CS成对连接不要出现只接CS不接CKE的情况。确认CS走线与CA走线在同一个等长组里组内误差控制在合理范围。不要在CS上乱加上下拉电阻和滤波电容LPDDR4命令总线对容性负载非常敏感。如果用了两颗单rank颗粒确认DQ、DQS、CA所有信号都是共享连接没有接错位。5.2 软件检查项CubeMX里rank数量与硬件实际连接一致。TF-A里的DDR参数文件已同步替换并重新编译烧写BL2。U-Boot日志里DDR容量显示正确。对最高物理地址与中间物理地址做读写测试确认两个rank都能访问。跑一遍全地址压力测试确认不同rank切换时没有时序问题。这些检查项看起来很基础但我在实际项目中每一项几乎都在不同板子上踩过。尤其是“rank数量与硬件不一致”这一点几乎每个新画STM32MP2x板子的同事都会犯一次。片选这个东西原理上不难难的是从数据手册的引脚定义一路追踪到软件参数中间任何一个环节脱节都会变成很难查的诡异问题。我个人在实际调试中的体会是LPDDR4的chipselect问题九成以上在原理图阶段就能避免。前提是选颗粒之前先看一眼“Organization”画原理图时把CS0/CS1和CKE0/CKE1的信号名标注清楚软件配置时从CubeMX生成的参数再回头核对一遍硬件连接。如果你现在正被类似问题困扰建议先从U-Boot日志里的DDR容量入手往往一条日志就能定位出是rank配置错了还是硬件接反了。片选这个坑一旦理清了rank和CS的关系后面再遇到DDR相关的问题都会顺很多。
返回列表