2. 烧录协议解析:SWD、JTAG、UART、SPI/I2C 原理与对比

做嵌入式这么多年,烧录协议这块我踩过的坑可真不少。很多人觉得烧录嘛,线接对就能用。其实不然。不同协议有各自的脾气,选错了轻则速度慢,重则芯片变砖。

今天咱们就把主流的四种烧录协议掰开揉碎聊一聊。SWD、JTAG、UART、SPI/I2C,它们到底怎么工作的?各自适合什么场景?

2.1 SWD 协议:ARM 的专属快车道

SWD(Serial Wire Debug)是 ARM 公司搞出来的。说白了,它就是 JTAG 的简化版。我最早接触 SWD 是在做 STM32 项目时,当时觉得这玩意儿两根线就能调试,太方便了。

核心原理:

  • 只需要两根线:SWDIO(数据线)和 SWCLK(时钟线)
  • 基于数据包传输,每个包包含请求、响应和数据阶段
  • 支持高速时钟,最高可达 50MHz 以上

关键点: SWD 协议复用了 JTAG 的 TAP(测试访问端口)状态机,但把 5 根线压缩到了 2 根。代价是同一时间只能做一件事——要么读,要么写。

我在项目中遇到过: 有一次用 SWD 烧录一块新板子,死活连不上。查了半天发现是 SWDIO 的上拉电阻没焊。嗯,SWD 对硬件要求其实挺苛刻的,SWDIO 必须要有 10kΩ 左右的上拉,否则初始握手会失败。

2.2 JTAG 协议:老牌劲旅,功能全面

JTAG(Joint Test Action Group)诞生于 1985 年,最初是为了测试 PCB 板级连接。后来被拿来烧录芯片,一用就是三十年。

标准接口:

信号 方向 说明
TCK 输入 测试时钟
TMS 输入 模式选择
TDI 输入 数据输入
TDO 输出 数据输出
TRST(可选) 输入 测试复位

JTAG 的核心是 TAP 状态机。它通过 TMS 信号在 16 个状态之间跳转,实现指令和数据寄存器的操作。你想想看,这 5 根线里,TDI 和 TDO 是独立的,所以 JTAG 可以同时读写——这是它比 SWD 强的地方。

个人建议: 如果你的芯片支持 JTAG,且 PCB 空间允许,优先用 JTAG。为什么?因为 JTAG 可以级联多个芯片,一条链上挂 4-5 个器件做批量烧录,效率翻倍。

2.3 UART 烧录协议:最朴实的串口烧录

UART 烧录,说白了就是利用芯片出厂时固化的 Bootloader,通过串口把固件灌进去。很多国产芯片(比如 ESP32、GD32)都支持这种方式。

工作原理:

  1. 芯片上电后先运行 Bootloader
  2. Bootloader 检测特定引脚电平(比如 BOOT0 拉高)
  3. 进入烧录模式,等待 UART 数据
  4. 主机发送固件数据包,Bootloader 写入 Flash

注意: UART 烧录没有握手协议,全靠 Bootloader 的时序容错。我曾经遇到过波特率偏差导致烧录到一半卡死的情况。建议用 115200 或更低波特率,稳定性更高。

UART 烧录最大的优点是硬件简单——只需要 TX、RX、GND 三根线。但缺点也很明显:速度慢,一般不超过 1Mbps,而且没有调试功能。

2.4 SPI/I2C 烧录协议:芯片内部的秘密通道

SPI 和 I2C 烧录比较特殊。它们不是标准的调试接口,而是芯片厂商自己定义的私有协议。比如某些 Nordic 的蓝牙芯片,就是用 SPI 来烧录固件的。

SPI 烧录特点:

  • 全双工,速度快(可达 10MHz+)
  • 需要 CS、SCLK、MOSI、MISO 四根线
  • 通常用于烧录外部 Flash,或者芯片内部 ROM

I2C 烧录特点:

  • 半双工,速度较慢(标准模式 100kHz,快速模式 400kHz)
  • 只需要 SCL、SDA 两根线,加上地址机制
  • 适合引脚紧张的场景

避坑指南: 我曾经用 I2C 烧录一批传感器模块,结果 10 片里有 3 片烧录失败。查到最后发现是 I2C 上拉电阻阻值不对——4.7kΩ 在长线缆下信号变形严重。换成 2.2kΩ 后问题解决。

2.5 四大协议对比总表

特性 SWD JTAG UART SPI/I2C
引脚数 2 4-5 2-3 2-4
最高速度 50MHz+ 50MHz+ 1Mbps 10MHz / 400kHz
调试功能 完整 完整 无 无
批量烧录 单芯片 可级联 单芯片 可多设备
硬件复杂度 低 中 极低 低
适用场景 ARM 调试 FPGA/复杂 SoC 量产/小资源芯片 私有协议/特殊芯片

2.6 协议选择决策流程

在实际项目中怎么选?我一般按这个思路来:

  1. 先看芯片支持什么——大部分 ARM Cortex-M 芯片同时支持 SWD 和 JTAG
  2. 看 PCB 空间——引脚紧张选 SWD 或 UART,空间充裕选 JTAG
  3. 看是否需要调试——需要断点、单步调试,必须用 SWD 或 JTAG
  4. 看量产方式——批量烧录用 JTAG 级联或 UART 脱机烧录器

我的经验: 研发阶段用 SWD(方便调试),量产阶段用 UART(成本低)。如果芯片支持,我会在 PCB 上同时预留 SWD 和 UART 接口,万一 SWD 连不上,还能用 UART 救砖。

2.7 协议架构关系图

下面这张图展示了四种协议在烧录流程中的位置和关系:

烧录协议架构关系图 烧录协议架构关系图 烧录主机(PC/编程器) SWD 协议 JTAG 协议 UART 协议 SPI/I2C 协议 目标芯片(MCU/FPGA/SoC) 协议选择要点 • SWD/JTAG:支持在线调试,适合研发阶段 • UART:硬件简单,适合量产和救砖 • SPI/I2C:芯片私有协议,适合特殊场景 • 实际项目中常混合使用,互为备份

2.8 实际项目中的协议选择建议

最后总结一下我的实战经验:

  • 研发调试: 首选 SWD,线少、速度快、调试功能完整。如果芯片是 FPGA 或复杂 SoC,用 JTAG。
  • 小批量生产: 用 SWD 或 JTAG 配合离线编程器,稳定可靠。
  • 大批量量产: 用 UART 烧录,配合治具和自动化脚本,成本最低。
  • 特殊芯片: 比如蓝牙芯片、传感器模块,按厂商要求用 SPI 或 I2C。

重要提醒: 不管用哪种协议,一定要在 PCB 上预留测试点。我吃过这个亏——有一批板子没留 SWD 测试点,结果 Bootloader 刷坏了,只能飞线,那叫一个痛苦。