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去接,那不是杀鸡用牛刀吗?选对协议,事半功倍。
好了,这一章就到这里。下一章咱们聊聊加密狗和主控之间的具体握手流程——那才是真正有意思的地方。