3、烧录协议深度解析:SWD/JTAG/SPI/I2C协议时序对比、协议开销对速度的影响

做烧录这么多年,我越来越觉得一个道理:烧录速度的瓶颈,往往不在Flash芯片本身,而在你选的协议上。协议就像一条公路——路宽、红绿灯少、收费站少,车自然跑得快。今天咱们就把SWD、JTAG、SPI、I2C这四条“路”彻底扒开看看。

3.1 四款协议的基本定位

先给个总览表,方便你快速建立印象:

协议 信号线数 典型时钟 主要用途 烧录场景
SWD 2 (SWDIO+SWCLK) 4~50 MHz ARM调试/烧录 量产烧录首选
JTAG 5 (TMS+TCK+TDI+TDO+nTRST) 10~100 MHz 芯片调试/边界扫描 多核/FPGA烧录
SPI 4 (MOSI+MISO+SCK+CS) 20~100 MHz 存储器/传感器通信 外挂Flash烧录
I2C 2 (SDA+SCL) 0.1~3.4 MHz 低速外设配置 小容量/低引脚烧录

看到I2C那可怜的时钟上限了吗?3.4 MHz已经是极限了。说实话,用I2C做烧录,基本等于放弃治疗。除非你遇到那种只有I2C接口的专用芯片,否则我建议你直接跳过。

3.2 协议时序深度对比

时序这东西,光看文字描述容易晕。我画了一张对比图,把四种协议在一个烧录周期内的行为画出来,你一看就明白。

核心观点:烧录速度 = 时钟频率 × 每时钟有效数据位 ÷ 协议开销系数。协议开销系数越大,实际速度越慢。

四种烧录协议时序对比(单次烧录周期) SWD SWCLK SWDIO: 请求(8bit) + 数据(32bit) + 奇偶校验(1bit) + 等待(3bit) = 44bit 协议开销: 请求+校验+等待 ≈ 12bit/周期 JTAG TCK TDI/TDO: 指令(8bit) + 数据(32bit) + 空闲周期(2bit) = 42bit 协议开销: 指令+空闲 ≈ 10bit/周期 SPI SCK MOSI: 命令(8bit) + 地址(24bit) + 数据(32bit) = 64bit 协议开销: 命令+地址 ≈ 32bit/周期 I2C SCL SDA: 起始(1bit) + 地址(7bit) + ACK(1bit) + 数据(32bit) + ACK(1bit) + 停止(1bit) = 43bit 协议开销: 起始+地址+ACK+停止 ≈ 11bit/周期 说明:以上为单次32bit数据写入的典型时序。实际烧录时,SPI需要额外发送地址,而SWD/JTAG通过状态机自动递增地址。

这张图里有个关键信息:SPI虽然时钟高,但每次写数据都要重新发命令和地址。而SWD和JTAG有自动地址递增机制,连续烧录时开销小得多。我遇到过有人用SPI烧录8MB Flash,结果速度还不如SWD的一半——就是被地址开销拖死的。

3.3 协议开销对速度的影响

咱们来算笔账。假设你要烧录1MB数据,Flash写入速度是10MB/s,看看各协议的实际表现:

协议 时钟频率 每时钟有效位 协议开销系数 理论传输速率 实际烧录速率
SWD 50 MHz 1 bit 1.27x 50 Mbps ~4.9 MB/s
JTAG 50 MHz 2 bit (全双工) 1.31x 100 Mbps ~9.5 MB/s
SPI 50 MHz 1 bit 2.0x 50 Mbps ~3.1 MB/s
I2C 3.4 MHz 1 bit 1.34x 3.4 Mbps ~0.3 MB/s

我的经验:JTAG的全双工能力在烧录时其实用不太上——因为烧录主要是写入,读回校验是次要的。但如果你需要边烧录边校验,JTAG的TDO可以同时回读,速度优势就出来了。

你可能会问:为什么SPI开销系数这么高?原因有两个:

  1. 地址必须每次发送——SPI没有地址自动递增机制,连续写32字节就要发32次地址
  2. 命令/地址/数据分离——不像SWD那样把控制信息嵌在数据流里

我记得有一次帮客户优化产线,他们用SPI烧录一颗16MB的Nor Flash,单颗要45秒。我改成SWD后,直接降到12秒。客户当场就愣住了——换协议比换芯片管用多了。

3.4 各协议的避坑指南

SWD:小心“伪高速”

SWD在50MHz以上时,信号反射和串扰会明显增加。我建议:

  • 线长控制在15cm以内
  • SWDIO和SWCLK不要平行走线超过5cm
  • 如果目标芯片支持,开启SWD的“快速模式”(Fast Mode)

我曾经在一个项目里把SWD时钟设到80MHz,结果10颗芯片里有3颗烧录失败。排查了两天才发现是线缆寄生电容太大。后来降到40MHz,问题全消失了。别盲目追高频,稳定才是量产的第一要素。

JTAG:别被“5线”吓到

JTAG虽然线多,但好处是:

  • 可以同时烧录多个芯片(菊花链)
  • 支持边界扫描,方便检测焊接质量
  • 全双工,适合大数据量烧录

但要注意:nTRST不是必须的。很多烧录器只用TMS+TCK+TDI+TDO四线就能工作。少一根线,少一个故障点。

SPI:地址模式要选对

SPI烧录外挂Flash时,地址模式直接影响速度:

  • 24位地址:最大支持16MB,适合小容量
  • 32位地址:支持更大容量,但每次多传8bit

如果你的Flash支持“Quad SPI”或“Dual SPI”,记得开启——每时钟传4位和传1位,速度差4倍。

I2C:只适合小数据量

I2C的ACK机制是硬伤——每发一个字节就要等对方回应。我建议:

  • 只用于配置寄存器或烧录小容量EEPROM(256KB以下)
  • 时钟尽量用400kHz(Fast Mode),别用100kHz
  • 如果芯片支持“多字节写”,尽量用,减少起始/停止开销

3.5 实际选型建议

说了这么多,到底怎么选?我总结了一个决策流程:

  1. 看接口——目标芯片支持哪些协议?优先选SWD或JTAG
  2. 看容量——1MB以下,SWD足够;1MB以上,考虑JTAG或SPI
  3. 看产线——多工位并行烧录,JTAG菊花链更合适
  4. 看成本——I2C虽然慢,但线少、接口简单,适合低端产品

我的个人习惯:只要目标芯片支持SWD,我首选SWD。原因很简单——线少、稳定、工具链成熟。JTAG留给FPGA和多核ARM。SPI只用来烧录外挂Flash。I2C?嗯,除非客户指定,否则我尽量不用。

协议选对了,烧录速度优化就成功了一半。下一层我们要聊的是烧录器硬件选型——选对了协议,再配上合适的烧录器,速度才能拉满。