2、硬件接口基础:UART、SPI、I2C、JTAG接口介绍与识别

拿到一个陌生的IoT设备,第一件事是什么?我个人习惯是先看PCB,找接口。说白了,固件就藏在芯片里,而接口就是通往芯片的门。你连门都找不到,还谈什么提取?

这一章,我们来聊聊最常见的四种硬件接口:UART、SPI、I2C和JTAG。它们各有各的脾气,也各有各的用途。我会结合自己踩过的坑,告诉你如何快速识别它们。

核心观点:硬件接口是固件提取的物理入口。学会识别接口,比学会焊接更重要。焊错了可以重焊,认错了可能直接烧芯片。

硬件接口知识体系 IoT硬件接口 UART SPI I2C JTAG 异步串行 TX / RX / GND 同步串行 MOSI / MISO / CLK / CS 同步串行 SDA / SCL 调试接口 TMS / TCK / TDI / TDO → 控制台输出 → 固件提取首选 → Flash读写 → 高速数据传输 → 传感器通信 → 低速配置 → 调试与编程 → 全芯片控制

2.1 UART — 最亲密的伙伴

UART,全称通用异步收发传输器。名字挺长,但说白了就是串口。这是我最常用的接口,没有之一。为什么?因为它简单、可靠,而且几乎所有芯片都带。

UART只需要三根线:TX(发送)、RX(接收)、GND(地)。注意,TX和RX要交叉连接——设备的TX接你的RX,设备的RX接你的TX。这个坑我刚开始也踩过,焊了半天发现没数据,结果是线接反了。

识别技巧:在PCB上找排针或测试点,用万用表量电压。UART的TX引脚在空闲时通常保持高电平(3.3V或1.8V)。如果发现一个引脚在设备启动时电压有跳变,那八成就是TX。

波特率怎么确定?我个人习惯从115200开始试,不行就降到57600、38400、19200。大部分IoT设备用115200或57600。你想想看,厂家也不会用太冷门的波特率,毕竟要方便生产测试。

# 用screen连接UART(Linux/Mac)
screen /dev/ttyUSB0 115200

# 用minicom
minicom -D /dev/ttyUSB0 -b 115200

# 如果没反应,换个波特率试试
screen /dev/ttyUSB0 57600

注意:UART的电压等级!3.3V的设备接5V的USB转串口模块,可能会烧芯片。我建议用带电平转换的模块,或者先查芯片手册确认电压。

2.2 SPI — 速度担当

SPI(串行外设接口)是同步通信,比UART快得多。它需要四根线:MOSI(主出从入)、MISO(主入从出)、SCLK(时钟)、CS(片选)。

SPI在IoT设备里主要用来连接Flash芯片。你想提取固件?很多时候就是通过SPI把Flash里的数据读出来。我记得有一次,一个设备的UART被禁用了,控制台死活不出来。后来发现它的Flash挂在SPI总线上,直接飞线读Flash,固件就到手了。

识别SPI接口有个小窍门:找排阻。SPI的时钟线SCLK旁边通常有上拉电阻,而且CS引脚在空闲时是高电平。用逻辑分析仪抓一下,看到有规律的时钟信号,基本就是SPI没跑了。

信号 颜色习惯 说明
MOSI 橙色 主机输出,从机输入
MISO 黄色 主机输入,从机输出
SCLK 绿色 时钟信号,由主机产生
CS 蓝色 片选,低电平有效

实战经验:用SPI读Flash时,先发0x9F(读ID指令),看返回的数据对不对。如果返回0xEF 0x40 0x18,那就是Winbond的W25Q128。确认芯片型号后再发0x03(读数据指令),固件就出来了。

2.3 I2C — 低调的传感器总线

I2C(集成电路总线)只有两根线:SDA(数据线)和SCL(时钟线)。它用地址来区分设备,一根总线上可以挂几十个从机。

I2C的速度比SPI慢,但胜在引脚少。IoT设备里,传感器、EEPROM、RTC时钟这些低速设备通常挂在I2C上。提取固件时,I2C不是首选——它太慢了,读个几MB的固件要等半天。但有时候,设备的配置信息、密钥、校准参数会存在I2C的EEPROM里,这些信息对逆向分析很有价值。

识别I2C接口也不难。SDA和SCL在空闲时都是高电平(通过上拉电阻拉到VCC)。用示波器看,I2C的波形有独特的起始条件(SCL高电平时SDA从高变低)和停止条件(SCL高电平时SDA从低变高)。

小技巧:如果你不确定一个测试点是I2C还是GPIO,可以用逻辑分析仪抓一下。I2C的通信有固定的帧格式:先发设备地址(7位或10位),再发读写位,然后才是数据。看到这种规律,基本就是I2C了。

2.4 JTAG — 调试界的瑞士军刀

JTAG(联合测试行动组)接口是调试和测试用的。它需要四根线:TMS(模式选择)、TCK(时钟)、TDI(数据输入)、TDO(数据输出)。有些设备还有TRST(复位)和SRST(系统复位)。

JTAG的厉害之处在于,它可以直接控制CPU,读写内存和外设。换句话说,只要接上JTAG,整个芯片都在你掌控之中。固件提取?直接读Flash区域就行,甚至可以在芯片运行时把固件dump出来。

但是,JTAG接口通常被厂家锁了。我遇到过很多设备,JTAG引脚是焊着的,但连上去没反应——要么是熔丝烧断了,要么是芯片的调试接口被禁用了。这时候别灰心,试试暴力破解JTAG的IR长度和IDCODE,有时候能撞开。

警告:JTAG操作有风险。我曾经在调试一个路由器时,不小心把CPU的调试寄存器写错了,导致芯片直接死机。重启都没用,最后只能换芯片。所以,操作JTAG之前,一定要备份原始状态。

2.5 接口识别速查表

为了方便你快速判断,我整理了一个速查表。拿到PCB后,对着这个表看,基本不会认错。

接口 引脚数 关键信号 空闲电平 主要用途
UART 3-4 TX, RX, GND TX高电平 控制台、日志输出
SPI 4-6 MOSI, MISO, SCLK, CS CS高电平 Flash读写、高速外设
I2C 2-4 SDA, SCL 均为高电平 传感器、EEPROM
JTAG 4-6 TMS, TCK, TDI, TDO TCK固定频率 调试、编程、固件提取

2.6 实战:如何快速定位接口

好了,理论讲完了。咱们来点实际的。假设你拿到一块陌生的PCB,怎么快速找到这些接口?

  1. 目视检查:先看PCB边缘有没有排针、排母或者裸露的焊盘。很多开发板会把接口引出来。
  2. 追电路:找到主芯片,看它周围的电阻和电容。UART的TX和RX通常会串一个小电阻(比如22Ω或33Ω)。SPI的CS引脚会有上拉电阻。
  3. 量电压:上电后用万用表量。UART的TX在启动时有电压跳变。I2C的SDA和SCL都是高电平。SPI的CS在空闲时是高电平。
  4. 用逻辑分析仪:这是最靠谱的方法。把可疑的引脚都夹上,抓一段波形。UART的波形是异步的,SPI有时钟信号,I2C有起始和停止条件,JTAG有状态机跳变。

我的习惯:先找UART,因为最简单。如果UART没输出,再找SPI读Flash。如果SPI也读不到(比如Flash被加密了),最后才考虑JTAG。JTAG是最后的手段,因为风险高,而且很多设备已经锁了。

嗯,这一章的内容就到这里。接口识别是固件提取的第一步,也是最关键的一步。你想想看,如果连接口都认错了,后面的工作全是白费。所以,多练、多看、多量,慢慢就有感觉了。