问题描述
【K230 DDR 调试求助】自制核心板 NT6CL128M32CM-H1,LPDDR3 CA Training 全 FF,求确认官方 800 MT/s 配置及 uMCTL2 tRAS 编码
各位嘉楠工程师、K230 开发者好!
目前我自己设计并焊接了一块 K230 核心板,正在进行 SPL 启动和 LPDDR3 DDR bring-up,遇到了 CA Training 失败的问题。软件侧已经进行了较深入的审计,希望得到官方 DDR Controller、PHY 配置方面的帮助。
1. 硬件信息
- SoC:Kendryte K230
- DDR:Nanya NT6CL128M32CM-H1
- 类型:LPDDR3
- 容量:4Gb(512MiB)
- 位宽:x32
- Rank:1
- 当前初始化速率:1600 MT/s
- 计划验证的低速配置:800 MT/s
- SDK commit:
7e302f733311d284be255f0d81d3463b6ae6ee6d
原理图库最初使用了 NT6CL512T32AM 的封装符号,但板上实际焊接的是 NT6CL128M32CM-H1,现按 CM-H1 的 178-ball pinout 和 datasheet V1.4 进行适配。
2. 遇到的问题
历史 CA Training 日志中:
CAA0 ~ CAA9
每行 12 bytes
共 120 bytes
全部为 FF
通过 PMU IMEM 反汇编已经确认,CAA 是 CA training reject bitmap,不等于原始 DQ 全部为高电平。
软件流程已经确认存在:
MR63 RESET
↓
MR41 = 0xA4
↓
CA Training Phase 1
↓
MR48 = 0xC0
↓
CA4 / CA9 Training
↓
MR42 = 0xA8
↓
CAA bitmap / training result
MR41/MR48/MR42 编码与南亚 CM-H1 数据手册一致。
另一次带调试功能的镜像出现 Host receive timeout、CAA=0 bytes,但该日志无法与历史全 FF 的原始镜像建立完整的封装哈希绑定,因此没有把两者认定为同一次故障。
当前尚不能确认是 ACSM 超时、DRAM CA 反馈失败,还是其他 PHY/时序问题。
3. 已完成的软件排查
目前已经完成:
- CA selector:10/10 核对
- DQ selector:32/32 核对
- DQS/DM mapping 核对
- DBYTE map:
[2,1,3,0] - CA feedback:DBYTE1/DBYTE2
- PMU Streaming 协议、ACK、Fatal fail-stop 审计
- PMU IMEM 完整性验证
- SPL 固定地址 ELF 链接
- PLL0 软件前置检查
- Host/PMU 离线回归测试
已找到 SDK 官方参考文件:
board/canaan/k230_evb/lpddr3_swap_800.c
我以其作为完整的 800 MT/s 参考表,适配了自制板 DQ/CA mapping,生成了离线候选,RISC-V 编译及固定地址链接均通过。
目前没有正式烧录该候选。
4. 最希望官方帮助确认:DRAMTMG0 tRAS 编码
官方 800 MT/s 参考表:
0x98000100 = 0x070a0d08
0x98002100 = 0x070a0d08
0x98003100 = 0x070a0d08
0x98004100 = 0x070a0d08
现有 1600 MT/s 表:
0x98000100 = 0x0b141a11
0x98002100 = 0x0b141a11
0x98003100 = 0x0b141a11
0x98004100 = 0x0b141a11
K230 TRM V0.3.1 说明 DDR Controller 属于 DWC_ddr_umctl2/uMCTL2 family,使用 1:2 frequency ratio。
按照南亚 CM-H1 datasheet:
800 MT/s
CK = 400 MHz
tCK = 2.5 ns
tRAS(min) >= 42 ns
ceil(42 / 2.5) = 17 CK
官方 800 表 DRAMTMG0 低 6 bit 为 8;1600 表低 6 bit 为 17。
现有同系列 uMCTL2 参考资料中有 1:2 频率模式下不向上取整的字段编码规则,可以解释两个配置值,但目前缺少与 K230 当前 Controller RTL revision 直接绑定的定义。
希望确认:
- K230 使用的 DDRC/uMCTL2 IP revision 是哪个版本?
- DRAMTMG0.t_ras_min 在 1:2、1T 模式下如何编码?
- 官方 800 表中字段 8 如何保证 LPDDR3 所需的 17 CK ACT→PRE 最小间隔?
- DRAMTMG0.t_ras_max 和 DRAMTMG1.t_rc 的单位、取整规则是什么?
- 0x100、0x2100、0x3100、0x4100 四组 timing bank 的选择和生效机制是什么?
不要求公开受限的完整 RTL,如果能提供对应 SDK 版本的字段说明、配置生成方法或上述官方配置的适用性确认,也非常有帮助。
5. 800 MT/s 时钟配置问题
目前独立候选采用以下思路:
PLL0 预期输出:1.6 GHz
DDR core parent:PLL0/2
DDR divider:/4
Controller/core:200 MHz
目标外部 DRAM CK:400 MHz
PMU DRAMFreq:800
PLL0 前置检查已经在隔离 SPL 中实现,能够读取配置、bypass、gate 和 lock 状态并在异常时停止。
但还未确认:
- K230 Boot ROM 冷启动进入 SPL 时,PLL0 是否保证为 1.6 GHz 且已锁定?
- Controller/core=200 MHz 与 DFI、PHY 及 DRAM CK=400 MHz 的关系是否正确?
- 官方
lpddr3_swap_800.c的 PLL/PllCtrl2/CalUclkInfo 是否适用于普通 K230 自制 LPDDR3 板? - 是否有更完整的 LPDDR3 800 MT/s 初始化配置或推荐调试方法?
6. 关于 NT6CL128M32CM-H1
该型号 datasheet V1.4 列出的 speed bin 包含 1333、1600、1866 Mbps,并提示低于所列频点运行时应确认厂商说明。
希望了解 K230 官方 800 MT/s LPDDR3 profile 是否有适配过该型号或同类 4Gb x32 SDP 器件的经验。
7. 当前目标
我希望先使用可信的完整 800 MT/s 初始化配置,在自己的开发板上验证:
- 是否能完成 CA Training;
- 是否能进入后续 DQ Training;
- 是否可以通过有限的 DDR 内存测试。
如果低速仍无法通过,再重点检查 VREFCA、DDR 电源、CK/CS/CKE 和 PCB 信号完整性。
目前还没有把软件问题或硬件问题认定为最终根因。
希望有使用过 K230 LPDDR3 800 MT/s、uMCTL2 或自行适配 DDR PHY 的工程师提供建议,非常感谢!
硬件板卡
定制版
软件版本
无,卡在ddr training部分