量产烧录线遇到一种故障,排查起来特别耗人:烧录器报告Verify校验通过,良率报表一片绿,结果芯片上板后不开机、功能异常,甚至干脆锁死再也连不上调试器。
更诡异的是,同样的程序文件、同样的烧录参数,时好时坏。产线工程师换插座、换烧录器、换芯片批次,折腾一圈,问题还在。
有人说这是“幽灵坏片”。其实不是。Verify通过还出问题,根子往往不在硬件,而在你对CRC校验的理解还停留在黑盒阶段。
一、你用的Verify是哪一种
很多人以为“校验”只有一种:烧录完读回来和源文件比对,一致就是OK。
实际上,量产烧录环境里的Verify分两种,机制完全不同。
第一种:数据记录比对(Verify by Data Record)
这是最传统的校验方式。烧录器把芯片内容读出来,和PC端下发的hex文件逐字节对比。这个逻辑看起来无懈可击,但它有一个致命缺陷:比对双方用的是同一份数据记录。
什么意思?如果hex文件本身有误、或者烧录器在解析hex时发生位宽解析错误、或者地址映射理解偏差,那么烧录和校验会基于同一个错误的数据源进行。两个错误互相对比,结果当然“一致”,结论是“PASS”,但芯片里的东西根本就是错的。
第二种:CRC校验(CRC Test)
CRC校验不依赖外部数据文件。它的做法是:先找一片确认完好的芯片,执行一次“学习”(Learn)操作,把这片芯片的内容压缩成一个CRC特征值存下来。量产时,烧录器对每一颗芯片执行同样的CRC压缩算法,将结果与之前存下的特征值比对。
这种校验方式绕开了数据文件这个公共误差源。CRC校验通过,说明当前芯片的内容与“黄金样本”一致,而不是与某个可能本身就有问题的hex文件一致。
理解了这两个机制的区别,很多疑难杂症的排查方向就清晰了。
二、四个真实案例,四种CRC翻车现场
案例1:CRC计算结果对不上,问题出在芯片硬件bug
某款基于Cortex-M0+内核的MCU,采用I2C BSL方式烧录。开发一套烧录工具时,CRC算法完全参照官方BSL协议文档实现,本地计算结果与芯片返回的CRC始终对不上。
换了地址范围,换0x00填充、0xFF填充,结果依然不匹配。
折腾两周,芯片原厂应用支持回复:该芯片存在Cache bug,首次读取0x0~0x8地址时返回全0xFF。无论实际写入什么数据,第一次读一定是错的。CRC校验正好踩在这个坑里。
解决方案:要么避开这个地址范围做CRC,要么先做一次虚拟读。这不是算法问题,是硅片级缺陷。
案例2:Bit-reversal理解反了,CRC外设算出来总不对
某款MCU内置硬件CRC外设,开发者在参考手册指导下编写代码,却发现计算结果始终与手册示例不符。
反复核对寄存器配置,确认多项式、初始值、输出异或全部一致。最后发现,问题出在“位反转”(bit-reversal)的理解上。
手册里写着“输入数据位反转”,开发者理解为按位取反(bitwise NOT)。其实不是。Bit-reversal是把整个字节/半字/字的高低比特位顺序倒过来,解决的是大小端字节序的适配问题,与逻辑取反完全是两回事。
这个问题教科书不讲,但量产烧录时如果上位机与芯片的CRC配置不一致(比如一个用了位反转,一个没开),校验失败率能到100%。
案例3:CRC特征值是从错误芯片“学”来的
某FPGA方案,量产烧录时偶发CRC校验失败。换另一品牌Flash后故障消失。
查到最后发现:研发阶段用的“黄金样本”是从一块搭载A品牌Flash的开发板上“学”来的特征值,而量产用的是B品牌Flash。
两种Flash在空片状态、擦除状态下的读值行为存在细微差异——比如空片读回是0xFF还是0x00,擦除后读出电平稳定时间不同。这些差异不会影响正常功能,但足以让CRC压缩结果不同。
这不是CRC算法失效,是“黄金样本”选错了。
案例4:CRC校验通过,但芯片被锁死
某款车规级多核MCU,烧录过程中某段扇区CRC报错,随后调试器无法连接,调试软件提示DEVICE_LOCKED。
分析发现,UCB(用户配置块)区域被破坏了。芯片启动时读UCB,发现CRC校验失败,认为配置信息非法,主动锁死调试接口。
诡异的是,烧录器的Verify报告是“PASS”。为什么?
因为烧录器校验时只校验了代码区,根本没去读UCB区域。CRC覆盖范围没有对齐芯片的启动校验范围,烧录器说Pass,芯片上电自检说Fail。各自校验的内容完全不同,结论当然无法互通。
三、排查CRC类问题的工程清单
如果你在产线遇到Verify通过但功能异常,或者CRC mismatch间歇出现,按这个顺序查:
第一步:确认CRC的参考源
是Data Record比对,还是CRC Test?
如果是CRC Test,“黄金样本”芯片是否确认完全合格?
黄金样本与量产芯片的Flash型号、工艺版本是否一致?
第二步:确认CRC算法配置完全一致
多项式是CRC32、CRC16还是自定义?
初始值是多少?输出是否异或?
输入输出是否做了位反转?字节序是大端还是小端?
这些参数在烧录器固件、上位机软件、芯片内部CRC外设三者之间必须完全对齐
第三步:确认CRC覆盖的内存范围
芯片上电自检时会对哪些区域做CRC?
烧录器Verify时覆盖的区域是否与之完全重叠?
配置字、UCB、OTP区域是否被排除在校验范围之外?
第四步:确认有没有踩硬件坑
芯片勘误表里有没有关于CRC、Flash读取、Cache的已知问题?
首次访问特定地址是否有异常返回值?
四、一个建议
量产烧录的校验逻辑,建议做“双保险”:
CRC Test做主校验,确保芯片内容与经过充分验证的黄金样本一致。
Data Record Verify做辅校验,放在CRC之后随机抽样执行,用来发现烧录器固件版本错配、hex文件解析错误这类系统性风险。
两者分工明确,互不替代。
Verify通过不等于芯片能用。这句话不是玄学,是CRC校验机制在量产落地时必然存在的缝隙。把缝隙填上,那些“幽灵坏片”自然会现形。


客服
小程序
公众号