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 协议时序深度对比
时序这东西,光看文字描述容易晕。我画了一张对比图,把四种协议在一个烧录周期内的行为画出来,你一看就明白。
核心观点:烧录速度 = 时钟频率 × 每时钟有效数据位 ÷ 协议开销系数。协议开销系数越大,实际速度越慢。
这张图里有个关键信息: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开销系数这么高?原因有两个:
- 地址必须每次发送——SPI没有地址自动递增机制,连续写32字节就要发32次地址
- 命令/地址/数据分离——不像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 实际选型建议
说了这么多,到底怎么选?我总结了一个决策流程:
- 看接口——目标芯片支持哪些协议?优先选SWD或JTAG
- 看容量——1MB以下,SWD足够;1MB以上,考虑JTAG或SPI
- 看产线——多工位并行烧录,JTAG菊花链更合适
- 看成本——I2C虽然慢,但线少、接口简单,适合低端产品
我的个人习惯:只要目标芯片支持SWD,我首选SWD。原因很简单——线少、稳定、工具链成熟。JTAG留给FPGA和多核ARM。SPI只用来烧录外挂Flash。I2C?嗯,除非客户指定,否则我尽量不用。
协议选对了,烧录速度优化就成功了一半。下一层我们要聊的是烧录器硬件选型——选对了协议,再配上合适的烧录器,速度才能拉满。