3. 物理层与数据链路层:OSI模型回顾、物理层职责、数据链路层帧结构、MAC地址与CSMA/CA

各位同学,咱们今天聊点实在的。很多做单片机的朋友,一上来就调SPI、I2C,或者直接怼着无线模块的寄存器写。但遇到通信不稳定、丢包、冲突,就抓瞎了。说白了,就是缺了那层“理论基础”。

我个人习惯,不管项目多急,都会先花半小时把物理层和数据链路层的分工理清楚。这俩兄弟搞明白了,后面调协议栈、选芯片、排故障,心里就有底了。

3.1 OSI模型回顾——别被七层吓到

OSI七层模型,教科书上写得很厚。但在咱们嵌入式无线通信里,真正天天打交道的,其实就下面四层。上面三层,大部分时候协议栈帮你搞定了。

我画了张图,帮你快速定位今天要啃的骨头:

OSI模型与无线通信核心层 应用层(HTTP、MQTT、CoAP) 传输层(TCP、UDP) 网络层(IP、路由) 数据链路层(MAC、LLC) 帧结构 · MAC地址 · CSMA/CA 物理层(PHY) 调制解调 · 信号编码 · 天线接口 💡 嵌入式无线关注重点: 物理层决定你能传多远、多快、多抗干扰;数据链路层决定你能不能“有序、不冲突”地传。 —— 本章核心:物理层 + 数据链路层 ——

你看,物理层和数据链路层,是无线通信的“地基”。上面再花哨的协议,地基不稳,全白搭。

3.2 物理层职责——信号是怎么飞出去的

物理层,说白了就是“怎么把0和1变成无线电波,再变回来”。它不关心你发的是什么数据,只关心比特流能不能准确送达。

它的核心职责,我归纳成四点:

  • 编码与调制:把数字信号(0/1)调制成适合天线发射的模拟信号。比如OOK、FSK、GFSK、DSSS。
  • 传输介质管理:决定工作频段(2.4GHz、868MHz、915MHz)、信道带宽、发射功率。
  • 比特同步:接收端要从噪声中“咬住”发送端的时钟,才能正确采样。这活儿通常靠前导码(Preamble)完成。
  • 信号质量检测:RSSI(信号强度)、LQI(链路质量)、ED(能量检测)。这些参数是上层做决策的依据。
实战小贴士: 我建议你在选型时,先看物理层参数。比如同样是2.4G,nRF24L01用的是GFSK,CC2530用的是O-QPSK/DSSS。调制方式不同,抗干扰能力和传输距离天差地别。别光看“都是2.4G”就往上怼。

举个例子。我在一个智能家居项目里,用了某款Sub-1G模块。默认发射功率+10dBm,穿一堵墙没问题。但客户要求穿三堵墙。我一开始想着加PA(功放),后来发现物理层数据速率从250kbps降到50kbps,接收灵敏度直接提升了6dB。嗯,有时候降速比加功放更管用。

3.3 数据链路层帧结构——数据是怎么打包的

物理层只管发比特流。但比特流里哪些是地址、哪些是数据、哪些是校验,它不管。这就是数据链路层的活儿。

数据链路层把物理层的原始比特流,封装成“帧”(Frame)。一个标准的无线数据帧,长这样:

字段 长度(典型值) 说明
前导码(Preamble) 4~8字节 接收端用来同步时钟和增益。丢了它,后面全错。
帧起始定界符(SFD) 1字节 告诉接收端:“注意,帧数据要来了!”
长度字段(Length) 1字节 标识后面有效载荷的长度。防止收多或收少。
MAC头部(MHR) 5~25字节 包含源地址、目的地址、帧类型、序列号等。
有效载荷(Payload) 0~127字节 你要传的应用数据。注意,别塞太满。
帧校验序列(FCS) 2~4字节 CRC校验。收端算一遍,不对就丢帧。
⚠️ 避坑指南: 我曾经在一个LoRa项目中,为了省那几微秒的传输时间,把前导码从8字节改成了4字节。结果在强干扰环境下,接收端经常同步失败,丢包率飙升到30%。后来老老实实改回8字节,丢包率降到2%以下。前导码不是冗余,是保险。

你想想看,如果没有帧结构,接收端收到一串比特流,它怎么知道哪一段是地址、哪一段是数据?所以,帧结构就是通信双方的“契约”。

3.4 MAC地址——设备在无线世界里的身份证

MAC地址,就是每个无线设备的“身份证号”。在数据链路层,设备之间通信靠的就是MAC地址来识别对方。

常见的MAC地址类型:

  • 短地址(16位):常用于Zigbee、BLE Mesh。范围0x0000~0xFFFF。网络协调器分配,节省帧开销。
  • 长地址(64位):IEEE分配的全球唯一地址。比如Wi-Fi、LoRaWAN的DevEUI。出厂固化,永不重复。
  • 广播地址:0xFFFF(短地址)或0xFFFFFFFFFFFFFFFF(长地址)。发给所有设备。
  • 组播地址:一组设备的共享地址。用于群发,减少重复传输。

我个人的习惯是:在小型星型网络(一个主机带几个从机)里,用短地址就够了。但在需要设备全球唯一标识的场景(比如资产追踪),必须用64位长地址。别为了省那6个字节的帧开销,搞出地址冲突的幺蛾子。

3.5 CSMA/CA——无线信道里的“交通规则”

无线信道是共享介质。多个设备同时发,信号就撞车了。CSMA/CA(载波侦听多点接入/冲突避免)就是解决这个问题的。

它的核心流程,我总结成四步:

  1. 先听再说(CCA):发送前,先侦听信道。如果检测到能量高于阈值(ED阈值),说明信道忙,等一会儿再试。
  2. 随机退避:如果信道忙,不是立刻重试,而是随机等一段时间。这个随机时间叫退避时间(Backoff Time)。
  3. 虚拟载波侦听(RTS/CTS):可选机制。发送端先发一个RTS(请求发送),接收端回复CTS(允许发送)。其他设备听到CTS,就知道信道被预约了,乖乖闭嘴。
  4. ACK确认:接收端收到数据后,回复ACK。如果发送端没收到ACK,就认为冲突了,重传。
关键参数: CSMA/CA的性能,很大程度上取决于退避算法和重试次数。退避时间太短,冲突概率高;太长,延迟大。我一般建议:退避时间基数为一个CCA时隙(比如128μs),最大退避次数设为4~7次。超过7次还发不出去,就该考虑是不是信道被占死了。

为什么会这样?因为无线环境不像有线那么稳定。你侦听到信道空闲,但可能在你发出去的那一瞬间,另一个设备也同时开始发了。这就是“隐藏节点”问题。RTS/CTS就是专门对付这个的。

我记得在一个工厂自动化项目里,30多个无线传感器节点同时上报数据。一开始没开RTS/CTS,冲突率高达15%。开了之后,冲突率降到1%以下。代价是每个数据包多了两个控制帧的开销。但在高密度场景下,这买卖划算。

3.6 物理层与数据链路层的协同——一个完整的发送流程

说了这么多,咱们串起来看一个完整的发送流程:

无线数据发送完整流程 步骤1:数据链路层组帧 添加前导码、SFD、MAC头部(源/目的地址)、有效载荷、FCS 步骤2:CSMA/CA信道竞争 CCA侦听 → 信道空闲?→ 随机退避 → 发送RTS(可选) 步骤3:物理层调制发射 数据帧 → 编码(如Manchester)→ 调制(如GFSK)→ 功率放大 → 天线发射 步骤4:接收端处理 天线接收 → 解调 → 解码 → 数据链路层校验FCS → 提取有效载荷 → 回复ACK 💡 关键点: 物理层保证“能传”,数据链路层保证“传对”。两层配合,才能实现可靠无线通信。

你看,一个看似简单的“发数据”,背后是物理层和数据链路层的精密配合。物理层搞定信号,数据链路层搞定规则。缺一不可。

3.7 本章小结——记住这三句话

  • 物理层:把比特变成电磁波,负责“能不能传”。关注频段、调制、功率、灵敏度。
  • 数据链路层:把比特流变成有结构的帧,负责“传得对不对”。关注帧结构、MAC地址、冲突避免。
  • CSMA/CA:无线信道里的交通警察。先听后说、随机退避、冲突避免。
最后一句心里话: 很多同学觉得这些理论太枯燥,不如直接调代码。但我在项目里踩过的坑告诉我——你省掉的每一分钟理论学习,都会在调试阶段花十倍的时间还回来。物理层和数据链路层,是无线通信的“内功”。内功不扎实,招式再花哨也是花架子。