烧录协议与接口:SWD、JTAG、UART、I2C、SPI 选型指南
做量产烧录这些年,我见过太多因为接口选错而翻车的案例。有人用 JTAG 刷了十万片,结果发现速度跟不上产线节拍;有人图省事用 UART,结果烧录一半被干扰搞得批量报废。说白了,没有万能的协议,只有最合适的搭配。
今天咱们就把 SWD、JTAG、UART、I2C、SPI 这五个常见烧录协议掰开揉碎讲清楚。我会结合自己踩过的坑,告诉你什么时候该选谁,什么时候必须避开谁。
核心观点:烧录协议选型 = 速度需求 × 引脚限制 × 可靠性要求 × 产线环境。四个维度缺一不可。
SWD:ARM 生态的默认选择
SWD(Serial Wire Debug)是 ARM 公司推出的调试接口。它只用两根线——SWDIO(数据)和 SWCLK(时钟),就能完成烧录和调试。我个人习惯在 Cortex-M 系列芯片上首选 SWD,原因很简单:省引脚。
你想想看,一个 QFN32 封装的 MCU,引脚本来就紧张。如果用 JTAG 要占 5 个脚,SWD 只要 2 个。剩下的引脚留给传感器、通信模块,不香吗?
我的经验:量产烧录时,SWD 的时钟频率建议设在 4-8 MHz。别盲目拉高到 10 MHz 以上,产线线缆长、干扰大,容易丢包。我曾经在一条 3 米长的烧录线上跑 12 MHz,结果废品率飙升到 5%。降到 6 MHz 后,问题立刻消失。
SWD 还有一个隐藏优势:它支持 SWO(Serial Wire Output)引脚,可以输出调试信息。这在产线测试阶段特别有用——不用额外接 UART,就能看到芯片启动日志。
JTAG:老牌劲旅,多芯片场景首选
JTAG(Joint Test Action Group)是 IEEE 1149.1 标准接口。它需要 5 根线:TCK、TMS、TDI、TDO 和可选的 nTRST。说实话,现在单芯片烧录我很少用 JTAG,SWD 更香。但有一种场景 JTAG 无可替代——菊花链(Daisy Chain)。
我记得有一次做路由器量产,一块板子上有 4 颗芯片需要烧录:主控、Wi-Fi 芯片、交换芯片、安全芯片。如果用 SWD,每颗芯片都要单独接烧录器,4 个烧录器同时工作,产线工位乱成一团。换成 JTAG 菊花链后,一根排线串起所有芯片,一次烧录搞定。
| 特性 | SWD | JTAG |
|---|---|---|
| 引脚数 | 2(+可选 SWO) | 4-5 |
| 最大时钟 | 通常 10-50 MHz | 通常 10-50 MHz |
| 多芯片支持 | 需多路选择器 | 原生菊花链 |
| 调试功能 | 完整 | 完整 + 边界扫描 |
| ARM 生态 | 默认首选 | 兼容 |
注意:JTAG 的 nTRST 引脚(复位 TAP 控制器)在量产烧录中容易被忽略。如果烧录器不驱动 nTRST,某些芯片可能进入不了正确的调试模式。我建议在烧录夹具上把 nTRST 拉低再释放,确保 TAP 状态机复位干净。
UART:简单可靠,但别指望速度
UART(Universal Asynchronous Receiver/Transmitter)烧录,说白了就是通过串口把固件数据发过去。很多芯片出厂时 ROM 里就固化了 UART 启动加载程序,比如 STM32 的 System Bootloader。你只要拉高 BOOT0 引脚,上电后芯片就会乖乖听串口指令。
UART 最大的优点是简单。两根线(TX、RX),不需要时钟同步,波特率匹配就行。产线上随便拉个 USB 转串口模块就能用。但缺点也很明显——慢。
我曾经用 UART 烧录一个 2 MB 的固件,115200 波特率,算上协议开销,实际速度不到 10 KB/s。烧一片要 3 分多钟。产线节拍是 30 秒一片,完全跟不上。后来换成 SWD,20 秒搞定。
什么时候用 UART 烧录?
- 固件小于 256 KB
- 产线节拍宽松(> 2 分钟/片)
- 芯片没有 SWD/JTAG 接口(比如某些低端 MCU)
- 需要远程烧录(通过无线串口模块)
I2C:两线制,但烧录场景有限
I2C(Inter-Integrated Circuit)也是两根线:SCL(时钟)和 SDA(数据)。但它和 SWD 不同,I2C 是半双工、带地址仲裁的协议。烧录时,芯片作为从设备,烧录器作为主设备。
说实话,I2C 在烧录领域用得不多。主要原因是速度上不去——标准模式 100 kHz,快速模式 400 kHz,高速模式 3.4 MHz。但实际产线中,I2C 总线受线缆电容影响很大,跑 400 kHz 都容易出问题。
我遇到过最头疼的一次:用 I2C 烧录一颗传感器芯片,产线线缆长度 2 米,SCL 波形已经变形得不成样子。后来加了 I2C 总线缓冲器(如 PCA9517),才勉强稳定下来。
避坑指南:I2C 烧录时,上拉电阻一定要选对。产线线缆长,寄生电容大,上拉电阻太小会拉低信号幅度,太大又导致上升沿太缓。我一般从 4.7 kΩ 开始试,线缆每增加 0.5 米,电阻减小 1 kΩ。
SPI:速度之王,但引脚多
SPI(Serial Peripheral Interface)是这五个协议里速度最快的。它需要 4 根线:SCLK、MOSI、MISO、CS。全双工通信,没有地址仲裁,想跑多快跑多快——前提是你的烧录器和芯片都扛得住。
SPI 烧录的典型场景是 Flash 芯片。比如用 SPI 接口烧录 NOR Flash,时钟频率跑到 50 MHz 甚至 100 MHz,一个 16 MB 的固件几秒钟就刷完了。产线节拍紧张的时候,SPI 是救命稻草。
但 SPI 也有坑。它没有标准的错误检测机制。数据发出去,芯片收没收到、收对了没有,全靠上层协议保证。量产烧录时,我建议在固件包末尾加 CRC32 校验,烧录完成后回读验证。
// SPI 烧录时的 CRC 校验示例(伪代码)
uint32_t calculate_crc32(uint8_t *data, uint32_t len);
bool verify_flash(void) {
uint32_t crc_calc = calculate_crc32(firmware, firmware_len);
spi_send_command(CMD_READ_CRC); // 让芯片计算并返回 CRC
uint32_t crc_chip = spi_read_32();
return (crc_calc == crc_chip);
}
警告:SPI 烧录时,CS 引脚的控制时序非常关键。有些烧录器在切换片选时会产生毛刺,导致 Flash 误判为命令。我建议在 CS 引脚上加一个 10 kΩ 上拉电阻,并在烧录器固件中确保 CS 拉高后保持至少 100 ns 再拉低。
协议选型速查表
| 协议 | 引脚数 | 典型速度 | 可靠性 | 最佳场景 |
|---|---|---|---|---|
| SWD | 2 | 4-10 MHz | 高 | ARM MCU 量产烧录 |
| JTAG | 4-5 | 10-50 MHz | 高 | 多芯片菊花链烧录 |
| UART | 2 | 115200-921600 bps | 中 | 小固件、远程烧录 |
| I2C | 2 | 100-400 kHz | 中低 | 传感器、小容量 EEPROM |
| SPI | 4 | 10-100 MHz | 中(需 CRC) | Flash 芯片、高速烧录 |
选型决策流程
说了这么多,到底怎么选?我总结了一个简单的三步法:
- 数引脚:板子上能腾出几个烧录引脚?只有 2 个 → SWD 或 UART;有 4 个以上 → SPI 或 JTAG。
- 看速度:固件多大?产线节拍多少秒一片?超过 1 MB 且节拍紧 → SPI 或 SWD(高频);小于 256 KB → UART 也能凑合。
- 评估环境:产线线缆长不长?电磁干扰大不大?长线/强干扰 → 优先 SPI(差分方案)或 JTAG(信号完整性好)。
我的最终建议:如果你做的是 ARM Cortex-M 系列芯片的量产,无脑选 SWD。省引脚、速度快、工具链成熟。除非你有特殊需求(多芯片菊花链、超高速烧录、远程烧录),否则 SWD 就是最稳妥的选择。