2、通信协议基础:串行与并行、同步与异步、常见接口对比

各位同学好,我是你们的老朋友。今天咱们聊聊通信协议的基础。这部分内容,说白了就是加密狗和主控芯片之间怎么“说话”的底层规则。

我刚开始做嵌入式那会儿,总觉得协议这东西太抽象。后来踩了几个坑才明白——通信协议选不对,后面全白费。咱们今天就把这些基础掰开揉碎了讲清楚。

2.1 串行通信 vs 并行通信

先问个问题:你有一堆数据要传给对方,是一次性全发过去好,还是一个一个发好?

并行通信,就是一次性发多位数据。比如8位并行,一次发8个bit。速度快,但占用的引脚也多。我记得早年做打印机接口,用的就是并行,那线缆粗得跟小拇指似的。

串行通信,则是一条线,一位一位地传。速度看似慢,但引脚少,抗干扰能力强。现在的加密狗,绝大多数都用串行。

我的经验:在加密狗这种小体积设备上,引脚是金贵的。串行通信虽然“看起来慢”,但实际速率足够用。我曾经在一个项目里硬要用并行,结果PCB布线布到崩溃——后来全改成串行了。

对比项 串行通信 并行通信
传输线数量 1条(或差分对) 8条、16条等
传输速率 单线速率高,总带宽可能更高 单次传输数据量大,但易受干扰
抗干扰能力 强(尤其差分信号) 弱(线间串扰严重)
适用场景 远距离、高速、引脚受限 短距离、高速、引脚充足

小提示:现在USB 3.0、PCIe这些高速接口,本质上都是串行。并行通信在高速场景下基本被淘汰了——你想想看,8根线同时翻转,那电磁干扰得多大?

2.2 同步通信 vs 异步通信

这个区分,说白了就是“有没有时钟线”。

同步通信,发送方和接收方共用一根时钟线。时钟一来,数据就传。典型的例子是I2C和SPI。好处是时序清晰,不容易出错。坏处是多了一根线。

异步通信,没有时钟线。双方得事先约定好波特率(比如9600、115200)。靠起始位和停止位来同步。UART就是典型。

我个人的习惯是:如果通信距离短、速率要求高,优先选同步。如果线缆长、或者只有两根线可用,那就异步。

避坑指南:我曾经在一个加密狗项目里,用了异步通信,结果主控和加密狗的晶振精度不一样。波特率对不上,数据全是乱码。后来加了自动波特率检测才搞定。所以——异步通信一定要考虑时钟误差!

2.3 常见通信接口对比

加密狗和主控之间,最常用的就是这四种:I2C、SPI、UART、USB。咱们一个一个说。

2.3.1 I2C(Inter-Integrated Circuit)

I2C只有两根线:SCL(时钟)和SDA(数据)。支持多主多从,每个设备有唯一地址。速率标准模式100kHz,快速模式400kHz,高速模式能到3.4MHz。

我特别喜欢I2C的一点是:它只需要两个引脚就能挂一堆设备。加密狗里经常用I2C来挂EEPROM或者安全芯片。

// I2C 写一个字节到从设备
void i2c_write_byte(uint8_t dev_addr, uint8_t reg, uint8_t data) {
    i2c_start();
    i2c_send_byte(dev_addr << 1 | 0); // 写操作
    i2c_send_byte(reg);                // 寄存器地址
    i2c_send_byte(data);               // 数据
    i2c_stop();
}

注意:I2C是开漏输出,需要上拉电阻。我见过有人忘了加上拉电阻,结果通信死活不通——查了半天才发现。

2.3.2 SPI(Serial Peripheral Interface)

SPI有四根线:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。全双工,速度可以跑到几十MHz。

SPI的优势是速度快、协议简单。缺点是需要4根线,而且每个从设备需要一个单独的片选引脚。

我记得有一次做加密狗,主控和加密狗之间需要高速传输大量数据。I2C太慢,UART不够可靠,最后选了SPI。速率跑到20MHz,稳得很。

// SPI 读写一个字节
uint8_t spi_transfer_byte(uint8_t data) {
    SPDR = data;          // 发送数据
    while(!(SPSR & (1<<SPIF))); // 等待传输完成
    return SPDR;          // 返回接收的数据
}

2.3.3 UART(Universal Asynchronous Receiver/Transmitter)

UART只需要两根线:TX和RX。异步通信,没有时钟线。速率靠波特率约定。

UART最大的优点是简单。随便一个单片机都有UART。缺点也很明显:只能点对点通信,而且速率受限于波特率精度。

我的建议:如果加密狗和主控之间只是传一些配置信息、状态查询,UART完全够用。115200波特率,一秒钟能传约11.5KB,够用了。

2.3.4 USB(Universal Serial Bus)

USB就复杂多了。它有D+和D-两根差分信号线,加上Vbus和GND。支持热插拔、即插即用、高速传输(USB 2.0是480Mbps,USB 3.0是5Gbps)。

加密狗用USB,最大的好处是通用性。插到电脑上就能用,不需要额外驱动(HID设备)。但协议栈复杂,开发难度大。

我做过一个USB加密狗项目,光是枚举过程就折腾了两周。USB的协议层次太多了——令牌包、数据包、握手包,一个不对就枚举失败。

接口 线数 同步/异步 最大速率 典型用途
I2C 2 同步 3.4MHz 传感器、EEPROM、安全芯片
SPI 4 同步 几十MHz 高速数据、Flash、加密芯片
UART 2 异步 几Mbps 调试、低速通信
USB 4 异步 480Mbps/5Gbps 通用外设、加密狗

2.4 如何选择?

嗯,说了这么多,到底怎么选?我个人的经验是:

  • 引脚少、设备多 → I2C
  • 速度快、全双工 → SPI
  • 简单、调试方便 → UART
  • 通用、即插即用 → USB

加密狗这个场景,我见过最多的是I2C和USB。I2C用于内部安全芯片通信,USB用于和电脑通信。当然,也有用SPI的,看具体需求。

最后说一句:通信协议没有绝对的好坏,只有合不合适。你想想看,一个简单的温度传感器,你用USB去接,那不是杀鸡用牛刀吗?选对协议,事半功倍。

好了,这一章就到这里。下一章咱们聊聊加密狗和主控之间的具体握手流程——那才是真正有意思的地方。