3. 物理层与数据链路层:OSI模型回顾、物理层职责、数据链路层帧结构、MAC地址与CSMA/CA
各位同学,咱们今天聊点实在的。很多做单片机的朋友,一上来就调SPI、I2C,或者直接怼着无线模块的寄存器写。但遇到通信不稳定、丢包、冲突,就抓瞎了。说白了,就是缺了那层“理论基础”。
我个人习惯,不管项目多急,都会先花半小时把物理层和数据链路层的分工理清楚。这俩兄弟搞明白了,后面调协议栈、选芯片、排故障,心里就有底了。
3.1 OSI模型回顾——别被七层吓到
OSI七层模型,教科书上写得很厚。但在咱们嵌入式无线通信里,真正天天打交道的,其实就下面四层。上面三层,大部分时候协议栈帮你搞定了。
我画了张图,帮你快速定位今天要啃的骨头:
你看,物理层和数据链路层,是无线通信的“地基”。上面再花哨的协议,地基不稳,全白搭。
3.2 物理层职责——信号是怎么飞出去的
物理层,说白了就是“怎么把0和1变成无线电波,再变回来”。它不关心你发的是什么数据,只关心比特流能不能准确送达。
它的核心职责,我归纳成四点:
- 编码与调制:把数字信号(0/1)调制成适合天线发射的模拟信号。比如OOK、FSK、GFSK、DSSS。
- 传输介质管理:决定工作频段(2.4GHz、868MHz、915MHz)、信道带宽、发射功率。
- 比特同步:接收端要从噪声中“咬住”发送端的时钟,才能正确采样。这活儿通常靠前导码(Preamble)完成。
- 信号质量检测:RSSI(信号强度)、LQI(链路质量)、ED(能量检测)。这些参数是上层做决策的依据。
举个例子。我在一个智能家居项目里,用了某款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校验。收端算一遍,不对就丢帧。 |
你想想看,如果没有帧结构,接收端收到一串比特流,它怎么知道哪一段是地址、哪一段是数据?所以,帧结构就是通信双方的“契约”。
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(载波侦听多点接入/冲突避免)就是解决这个问题的。
它的核心流程,我总结成四步:
- 先听再说(CCA):发送前,先侦听信道。如果检测到能量高于阈值(ED阈值),说明信道忙,等一会儿再试。
- 随机退避:如果信道忙,不是立刻重试,而是随机等一段时间。这个随机时间叫退避时间(Backoff Time)。
- 虚拟载波侦听(RTS/CTS):可选机制。发送端先发一个RTS(请求发送),接收端回复CTS(允许发送)。其他设备听到CTS,就知道信道被预约了,乖乖闭嘴。
- ACK确认:接收端收到数据后,回复ACK。如果发送端没收到ACK,就认为冲突了,重传。
为什么会这样?因为无线环境不像有线那么稳定。你侦听到信道空闲,但可能在你发出去的那一瞬间,另一个设备也同时开始发了。这就是“隐藏节点”问题。RTS/CTS就是专门对付这个的。
我记得在一个工厂自动化项目里,30多个无线传感器节点同时上报数据。一开始没开RTS/CTS,冲突率高达15%。开了之后,冲突率降到1%以下。代价是每个数据包多了两个控制帧的开销。但在高密度场景下,这买卖划算。
3.6 物理层与数据链路层的协同——一个完整的发送流程
说了这么多,咱们串起来看一个完整的发送流程:
你看,一个看似简单的“发数据”,背后是物理层和数据链路层的精密配合。物理层搞定信号,数据链路层搞定规则。缺一不可。
3.7 本章小结——记住这三句话
- 物理层:把比特变成电磁波,负责“能不能传”。关注频段、调制、功率、灵敏度。
- 数据链路层:把比特流变成有结构的帧,负责“传得对不对”。关注帧结构、MAC地址、冲突避免。
- CSMA/CA:无线信道里的交通警察。先听后说、随机退避、冲突避免。