第一章:同步通讯基础

1.1 什么是同步通讯?

同步通讯,说白了就是“你一句,我一句”。

我经常在课堂上问学员:你们有没有用过对讲机?对讲机通话的时候,一个人说完“over”,另一个人才能接着说。这就是同步通讯的典型场景——双方必须按照约定的节奏,轮流发言。

在嵌入式系统里,同步通讯指的是:发送方发出数据后,必须等待接收方给出回应,才能继续发送下一笔数据。这个“等待回应”的过程,就是同步的核心。

同步通讯的关键特征:

  • 发送和接收有严格的时序关系
  • 发送方需要等待接收方的确认信号
  • 数据交换是“一问一答”的模式
  • 时钟信号通常由主设备提供

举个例子,I2C总线就是典型的同步通讯。主设备发出起始信号后,每发送一个字节,都要等待从设备拉低SCL线来确认。没有这个确认,主设备就卡在那里不动。嗯,这里要注意——很多新手写I2C驱动时,忘了处理这个应答等待,结果通讯就乱套了。

1.2 同步 vs 异步:到底差在哪?

这个问题我几乎每次培训都会被问到。咱们直接上对比:

对比项 同步通讯 异步通讯
时钟信号 需要独立的时钟线 不需要,靠波特率约定
数据收发 发送和接收同时进行 发送和接收独立进行
传输效率 较低(有等待时间) 较高(无需等待)
硬件复杂度 较高(需要时钟线) 较低(只需数据线)
典型协议 I2C、SPI、CAN UART、RS232、RS485

我个人习惯这样理解:同步通讯就像两个人面对面聊天,你看着我我看着你,谁都不能走神。异步通讯就像发微信,你发你的,我回我的,不用同时在线。

我在项目中遇到过这样一个坑:有个同事用UART做高速数据传输,觉得异步通讯效率高,结果数据老是丢包。查了半天,发现是接收缓冲区太小,处理不过来。换成同步的SPI后,问题就解决了。为什么?因为同步通讯有硬件流控,不会出现“发得太快、收不过来”的情况。

避坑指南:

我曾经在一个工业控制项目里,用异步通讯连接多个传感器。结果发现,当传感器数量超过5个时,总线冲突频繁发生。后来改成同步的CAN总线,每个节点按时间片发送,问题迎刃而解。所以,多节点通讯时,同步方案往往更可靠。

1.3 同步通讯的应用场景

同步通讯不是万能的,但在某些场景下,它确实是最优解。我总结了几类典型应用:

场景一:传感器数据采集

温度传感器、压力传感器这类设备,通常需要MCU主动发起读取指令,传感器再返回数据。这种“一问一答”的模式,天然适合同步通讯。我用I2C读取过上百个温度传感器,只要地址不冲突,通讯非常稳定。

场景二:显示驱动

OLED屏幕、LCD屏幕,大多用SPI接口。为什么?因为显示数据需要实时刷新,而且不能出错。SPI的同步机制保证了每一帧数据都能完整传输。我记得有一次调试一块128x64的OLED,用异步通讯刷屏,画面老是闪烁。换成SPI后,刷新率从30fps直接飙到60fps。

场景三:多机协同控制

工业机器人、数控机床这类设备,多个控制器之间需要精确同步。比如一个机械臂的6个关节,每个关节的电机控制器必须同时接收指令,同时执行。这时候用CAN总线(同步通讯)就比用RS485(异步通讯)靠谱得多。

我的经验:

选型时,别只看通讯速率。同步通讯虽然慢一点,但可靠性高。异步通讯虽然快,但容易出幺蛾子。你想想看,一个设备如果三天两头通讯失败,再高的速率也没用。

1.4 同步通讯的核心逻辑

为了让大家更直观地理解,我画了一张流程图:

主设备 (Master) 从设备 (Slave) SCL 时钟线 SDA 数据线 同步通讯流程 ① 主设备拉低SDA,发出起始信号 ② 主设备在SCL时钟下,逐位发送数据 ③ 从设备接收完成后,拉低SDA作为应答

这张图展示的是I2C通讯的典型流程。你看,主设备发送数据时,时钟线SCL一直在跳动。从设备收到数据后,必须给出应答。没有这个应答,主设备就不会继续发下一笔数据。这就是同步通讯的精髓——用时钟信号保证双方步调一致

1.5 什么时候该用同步通讯?

我给大家一个简单的判断标准:

  • 数据量不大(几百字节以内)→ 同步通讯合适
  • 实时性要求高(毫秒级响应)→ 同步通讯合适
  • 通讯距离短(板级或机箱内)→ 同步通讯合适
  • 设备数量少(几个到十几个)→ 同步通讯合适

反过来,如果数据量大(比如传图片、视频)、距离远(几十米以上)、设备多(几十上百个),那异步通讯可能更合适。没有绝对的好坏,只有合不合适的场景。

一句话总结:

同步通讯,就是用“等待”换“可靠”。你多等一会儿,数据就少错一点。在嵌入式系统里,很多时候可靠性比速度更重要。


专注资料整理