4. CA训练流程:初始化序列与训练步骤
CA训练不是上来就一顿操作。你想想看,DDR颗粒刚上电时,内部状态是未知的。必须先走一套标准初始化流程,让颗粒进入“可训练”状态。这一步没走对,后面所有训练都是在跟空气斗智斗勇。
我个人习惯把CA训练拆成两段看:前面是初始化序列,中间才是真正的训练步骤。今天我们就按这个节奏来梳理。
4.1 初始化序列,一个都不能少
CKE(Clock Enable)保持低电平,这是第一步。DDR颗粒在上电复位期间,CKE必须为低。我见过一些新手工程师上来就给CKE拉高,结果颗粒根本没响应,白白浪费半天时间。
CKE保持低的持续时间,JEDEC标准要求至少200μs。我建议你把余量放大一点,比如设到400μs。为什么?实际项目中,电源纹波大的板子,200μs可能不够稳定。我在一个量产项目中吃过这个亏,后来统一改成500μs,再没出过问题。
接着,我们按顺序执行以下动作:
- Reset_n置高:释放复位信号,颗粒内部的PLL和I/O开始准备
- Clock稳定后等待tINIT:标准要求时钟稳定后至少等待5个时钟周期
- 拉高CKE:通知颗粒准备接收命令
- 发送NOP命令:持续至少200个时钟周期,等待内部PLL锁定
- 执行ZQ校准(ZQCL):校准输出驱动强度和终端电阻
- 配置MR寄存器:设置CA训练所需的参数
关键检查点:
- CKE拉高后,需等待tXP(至少5个时钟)再发送有效命令
- ZQCL完成后,必须检查ZQ状态寄存器,确保校准完成再进入训练
- MR配置顺序:先MR3(读写重驱动),再MR1(驱动能力,终端电阻,写级别),最后MR2(CA训练,Vref)
4.2 初始化时序的那些坑
| 阶段 | 最小时间 | 典型项目设置 | 我踩过的坑 |
|---|---|---|---|
| 上电到CKE拉低 | 200μs | 400μs | 设太短,复位不完整 |
| 时钟稳定到CKE拉高 | 5个tCK | 10个tCK | 直接设了1μs,结果PLL没锁住 |
| CKE拉高到ZQCL | tXP+10个tCK | 1μs | 跳过等待,训练失败 |
| ZQ校准时间 | 512个tCK | 1μs | 读回状态发现超时 |
4.3 MR配置,决定了CA训练能不能过
MR3:设置CA ODT(片内终端电阻)强度。CA训练需要干净的信号反射,ODT强度根据PCB走线阻抗来选。我一般用60Ω起步,跑不通再换40Ω或120Ω。别想着用RTT_NOM(数据线终端),CA ODT是独立的。
MR1:写级别(Write Leveling)使能。DDR4支持两种写对齐方式:一种是靠CK与DQS的相位关系,另一种就是写级别。CA训练前,必须使能写级别,否则后续训练数据对不齐。
MR2:CA训练使能,以及CA Vref选择。这里有两个关键位:
- CA Training Enable(位[7])—— 置1
- CA Vref选择(位[5:6])—— 根据平台选VrefCA2或VrefCA4
这里是容易踩坑的地方:
我曾经在配置MR2时,顺手把CA Vref选成了VrefCA4,但我的颗粒只支持VrefCA2。结果CA训练根本跑不起来。回头查spec才发现,有些颗粒只支持其中一个Vref。所以,MR配置前一定要核实颗粒手册,看看它支持哪一种。
4.4 CA训练步骤,逐一拆解
初始化完成,MR配好,就能开始CA训练了。整个流程我总结为5个步骤:
步骤1:写级别(Write Leveling)
说白了,就是让DQS信号在时序上对齐到CK。DDR4颗粒靠tDQSS(DQS滞后时间)来采样,误差不能超过±0.25tCK。训练方法是:MC发出写级别模式进入命令,然后检测DQ的值,调整DQS的延迟。
实战建议:
写级别训练成功后,MC应把DQS延迟值记录下来。我习惯把这个值写在调试日志里,后面读训练和CA训练都能参考。如果写级别失败了,别急着调延迟,先查ODT和Vref。
步骤2:读训练(Read Training)
读训练调整的是DQS之后的数据眼中心位置。这一步可以通过重试采样点(Read DQS 2X)或数据对齐模式(Data Alignment Mode)完成。
步骤3:CA训练(Command/Address Training)
这是咱们课程的核心。CA训练分为两个子步骤:
- CA Vref校准:MC通过MRW(Mode Register Write)修改VrefCA值,检测哪个电压值下CA通道误码率最低。一般从0.6×VDDQ开始步进,步长1%~2%
- CA延迟训练:MC发送特定CA模式(比如写级别模式下的CA),调整CK与CA之间的延迟,找到稳定的采样窗口
步骤4:写训练(Write Training)
以CA训练得到的写延迟为基础,调整数据对齐时间。
步骤5:训练结果验证
跑一遍CRC校验或数据回环测试。如果都能通过,恭喜你,CA训练基本稳了。
4.5 避坑指南,我踩过的雷
这些年做CA训练调试,踩过的坑两只手数不过来。挑几个典型的说说:
- 坑1:写级别过了,CA训练还是失败
我遇到过一次,写级别返回的延迟值是对的,但CA训练就是过不了。查了两天才发现,颗粒的写级别模式里有个“CA training mode”位需要额外配置,手册里没写清楚。所以说,查手册不能只看CA训练章节,整本都翻一遍。 - 坑2:ZQCL超时
有个项目温度变化剧烈,ZQCL校准时间飘到了1.2μs。我设的timeout是1μs,结果训练还没开始就停了。后来我把ZQCL timeout放宽到2μs,加了个超时重试机制。 - 坑3:MR配置写错
我们之前有一个项目,MR1里写级别使能位没置1,导致写级别训练返回的数据全是0。这其实不算训练失败,是配置不对。所以每一步都检查MR状态寄存器,比事后追查效率高得多。
最后提醒一下:
CA训练不是一次性通过的。你可能需要反复调整Vref和延迟值。我建议在调试软件里保留一套“回退参数”:如果新参数训练失败,能自动跳回上一组能用的参数。这样至少保证板子能正常启动,不至于卡死在训练阶段。
4.6 本节要点回顾
嗯,这一章内容挺多的。我把它浓缩成几条,方便你后续复习:
- 初始化序列必须严格按顺序执行,400μs的CKE低时间别省
- MR配置时,写级别使能、CA训练使能、CA Vref选型,一个都不能错
- CA训练的分两个子任务:Vref校准确定电压窗口,延迟训练确定采样位置
- 写级别训练是CA训练的前置条件,它失败了后面全是白做
- 训练结果用CRC或回环验证,不要只看MC返回的“Pass”标志
- 建议保留回退参数机制,重训失败时不至于死机