1、总线基础概念:I2C、SPI、UART、USB 总线协议概述与对比

做机顶盒驱动开发,打交道最多的就是这四种总线。我刚开始接触时也觉得头大,但后来发现,只要搞懂它们的核心差异,选型就变得很简单。今天咱们就把 I2C、SPI、UART、USB 这四位老兄请出来,好好聊聊它们各自的本事。

1.1 为什么需要这么多总线?

你想想看,机顶盒里既有温度传感器这种慢速设备,又有摄像头这种高速设备,还有调试串口这种随时要用的接口。一种总线不可能通吃所有场景。所以芯片设计者就搞出了不同性格的总线——有的省引脚,有的跑得快,有的简单可靠。

我个人习惯,拿到一个新板子,先看原理图上用了哪些总线。这能帮你快速判断外设的类型和性能需求。

1.2 I2C 总线——两线制的老黄牛

I2C 是飞利浦(现在的 NXP)搞出来的。它只用两根线:SCL(时钟)和 SDA(数据)。

核心特点:

  • 半双工:同一时刻只能一个方向传数据
  • 多主多从:总线上可以挂多个设备,每个设备有唯一地址
  • 速率:标准模式 100kHz,快速模式 400kHz,高速模式 3.4MHz
  • 距离:一般几米以内,线长了容易出问题

我在项目中遇到过一个问题:I2C 总线挂了好几个传感器,结果某个传感器把时钟线拉低了,整条总线都卡死了。后来加了 I2C 总线恢复机制,才搞定。

典型应用场景: EEPROM、温度传感器、音频编解码器、HDMI 的 EDID 读取

避坑指南: 我曾经因为上拉电阻选太小,导致 I2C 信号边沿太陡,产生了 EMI 干扰。一般 4.7kΩ 是个安全起点,具体要看总线电容。

1.3 SPI 总线——四线制的快马

SPI 是 Motorola 搞的。它用四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。

核心特点:

  • 全双工:可以同时收发数据
  • 一主多从:每个从设备需要一根独立的片选线
  • 速率:轻松跑到几十 MHz,甚至上百 MHz
  • 无地址:靠片选信号选择设备

说白了,SPI 就是 I2C 的升级版——速度快、全双工,但代价是多用了两根线。而且从设备多了,片选引脚也得多。

我记得有一次调试 SPI Flash,死活读不到数据。查了半天,发现是 SPI 的极性(CPOL)和相位(CPHA)配置错了。嗯,这里要注意,主设备和从设备的模式必须一致。

典型应用场景: SPI Flash、SD 卡、LCD 显示屏、ADC/DAC

注意事项: SPI 没有标准的应答机制。你发出去的数据,从设备收没收到,它不会主动告诉你。所以很多 SPI 协议会在数据帧里加校验。

1.4 UART 总线——最朴实的串口

UART 是通用异步收发器。它只需要两根线:TX(发送)和 RX(接收)。

核心特点:

  • 全双工:TX 和 RX 独立工作
  • 异步:没有时钟线,靠波特率同步
  • 点对点:只能两个设备通信
  • 速率:常见 9600、115200 bps,最高也就几 Mbps

UART 是调试利器。我每次调驱动,第一件事就是先把串口打印搞通。没有它,你就像瞎子摸象。

为什么会这样?因为 UART 简单到几乎没有协议——起始位、数据位、校验位、停止位,就这些。任何 MCU 都支持,任何操作系统都有驱动。

典型应用场景: 调试控制台、GPS 模块、蓝牙模块、RS232/RS485 转换

避坑指南: 我曾经把 TX 和 RX 接反了,折腾了一下午。后来养成习惯,接好线先用逻辑分析仪看波形,确认有数据再往下走。

1.5 USB 总线——万能的外设接口

USB 是通用串行总线。它用四根线:VBUS(电源)、D+(数据正)、D-(数据负)、GND(地)。

核心特点:

  • 半双工:但通过差分信号和协议调度实现高效传输
  • 主从结构:主机(Host)管理所有通信
  • 速率:USB 1.1 的 12Mbps 到 USB 3.0 的 5Gbps
  • 热插拔:即插即用,自动枚举

USB 的协议栈是最复杂的。它分物理层、协议层、传输层、设备层。你想想看,一个 U 盘插上去,主机要经历复位、枚举、配置、设置地址等一系列操作,才能开始读写。

我刚开始做 USB 驱动时,被描述符搞得晕头转向。设备描述符、配置描述符、接口描述符、端点描述符……一层套一层。后来画了个树状图,才理清楚。

典型应用场景: U 盘、鼠标键盘、摄像头、WiFi 网卡、USB 转串口

注意事项: USB 的电源管理很讲究。设备挂起、远程唤醒、选择性挂起,这些状态机搞错一个,设备就可能莫名其妙掉线。

1.6 四大总线对比一览

下面这张表,我建议你收藏。选型时拿出来看一眼,基本不会选错。

特性 I2C SPI UART USB
信号线数 2(SCL, SDA) 4+(SCLK, MOSI, MISO, CS) 2(TX, RX) 4(VBUS, D+, D-, GND)
通信方式 半双工 全双工 全双工 半双工
拓扑结构 多主多从 一主多从 点对点 主从(Host-Device)
最大速率 3.4 MHz(高速模式) 上百 MHz 几 Mbps 5 Gbps(USB 3.0)
传输距离 几米 几米 十几米(RS232) 5米(USB 2.0)
协议复杂度 极低
典型功耗
成本 极低

1.7 选型建议

做机顶盒驱动开发,选总线其实有套路:

  • 控制类设备(传感器、GPIO 扩展):用 I2C,省引脚
  • 数据类设备(Flash、LCD):用 SPI,速度快
  • 调试接口:用 UART,简单可靠
  • 复杂外设(U 盘、摄像头):用 USB,生态好

我个人经验是:能走 I2C 就别走 SPI,能走 SPI 就别走 USB。总线越简单,出问题的概率越低。但如果你需要高速传输,那就别犹豫,直接上 USB。

最后说一句: 不管用哪种总线,逻辑分析仪都是你的好伙伴。我每次调总线驱动,都会先抓波形确认物理层没问题,再去看协议层。这个习惯帮我省了无数时间。