烧录协议基础:从物理层到实战选型

做量产烧录这些年,我最大的体会就是——协议选对了,后面能省一半的折腾。你想想看,产线上几百台设备同时跑,如果协议不稳定或者速度跟不上,那可不是改几行代码能解决的。

这一章,咱们就把几种主流烧录协议掰开揉碎讲清楚。我会结合自己踩过的坑,帮你建立一套「什么场景该用什么协议」的判断力。

UART 烧录协议详解

UART 烧录,说白了就是通过串口把固件灌进芯片。它可能是最古老、也最通用的方式了。我最早接触量产烧录时,用的就是 UART。

为什么 UART 能烧录?

芯片出厂时,ROM 里有一段固化代码(叫 Bootloader)。上电后,它先检查某个引脚的电平——比如拉低就进入烧录模式。然后通过 UART 接收数据,写入 Flash。

这个过程其实很简单:

  1. 芯片上电,Bootloader 启动
  2. 检测烧录触发条件(引脚电平/无有效程序)
  3. 通过 UART 接收握手信号
  4. 按协议格式接收固件数据
  5. 写入 Flash,校验,完成

核心参数:波特率、数据位(8)、停止位(1)、校验位(无/奇/偶)。量产时我建议用 115200 或 460800,再高容易丢包。

我在项目中遇到过一件事:某款芯片的 Bootloader 有 bug,波特率超过 230400 就会随机丢字节。排查了整整两天,最后发现是芯片 errata 里写着呢……从那以后,我养成了先看勘误表的习惯。

UART 烧录的优缺点

优点缺点
引脚少(TX/RX/GND 三根线)速度慢(通常 < 1MB/s)
几乎所有 MCU 都支持无硬件流控,长线易受干扰
协议简单,容易实现无校验机制(需软件层加)
调试方便,串口工具遍地都是不适合大容量固件(> 1MB)

我的建议:如果固件小于 512KB,产线节拍要求不高,UART 是最省成本的选择。线缆用屏蔽双绞线,长度控制在 1.5 米以内。

SPI / I2C 烧录协议对比

这两种协议在烧录场景里,通常不是直接烧 MCU,而是烧外挂的 Flash 或 EEPROM。说白了,就是「离线烧录」或「在线编程」时用的。

SPI 烧录

SPI 是四线制:SCK、MOSI、MISO、CS。全双工,速度快。我见过最快的 SPI Flash 烧录器能跑到 80MHz,每秒灌 10MB 数据。

SPI 烧录的典型流程:

  • 发写使能命令(0x06)
  • 发扇区擦除命令(0x20)
  • 等待擦除完成(读状态寄存器)
  • 发页编程命令(0x02)+ 地址 + 数据
  • 等待编程完成
  • 读回校验
// SPI Flash 页写入示例(伪代码)
void spi_flash_page_write(uint32_t addr, uint8_t *data, uint16_t len) {
    spi_cs_low();
    spi_send_byte(0x06);          // 写使能
    spi_cs_high();
    
    spi_cs_low();
    spi_send_byte(0x02);          // 页编程命令
    spi_send_byte((addr >> 16) & 0xFF);  // 地址高字节
    spi_send_byte((addr >> 8) & 0xFF);   // 地址中字节
    spi_send_byte(addr & 0xFF);           // 地址低字节
    for (uint16_t i = 0; i < len; i++) {
        spi_send_byte(data[i]);
    }
    spi_cs_high();
    
    // 等待忙状态结束
    while (spi_flash_is_busy());
}

I2C 烧录

I2C 是两线制:SCL、SDA。半双工,速度慢(标准模式 100kHz,快速模式 400kHz)。但它有个好处——多设备共用总线。

我记得有个项目,一块板子上挂了 4 个 EEPROM,用 I2C 烧录,一条总线搞定。要是用 SPI,得 4 个 CS 引脚,麻烦不少。

直接对比

对比项SPII2C
引脚数4(最少 3)2
速度最高 80MHz+最高 3.4MHz(超快速模式)
通信方式全双工半双工
多设备支持需独立片选地址寻址,总线共享
协议复杂度简单中等(有起始/停止/应答)
烧录典型速率2~10 MB/s50~400 KB/s
适用场景大容量 Flash小容量 EEPROM/配置芯片

避坑指南:我曾经在产线上遇到过 I2C 烧录时总线被锁死的情况——某个从机把 SDA 拉低了不释放。后来所有烧录脚本里都加了「总线恢复」步骤:先发 9 个时钟脉冲,再发 STOP 信号。这个习惯我一直保留到现在。

JTAG / SWD 烧录原理

JTAG 和 SWD 是调试接口,但量产烧录时也经常用。尤其是 ARM 内核的芯片,SWD 几乎成了标配。

JTAG

JTAG 是 IEEE 1149.1 标准,最初用于 PCB 边界扫描测试。它有 5 根线:TCK、TMS、TDI、TDO、TRST(可选)。

JTAG 的核心是 TAP(测试访问端口)状态机。通过 TMS 在不同时钟沿切换状态,可以进入「Shift-DR」或「Shift-IR」模式,然后通过 TDI/TDO 移位数据。

烧录时,我们利用 JTAG 的 DAP(调试访问端口) 来读写芯片内存和寄存器。说白了,就是通过 JTAG 把烧录算法加载到芯片 RAM 里,然后让它自己写 Flash。

SWD

SWD 是 ARM 公司搞的简化版,只有两根线:SWDIO(数据)和 SWCLK(时钟)。它用 包序列 代替了 JTAG 的状态机,效率更高。

SWD 的包格式很简单:

  • 起始位(1 bit)
  • AP/DP 选择(1 bit)
  • 读写操作(1 bit)
  • 地址(2 bits)
  • 数据(32 bits)
  • 校验位(1 bit)
  • 应答(3 bits)

你看,一个包才 41 个 bit,比 JTAG 的移位操作快多了。

关键区别:JTAG 可以同时调试多核(菊花链),SWD 只能单核。但量产烧录通常只烧一个芯片,SWD 的 2 线优势非常明显。

三种协议选型指南

我整理了一张图,帮你快速决策:

烧录协议选型决策图 烧录协议选型 烧 MCU 内部 Flash 烧外部存储芯片 UART Bootloader SWD / JTAG SPI Flash I2C EEPROM 固件 < 512KB 产线节拍宽松 成本敏感 固件 > 512KB 需要调试功能 ARM Cortex 内核 大容量存储 高速烧录需求 独立片选可用 小容量配置数据 多设备共享总线 引脚受限 选型口诀: 小固件用 UART,大固件用 SWD;外挂存储看容量,SPI 快 I2C 省线

嗯,这张图基本覆盖了 90% 的场景。剩下 10% 是特殊情况,比如用 USB 烧录、用 CAN 烧录,那些咱们后面章节再聊。

实际产线中的协议选择

我最后说一个真实案例。之前做智能家居网关,用的是 ESP32 芯片,固件 1.2MB。一开始用 UART 烧录,波特率 921600,单台烧录要 18 秒。产线一天 2000 台,光烧录就占 10 个小时。

后来改成 SWD 烧录,速度直接拉到 10MHz,单台降到 3 秒。而且 SWD 还能顺便读芯片 ID、校验 Flash 内容,可靠性高了不少。

所以我的建议是:别在协议上省钱。如果量产后发现烧录是瓶颈,改协议的成本远高于一开始就选对。

小技巧:设计电路板时,把 SWD 接口(SWDIO、SWCLK、GND、VCC)用 4pin 排针引出来。哪怕你暂时用 UART 烧录,也留个 SWD 接口。万一要改,焊几根线就行,不用重新 layout。