3、物理层基础(二):前导码结构与作用、同步字配置、CRC校验与数据白化

好,咱们接着聊LoRa物理层的那些事儿。上一章我们把LoRa的调制方式、扩频因子这些核心概念理清了。这一章,我打算把物理层里剩下的几个关键模块一次性讲透——前导码、同步字、CRC校验,还有数据白化。

这几个东西,说白了就是LoRa数据包在空口传输时的“包装”和“保护”机制。你想想看,无线通信环境那么嘈杂,数据在空中飞,怎么保证接收方能准确找到信号的起点?怎么确保收到的数据没被篡改?怎么避免连续的0或1让接收机失锁?嗯,这些问题,就是今天要解决的。

一、前导码(Preamble):信号的“敲门砖”

前导码是什么?我个人的理解是——它就像你敲门时的“咚咚咚”。接收机在待机状态下,一直在监听空中的信号。但信号什么时候来,它不知道。所以发送端必须先发一段固定的、已知的波形,告诉接收机:“嘿,我要开始发数据了,你准备好!”

在LoRa里,前导码由一组连续的up-chirp(向上扫频的啁啾信号)组成。具体来说,它包含:

  • 基础前导码长度:默认是12个符号(symbol)。
  • 可配置范围:从6到65535个符号,你可以在寄存器里设置。
  • 前导码末尾:有两个特殊的down-chirp(向下扫频),作为前导码结束的标志。

关键作用:

  • 自动增益控制(AGC)收敛:接收机需要时间调整增益,前导码给了这个缓冲期。
  • 频率和时间同步:接收机通过检测前导码,估算出信号的频偏和起始时间。
  • 唤醒接收机:对于低功耗应用,接收机可以周期性休眠,前导码能把它唤醒。

我在项目中遇到过一个问题:两个LoRa节点距离很近,但一个发另一个就是收不到。查了半天,发现是前导码长度设置得太短了。接收机还没来得及完成AGC收敛,前导码就结束了,后面的数据自然就解不出来。所以,我建议在远距离或干扰强的场景下,适当增加前导码长度,比如设成16或20个符号。

避坑指南:

我曾经在一个多节点网络中,把前导码设成了65535个符号,想着这样接收肯定稳。结果发现,节点功耗飙升,而且信道占用时间太长,其他节点根本没法发数据。前导码不是越长越好,要权衡功耗和可靠性。

二、同步字(Sync Word):对暗号

前导码让接收机知道了“有信号来了”。但问题是,空中的LoRa信号可能不止你一家。同一个频段上,可能有别的LoRa设备也在发数据。怎么区分哪些数据是发给我的?

答案就是同步字。它紧跟在两个down-chirp之后,相当于一个“暗号”。接收机只有检测到正确的同步字,才会继续处理后面的数据。否则,直接丢弃。

LoRa的同步字默认是0x12和0x34(两个字节)。但你可以改成任意值。比如,你给设备A设同步字0xAA,设备B设0xBB,那么设备A只会解调带0xAA同步字的数据包。

同步字配置要点:

  • 长度固定:两个字节,不可更改。
  • 寄存器地址:在SX1278/SX126x等芯片中,对应RegSyncWord寄存器。
  • 私有网络:如果你不想让别人轻易解调你的数据,可以修改同步字。但注意,这只能防君子,不能防小人——因为同步字是明文传输的。

我记得有一次做户外测试,两个团队都在用LoRa,频段一样,结果互相干扰。后来我们各自改了同步字,问题就解决了。说白了,这就是在物理层做了一层简单的网络隔离。

注意:

同步字修改后,发送端和接收端必须一致。我曾经调试时忘了改接收端的同步字,结果数据死活收不到,折腾了半小时才发现是同步字没对上。这种低级错误,大家引以为戒。

三、CRC校验:数据完整性的“守门员”

数据在空中传输,受干扰是常态。可能一个比特翻转,整个数据就变了。怎么知道收到的数据对不对?CRC(循环冗余校验)就是干这个的。

LoRa支持两种CRC模式:

  • CRC禁用:不校验,适合对实时性要求极高、能容忍少量错误的场景(比如语音?但LoRa很少做语音)。
  • CRC启用:默认是2字节的CRC(CRC-16),校验整个数据载荷。

接收机在解调完数据后,会重新计算一次CRC,然后和发送端附带的CRC值对比。如果一致,说明数据大概率没问题;如果不一致,直接丢弃这个数据包。

我个人的习惯:

除非你有100%的把握信道非常干净,否则永远不要关闭CRC。我在一个工业项目中,为了省那一点点传输时间,关了CRC。结果现场有电机干扰,数据包经常出错,但接收机完全不知道,把错误数据当成正确的处理了。后来被客户投诉,才老老实实把CRC打开。

CRC的计算多项式是固定的,你不需要自己实现。芯片硬件会自动完成。你只需要在配置寄存器里设置CRC使能或禁用即可。

四、数据白化(Whitening):让数据更“随机”

最后一个要聊的是数据白化。这名字听起来挺玄乎,其实原理很简单。

你想想看,如果发送的数据是一长串0,或者一长串1,那么经过LoRa调制后,输出的信号就会变成一段很长的、频率不变的连续波。这对接收机来说是个灾难——自动增益控制(AGC)会误判,锁相环(PLL)可能会失锁,而且频谱上会出现很强的单频干扰。

数据白化,就是在发送前,把原始数据和一段伪随机序列(PN序列)进行异或(XOR)操作。这样,不管原始数据是什么,经过白化后,0和1的分布都变得均匀、随机。接收端收到后,再用同样的PN序列异或一次,就能恢复出原始数据。

白化的好处:

  • 避免长连0/1:保证接收机的时钟恢复电路正常工作。
  • 频谱平坦化:避免单频干扰,符合无线电法规要求。
  • 提高解调可靠性:随机化的数据更容易被解调器正确判决。

LoRa芯片内部默认就开启了数据白化,你不需要手动干预。但了解这个机制很重要——我曾经遇到一个客户,自己用MCU模拟LoRa调制,结果忘了做白化,导致接收灵敏度比标准芯片差了10dB。这就是不懂物理层细节的代价。

小知识:

数据白化的PN序列通常是9阶的线性反馈移位寄存器(LFSR)生成的,多项式是x^9 + x^5 + 1。这个序列周期是511个比特,足够覆盖大多数LoRa数据包。

五、总结一下

好,这一章的内容就这些。我们来捋一捋:

  • 前导码:信号的“敲门砖”,让接收机完成同步和AGC。长度可配,但别太长也别太短。
  • 同步字:物理层的“暗号”,用来区分不同的LoRa网络。改了之后要记得收发一致。
  • CRC校验:数据完整性的保障。我建议永远开启,除非你确定信道绝对干净。
  • 数据白化:让数据变“随机”,避免长连0/1带来的问题。芯片默认开启,你不需要操心。

下一章,我们会深入LoRa的数据包结构,看看这些模块是怎么组合成一个完整的数据帧的。到时候,你会对LoRa的物理层有一个更立体的认识。

嗯,今天就到这里。有问题欢迎在评论区留言,或者来我的公众号找我。


公众号:蓝海资料掘金营,微信deep3321