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)都支持这种方式。
工作原理:
- 芯片上电后先运行 Bootloader
- Bootloader 检测特定引脚电平(比如 BOOT0 拉高)
- 进入烧录模式,等待 UART 数据
- 主机发送固件数据包,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 协议选择决策流程
在实际项目中怎么选?我一般按这个思路来:
- 先看芯片支持什么——大部分 ARM Cortex-M 芯片同时支持 SWD 和 JTAG
- 看 PCB 空间——引脚紧张选 SWD 或 UART,空间充裕选 JTAG
- 看是否需要调试——需要断点、单步调试,必须用 SWD 或 JTAG
- 看量产方式——批量烧录用 JTAG 级联或 UART 脱机烧录器
我的经验: 研发阶段用 SWD(方便调试),量产阶段用 UART(成本低)。如果芯片支持,我会在 PCB 上同时预留 SWD 和 UART 接口,万一 SWD 连不上,还能用 UART 救砖。
2.7 协议架构关系图
下面这张图展示了四种协议在烧录流程中的位置和关系:
2.8 实际项目中的协议选择建议
最后总结一下我的实战经验:
- 研发调试: 首选 SWD,线少、速度快、调试功能完整。如果芯片是 FPGA 或复杂 SoC,用 JTAG。
- 小批量生产: 用 SWD 或 JTAG 配合离线编程器,稳定可靠。
- 大批量量产: 用 UART 烧录,配合治具和自动化脚本,成本最低。
- 特殊芯片: 比如蓝牙芯片、传感器模块,按厂商要求用 SPI 或 I2C。
重要提醒: 不管用哪种协议,一定要在 PCB 上预留测试点。我吃过这个亏——有一批板子没留 SWD 测试点,结果 Bootloader 刷坏了,只能飞线,那叫一个痛苦。