3、核心芯片测试:MCU/CPU功能测试、Flash/RAM读写测试、加密芯片验证
好,咱们进入核心芯片测试这一块。说实话,门禁产品能不能稳定跑起来,全看这几颗芯片给不给力。我这些年经手的项目,至少有一半的返修问题,追根溯源都是芯片测试没做到位。你想想看,MCU死机、Flash数据错乱、加密芯片被破解——任何一个坑踩进去,量产交付就得翻车。
我个人习惯把核心芯片测试分成三大块:MCU/CPU功能测试、Flash/RAM读写测试、加密芯片验证。咱们一个一个来拆解。
3.1 MCU/CPU功能测试
MCU是门禁的大脑。它要是出问题,整个系统就瘫痪了。我建议测试分两步走:基础供电与时钟验证,然后是核心指令与外设功能测试。
3.1.1 供电与时钟
先测供电。用万用表量核心电压,比如1.8V或3.3V,偏差不能超过±5%。然后看时钟——用示波器抓晶振输出波形。我记得有一次,一批MCU死活起振不了,查了半天发现是晶振负载电容焊错了。嗯,这里要注意:时钟频率必须稳定,抖动不能超过±100ppm。
3.1.2 核心指令测试
说白了就是让MCU跑一段自检程序。我一般写一个简单的循环,执行加减乘除、逻辑运算、跳转指令。如果结果不对,那这颗芯片基本可以判死刑了。
测试要点:
- 跑满所有核心指令集(ARM、RISC-V、8051等)
- 连续运行至少10分钟,监控温度
- 记录异常中断次数,超过3次直接标记不良
3.1.3 外设功能测试
门禁常用的外设:GPIO、UART、I2C、SPI、定时器。我建议用回环测试法——比如UART自发自收,发一串0x55、0xAA,看接收端能不能原样返回。GPIO就简单了,拉高拉低,用逻辑分析仪看波形。
我的小技巧: 写一个外设遍历测试脚本,自动切换每个外设模式。我在项目中遇到过,某批次MCU的SPI时钟极性反了,导致读卡器数据全乱码。后来加了极性自动校准,再没出过问题。
3.2 Flash/RAM读写测试
Flash和RAM是门禁的“记忆体”。Flash存固件和用户数据,RAM跑临时变量。测试核心就两个字:可靠。
3.2.1 Flash读写测试
Flash有擦写寿命,一般10万次。量产测试不用测到寿命极限,但必须验证每个扇区都能正常读写。我常用的方法:
- 全片擦除:先擦除所有扇区,读回全0xFF
- 写入模式:写入0x55、0xAA、0x00、0xFF等边界值
- 读回校验:逐字节比对,不一致就报错
注意: 我曾经遇到Flash写入后读回正确,但掉电后数据丢失。原因是电源纹波太大,导致写入电压不足。所以测试时一定要模拟真实供电环境,最好加一个掉电保持测试。
3.2.2 RAM读写测试
RAM测试更简单,但坑更多。我建议用March C算法,它能检测出地址线短路、数据线粘连等问题。代码示例:
// March C算法伪代码
for (addr = 0; addr < RAM_SIZE; addr++) {
write(addr, 0x00); // 写0
}
for (addr = 0; addr < RAM_SIZE; addr++) {
if (read(addr) != 0x00) error(); // 读0
write(addr, 0xFF); // 写1
}
for (addr = RAM_SIZE-1; addr >= 0; addr--) {
if (read(addr) != 0xFF) error(); // 读1
write(addr, 0x00); // 写0
}
// 重复反向遍历,覆盖所有地址
你想想看,如果RAM地址线A0和A1短路,写地址0的数据会同时写到地址1。March C算法能100%检测出这类故障。我建议测试时间控制在2秒以内,毕竟量产要效率。
3.3 加密芯片验证
门禁的加密芯片,说白了就是防破解的。常见的有ATECC608A、SE050等。测试分三步:通信验证、密钥存储检查、加解密功能测试。
3.3.1 通信验证
加密芯片通常走I2C或SPI。先发一个WHO_AM_I命令,读回设备ID。比如ATECC608A的ID是0x6A。如果读不到,检查焊接和上拉电阻。我记得有一次,加密芯片I2C地址被拉偏了,原因是PCB走线太长导致信号衰减。后来加了总线中继器才解决。
3.3.2 密钥存储检查
加密芯片的密钥是出厂烧录的,量产时不能读出来。但可以验证密钥槽是否被正确锁定。我建议:
- 尝试写入一个无效密钥,看芯片是否拒绝
- 读取密钥槽状态寄存器,确认锁定位为1
- 用已知密钥做一次签名,验证签名结果
关键点: 加密芯片的密钥一旦锁定,永远不能修改。所以量产测试中,千万不要执行锁定操作,否则整批芯片就废了。我建议在测试固件里加一个“测试模式”标志,跳过锁定步骤。
3.3.3 加解密功能测试
这是最后一步。发一个随机数给加密芯片,让它用内部密钥加密,然后MCU用预置的公钥解密。如果解密结果和原随机数一致,说明加解密链路正常。
避坑指南: 我曾经遇到加密芯片加密结果正确,但解密时MCU的算法库有bug,导致比对失败。后来我改成双向验证——MCU加密、芯片解密,芯片加密、MCU解密。两边都通过才算合格。
测试流程总结
我把这三块测试整合成一个流水线:
| 测试项 | 测试时间 | 通过标准 | 常见故障 |
|---|---|---|---|
| MCU供电/时钟 | 5秒 | 电压±5%,频率±100ppm | 晶振不起振、电容错 |
| MCU指令测试 | 10秒 | 所有指令结果正确 | ALU逻辑错误 |
| Flash读写 | 15秒 | 全扇区读写一致 | 掉电丢失、坏块 |
| RAM March C | 2秒 | 无地址/数据线故障 | 地址短路、数据粘连 |
| 加密芯片通信 | 3秒 | 设备ID正确 | I2C信号衰减 |
| 加密功能验证 | 5秒 | 双向加解密一致 | 算法库不匹配 |
总时间控制在40秒以内,配合自动化测试夹具,每小时能测90片。嗯,这就是我这些年总结出来的核心芯片测试方案。你按这个流程走,量产良率至少能稳定在98%以上。