第二章:常见协议概览——I2C、SPI、UART、GPIO协议特点对比与适用场景

各位同学,大家好。我是你们的老朋友,一个在芯片设计坑里摸爬滚打十几年的工程师。今天咱们来聊聊多协议接口复用与切换设计里最基础、也最关键的一环——搞清楚你手头这几个“兵”到底有什么本事。

I2C、SPI、UART、GPIO,这四个名字做硬件的没人不认识。但说实话,我见过不少工程师,项目做完了,对这几个协议的底层差异还是一知半解。结果呢?接口选型拍脑袋,时序约束乱写,最后板子调不通,回头找我救火。嗯,这种事我经历得多了。

所以今天,咱们不搞虚的。我就用最直白的话,把这四个协议的老底儿给你翻出来。你想想看,只有真正理解了它们各自的脾气秉性,你才能在设计复用与切换电路时,做到心中有数,下笔有神。

2.1 先聊聊GPIO——最朴实,但最灵活

GPIO,通用输入输出。说白了,它就是芯片引脚最原始的状态。你可以把它拉高,拉低,或者读它的电平。

特点:

  • 单线通信:一根线,一个方向(输入或输出)。想双向?可以,但得靠软件切换方向,硬件上还是单根。
  • 速度极慢:完全由软件控制,CPU轮询或定时器翻转。我见过有人用GPIO模拟出1MHz的波形,那已经是极限了,而且CPU基本干不了别的。
  • 无协议:没有时钟,没有数据格式。你说它是啥就是啥。

适用场景:

  • 按键检测、LED控制、中断信号输入。
  • 片选信号(CS)、复位信号(RST)等控制类信号。
  • 模拟低速协议(比如用GPIO模拟I2C,我早期项目就这么干过,为了省一个I2C控制器)。

我的经验: 我个人习惯,在设计复用接口时,GPIO永远是最底层的“万能备胎”。当其他协议都忙不过来时,用GPIO去模拟一个简单的握手信号,往往能解决大问题。但记住,别用它传大量数据,CPU会哭的。

2.2 再来看UART——异步通信的老将

UART,通用异步收发器。它不需要时钟线,靠的是双方约定好的波特率。

特点:

  • 双线全双工:TX发,RX收,可以同时进行。
  • 异步:没有时钟线,靠起始位和停止位同步。这就意味着,双方晶振必须足够准,否则就会丢数据。
  • 数据格式固定:起始位(1) + 数据位(5~8) + 校验位(可选) + 停止位(1~2)。
  • 点对点:只能两个设备之间通信,不能多机挂载(除非用RS485扩展)。
特性 UART
线数 2根(TX, RX)
时钟 无(异步)
速度 典型115200bps,最高可达几Mbps
拓扑 点对点
硬件复杂度

避坑指南: 我曾经在一个项目中,UART的波特率设置成了115200,但对方的晶振精度只有±2%。结果呢?连续传几十个字节没问题,一传几百个字节就开始丢包。后来我加了个波特率自适应检测,才搞定。所以,长距离或大数据量传输时,务必考虑时钟漂移。

适用场景:

  • 调试日志输出(我最常用的)。
  • 与蓝牙模块、GPS模块、4G模块等通信。
  • 低速传感器数据采集。

2.3 接着看SPI——高速同步的王者

SPI,串行外设接口。它是我个人最喜欢用的协议之一,因为简单、快、且灵活。

特点:

  • 四线制(典型):SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
  • 同步:有独立的时钟线,速度可以做得非常高(几十MHz甚至上百MHz)。
  • 全双工:MOSI和MISO可以同时传输数据。
  • 多从机:通过不同的CS片选线,一个主机可以挂多个从机。
  • 四种模式:通过CPOL(时钟极性)和CPHA(时钟相位)组合,可以匹配不同从机的时序要求。

适用场景:

  • 高速ADC/DAC、显示屏、存储器(Flash/SRAM)、SD卡。
  • 需要高吞吐量的传感器(如摄像头、惯性测量单元)。
  • 芯片内部寄存器配置(很多芯片的配置接口就是SPI)。

我的经验: 在设计SPI复用切换时,我最头疼的就是时序匹配。不同从机可能要求不同的CPOL/CPHA模式。你想想看,如果主机只能输出一种模式,那切换从机时就得重新配置SPI控制器,这中间就会有空档期。所以,我一般会在硬件上预留一个“模式选择”寄存器,让软件可以动态调整。

2.4 最后说I2C——两线制的多面手

I2C,集成电路总线。它用两根线(SDA数据线,SCL时钟线)实现了多主多从的通信,而且每个设备都有唯一的地址。

特点:

  • 两线制:SDA和SCL,都是开漏输出,需要上拉电阻。
  • 同步:有时钟线,但时钟是由主机产生的。
  • 半双工:SDA线在同一时刻只能有一个方向的数据传输。
  • 多主多从:理论上可以挂载上百个设备,通过地址区分。
  • 速度较慢:标准模式100kHz,快速模式400kHz,高速模式3.4MHz。但实际应用中,超过1MHz就很容易出问题。
  • 协议复杂:有起始条件、停止条件、应答位(ACK/NACK)、从机地址、寄存器地址等。软件模拟起来比SPI麻烦。
特性 I2C SPI
线数 2根(SDA, SCL) 4根(典型)
速度 100kHz~3.4MHz 可达几十MHz
拓扑 多主多从(总线型) 一主多从(星型)
硬件复杂度 中(需要状态机处理协议)
数据方向 半双工 全双工

避坑指南: 我曾经在一个多传感器项目中,用了I2C总线挂了8个设备。结果呢?总线电容太大,SCL和SDA的上升沿变得很缓,导致通信不稳定。后来我不得不降低频率到50kHz,并且换用了更强驱动的上拉电阻。所以,挂载设备多时,一定要算总线电容,别超过400pF。

适用场景:

  • 低速传感器(温度、湿度、气压)、EEPROM、实时时钟(RTC)。
  • 芯片内部寄存器配置(很多PMIC、音频Codec都用I2C)。
  • 需要多设备挂载且引脚有限的场合。

2.5 四大协议对比总结

好了,咱们把这四个协议放在一起,做个直观的对比。你一眼就能看出它们的差异。

协议 线数 同步/异步 方向 拓扑 速度 硬件复杂度 典型应用
GPIO 1根 异步 单工 点对点 极低 极低 控制、状态
UART 2根 异步 全双工 点对点 低~中 调试、模块通信
SPI 4根 同步 全双工 一主多从 高速数据、存储
I2C 2根 同步 半双工 多主多从 低~中 传感器、配置

我的建议: 在做多协议接口复用时,你首先要问自己三个问题:

  1. 速度要求有多高? 如果超过1Mbps,直接放弃I2C,考虑SPI或UART(高速模式)。
  2. 引脚够不够用? 引脚紧张,优先考虑I2C或UART。引脚富裕,SPI是更好的选择。
  3. 需要挂多少个设备? 超过2个,I2C是天然优势。但要注意总线负载。

嗯,今天的内容就到这里。这四个协议,就像你工具箱里的四把螺丝刀。GPIO是平口,UART是十字,SPI是内六角,I2C是梅花。没有哪个绝对好,关键看你要拧什么样的螺丝。下一章,咱们就正式进入复用与切换的硬件设计,看看怎么把这些协议“揉”到一个接口里。

记住,理解协议的本质,比背时序图重要一百倍。