烧录协议与接口:SWD、JTAG、UART、I2C、SPI 选型指南

做量产烧录这些年,我见过太多因为接口选错而翻车的案例。有人用 JTAG 刷了十万片,结果发现速度跟不上产线节拍;有人图省事用 UART,结果烧录一半被干扰搞得批量报废。说白了,没有万能的协议,只有最合适的搭配。

今天咱们就把 SWD、JTAG、UART、I2C、SPI 这五个常见烧录协议掰开揉碎讲清楚。我会结合自己踩过的坑,告诉你什么时候该选谁,什么时候必须避开谁。

核心观点:烧录协议选型 = 速度需求 × 引脚限制 × 可靠性要求 × 产线环境。四个维度缺一不可。

烧录协议选型决策框架 烧录协议选型 速度需求 引脚限制 可靠性要求 产线环境 SWD JTAG UART I2C SPI 选型建议速查 • 量产高速 → SWD(2线)或 SPI(4线,速度最快) • 引脚紧张 → SWD 或 UART(仅需2线) • 多芯片调试 → JTAG(菊花链) • 产线抗干扰 → SPI 或 JTAG(差分/屏蔽方案)

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 芯片、高速烧录

选型决策流程

说了这么多,到底怎么选?我总结了一个简单的三步法:

  1. 数引脚:板子上能腾出几个烧录引脚?只有 2 个 → SWD 或 UART;有 4 个以上 → SPI 或 JTAG。
  2. 看速度:固件多大?产线节拍多少秒一片?超过 1 MB 且节拍紧 → SPI 或 SWD(高频);小于 256 KB → UART 也能凑合。
  3. 评估环境:产线线缆长不长?电磁干扰大不大?长线/强干扰 → 优先 SPI(差分方案)或 JTAG(信号完整性好)。

我的最终建议:如果你做的是 ARM Cortex-M 系列芯片的量产,无脑选 SWD。省引脚、速度快、工具链成熟。除非你有特殊需求(多芯片菊花链、超高速烧录、远程烧录),否则 SWD 就是最稳妥的选择。