LoRa自学笔记01:原理与学习路线

适用人群:零基础,想用单片机(STM32 / 51 / ESP32 / Arduino)驱动市面上常见 LoRa 模块的开发者。

核心问题先行:LoRa 通信至少需要 2 个模块(或 1 个模块 + 1 台 LoRaWAN 网关),只买 1 个模块无法通信。


目录

  1. [LoRa 到底是什么](#LoRa 到底是什么)
  2. 需要买几个模块?
  3. [LoRa 通信原理解说](#LoRa 通信原理解说)
  4. [市面上最常用的 LoRa 模块盘点](#市面上最常用的 LoRa 模块盘点)
  5. [两大驱动路线:串口透传 vs SPI 裸驱](#两大驱动路线:串口透传 vs SPI 裸驱)
  6. [路线 A:串口透传模块实战(以亿佰特 E220-400T22S 为例)](#路线 A:串口透传模块实战(以亿佰特 E220-400T22S 为例))
  7. [路线 B:SPI 裸芯片模块实战(以安信可 Ra-02 / SX1278 为例)](#路线 B:SPI 裸芯片模块实战(以安信可 Ra-02 / SX1278 为例))
  8. [进阶:LoRaWAN 是什么,和裸 LoRa 有什么区别](#进阶:LoRaWAN 是什么,和裸 LoRa 有什么区别)
  9. [常见问题 FAQ](#常见问题 FAQ)
  10. 从零到精通的学习路线

一、LoRa 到底是什么

LoRa(Long Range)是一种远距离、低功耗、低速率的无线通信技术,由 Semtech 公司拥有。你可以这样理解它的定位:

技术 距离 功耗 速率 典型用途
WiFi ~50m 视频、上网
蓝牙 ~10m 耳机、手环
LoRa 2~15km 极低 低(0.3~50kbps) 传感器、抄表、农业
4G/NB-IoT 基站覆盖 需运营商、要交话费

LoRa 的杀手锏:不需要运营商、免流量费、空旷环境轻松几公里、电池供电能用好几年,代价是传输速率很低,只适合传小数据(温度、开关量、定位坐标等)。

LoRa 与 LoRaWAN 的区别(新手最容易混淆)

  • LoRa:只是物理层的无线电调制技术("怎么把 0 和 1 变成电磁波")。
  • LoRaWAN:建立在 LoRa 之上的通信协议和网络架构("设备怎么入网、怎么和服务器对话"),需要网关和网络服务器。

新手自学、自己两个模块互发数据,用的是裸 LoRa 点对点,完全不需要网关和服务器。LoRaWAN 是进阶内容。


二、需要买几个模块?

核心答案:至少 2 个。 无线通信必须有"一发一收"两端。

常见组合:

你的目的 要买的东西
两个设备互传数据(如遥控小车、两个传感器互通) 2 个同型号 LoRa 模块
一个基站收集 N 个传感器数据 N 个节点模块 + 1 个集中器模块(共 N+1 个)
接入公共 LoRaWAN 网络(如 TTN) 1 个节点模块(附近有网关覆盖才行)
自己搭 LoRaWAN 私有网络 1 个 LoRaWAN 网关 + N 个节点

购买注意事项:

  1. 两个模块必须频段一致(国内一般买 433MHz 或 470MHz 版本,也叫 400M 频段)。
  2. 新手建议买 UART 串口透传型(如亿佰特 E220/E22 系列),到手两根线交叉一接就能通。
  3. 别忘了天线!LoRa 模块不装天线几乎传不出去,还可能烧功放。买 433MHz 胶棒天线或弹簧天线(IPEX 接口的注意配套)。
  4. 想先在电脑上玩,再买 2 个 USB 转 TTL 小板(CH340),不用写一行代码就能验证通信。

最低成本入门套装(约 40~60 元):

  • 2 × 亿佰特 E220-400T22S(或 ATK-LORA-01)
  • 2 × USB 转 TTL(CH340)
  • 天线一般随模块附送或加几块钱

三、LoRa 通信原理解说

3.1 扩频调制(CSS)------LoRa 的核心魔法

普通无线通信(如 433M 遥控器用的 ASK)信号能量集中在一个很窄的频率点上,容易被干扰、容易被噪声淹没。

LoRa 用的是线性调频扩频(CSS, Chirp Spread Spectrum):把每一位数据展开成一段"频率随时间扫动"的啁啾(Chirp)信号,能量摊开在很宽的频带里。

好处:

  • 接收灵敏度极高(可达 -148dBm):信号淹没在噪声下面几十 dB 也能解出来;
  • 抗干扰强:窄带干扰只影响啁啾的一小段,靠相关运算还能恢复;
  • 代价是速率低。

3.2 三个你必须懂的关键参数

① 扩频因子 SF(Spreading Factor),取值 SF6~SF12
  • SF 越大 → 每个符号传输时间越长 → 距离越远、灵敏度越高、速率越低、耗电越多
  • SF 越小 → 速率快、距离近。
  • 通信双方 SF 必须相同(不同 SF 之间基本互相听不见,准正交)。
② 带宽 BW(Bandwidth),常见 125 / 250 / 500 kHz
  • BW 越大 → 速率越快,但灵敏度下降、距离变近;
  • 国内 433M 一般配合 125kHz 使用。
③ 编码率 CR(Coding Rate),如 4/5~4/8
  • 前向纠错比例,CR 越高纠错能力越强、冗余越多、速率越慢。

经验口诀:想传得远 → 大 SF + 小 BW;想传得快 → 小 SF + 大 BW。

速率和距离的对应关系(SF7/BW125K 速率约 5.5kbps、距离近;SF12/BW125K 速率约 0.3kbps、距离最远)。模块手册里的"空中速率 0.3k~19.2k"背后就是这几组参数的组合。

3.3 一次通信到底发生了什么

复制代码
发送端 MCU ──(串口/SPI)──> LoRa模块 ──(啁啾射频信号)──> LoRa模块 ──(串口/SPI)──> 接收端 MCU
                          把数据编码成                           解调出数据
                          扩频信号发射                          

LoRa 数据包的物理结构:

  • 前导码 Preamble:一串标准啁啾,告诉对方"我要发数据了,快同步";
  • 包头 Header:数据长度、编码率、CRC 开关等信息;
  • Payload:你的实际数据,一次最多 255 字节(FIFO 256 字节);
  • CRC:校验,防误码。

收发双方只要 频率、SF、BW、CR、前导码长度 这五个参数一致,就能互相通信。

3.4 地址与信道(针对串口透传模块)

串口透传模块在上述物理参数之上又封装了"地址 + 信道"的概念:

  • 模块地址(2 字节,0~65535):类似门牌号;
  • 信道(1 字节):每个信道对应一个具体频点,如信道 0 = 410.125MHz,信道 23 = 433.125MHz(每信道间隔 1MHz);
  • 地址相同 + 信道相同 + 空中速率相同 → 才能透传互通。

四、市面上最常用的 LoRa 模块盘点

4.1 串口透传型(UART)------新手首选

内部有 MCU 帮你把 LoRa 协议全部跑好,单片机只管用串口收发字节,AT 指令或上位机配置参数。

型号 芯片 频段 功率 接口 特点
亿佰特 E220-400T22S SX1268 433/470M 22dBm UART 新一代低功耗,休眠 180nA,性价比之王
亿佰特 E22-400T30S SX1262+PA 433/470M 30dBm(1W) UART 大功率远距,AT 指令
亿佰特 E32-433T20D/T33D SX1278 433M 20/33dBm UART 经典老将,资料极多
正点原子 ATK-LORA-01 SX1278 433M 20dBm UART 配正点原子教程,学生学习常用

4.2 SPI 裸芯片型------进阶、便宜、自由度最高

模块里就是一颗射频芯片,所有寄存器都要自己操作,单片机通过 SPI 读写。

型号 芯片 频段 特点
安信可 Ra-01 SX1278 433M 约 10 元,弹簧天线,资料最多
安信可 Ra-02 SX1278 433M 带 IPEX 座子,直接拧胶棒天线
安信可 Ra-01S / Ra-01SC SX1268 / LLCC68 433M 新一代低功耗
安信可 Ra-01SH SX1262 868/915M 海外频段
亿佰特 E220-400M22S / E22-400M22S SX1268/1262 433/470M 邮票孔,适合集成进自己的产品
RFM95W SX1276 868/915M 国外开源项目常见

4.3 LoRaWAN 节点型

型号 芯片 特点
亿佰特 E78-400M22S1C ASR6601(国产 SoC) 支持 LoRaWAN,可二次开发
安信可 Ra-07 / Ra-08 ASR6501/6502 Ra-08 支持串口烧写、二次开发
各种 LilyGo / Heltec 开发板 ESP32+SX1276 集成 屏幕+LoRa 一体,玩 Arduino 方便

4.4 选型建议

  • 纯新手、只想快点通:E220-400T22S × 2(串口型)
  • 想学底层原理、做竞赛/毕设:Ra-02 × 2(SPI 型)+ STM32
  • 要做 LoRaWAN、上云平台:E78 或 Heltec/LilyGo + 一台网关

五、两大驱动路线:串口透传 vs SPI 裸驱

对比项 串口透传型 SPI 裸芯片型
上手难度 ★(会串口就行) ★★★★(要啃寄存器手册)
单片机要求 1 个 UART 1 个 SPI + 几个 GPIO
可定制性 低(参数固定几个档) 高(SF/BW/CR 随便调)
价格 15~30 元 10~15 元
适合 快速落地、产品 学习原理、竞赛、深度定制

两条路线后面各给一份完整实战教程。


六、路线 A:串口透传模块实战

亿佰特 E220-400T22S 为例(E22、E32、ATK-LORA-01 思路完全一样)。

6.1 先不写代码:电脑对电脑验证通信

材料:2 个模块 + 2 个 USB 转 TTL + 天线。

接线(TX/RX 交叉!):

LoRa 模块 USB 转 TTL
VCC 5V(注意查你模块的电压范围,E220 支持 2.3~5.5V)
GND GND
TXD RXD
RXD TXD
M0、M1 GND(进入模式 0:透传模式)

测试

  1. 两个模块都插电脑,开两个串口助手,波特率默认 9600;
  2. 出厂默认参数相同(地址 0、信道 23、空中速率 2.4k),直接在窗口 A 发 Hello,窗口 B 就能收到 Hello
  3. 通了!这就是 LoRa 点对点。

改参数(用亿佰特官方上位机 RFSetting,或 AT 指令):

  • 把 M1 接高电平(M0=0, M1=1)进入配置模式;
  • 可改地址、信道、波特率、空中速率、功率等;
  • 改完记得把 M1 拉回低电平回到透传模式。

6.2 四种工作模式(M0/M1 引脚控制)

M1 M0 模式 说明
0 0 传输模式 正常透传收发
0 1 WOR 模式 低功耗监听,电池节点用
1 0 配置模式 改参数用
1 1 深度休眠 几乎不耗电

6.3 单片机接线(以 STM32 为例)

复制代码
STM32            E220-400T22S
PA9  (USART1_TX) ──> RXD
PA10 (USART1_RX) <── TXD
PA8  (GPIO)      ──> M0
PA11 (GPIO)      ──> M1
3.3V/5V          ──> VCC
GND              ──> GND
AUX              ──> PA12 (可选,忙标志检测)

6.4 收发代码(HAL 库示例)

透传模式下,代码简单到令人发指------LoRa 模块就是一个"看不见的串口"

c 复制代码
// 初始化:M0=0, M1=0 进入透传模式
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);  // M0=0
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); // M1=0
HAL_Delay(50);  // 等模式切换完成

// 发送:直接往串口扔数据
uint8_t msg[] = "Temperature:25.6C";
HAL_UART_Transmit(&huart1, msg, sizeof(msg)-1, 100);

// 接收:用串口中断/DMA 收
uint8_t rxbuf[64];
HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxbuf, sizeof(rxbuf));
// 回调里处理收到的数据,对方发什么你就收什么

定点传输 (指定发给谁):把模块配置为定点模式后,串口发出的数据前 3 个字节是 目标地址高字节 + 目标地址低字节 + 目标信道,后面才是数据:

c 复制代码
// 发给地址 0x1234、信道 0x17 的设备
uint8_t pkt[] = {0x12, 0x34, 0x17, 'H', 'e', 'l', 'l', 'o'};
HAL_UART_Transmit(&huart1, pkt, sizeof(pkt), 100);

6.5 串口型的坑

  1. TX/RX 一定要交叉,且共地;
  2. 单片机串口波特率要和模块配置一致(默认 9600);
  3. 空中速率 ≠ 串口波特率!空中速率低时,连续猛发会溢出,要分包、留间隔;
  4. 模式切换后要延时几十 ms 再收发;
  5. 大功率模块(30dBm)发射电流可达 500mA~1A,电源要够劲。

七、路线 B:SPI 裸芯片模块实战

安信可 Ra-02(SX1278) 为例。这才是真正"精通 LoRa"的必经之路。

7.1 接线(以 STM32F103 为例)

Ra-02 引脚 STM32 说明
3.3V 3.3V 只能 3.3V!不能 5V
GND GND
NSS PA4 SPI 片选(GPIO 软件控制)
SCK PA5 SPI1_SCK
MISO PA6 SPI1_MISO
MOSI PA7 SPI1_MOSI
RST PB0 复位脚,给个 GPIO
DIO0 PB1 收发完成中断脚

DIO0 是关键:发送完成、收到数据都会在这个脚上产生上升沿脉冲,建议接单片机外部中断。

7.2 SX1278 寄存器通信基础

SX1278 就是一个 SPI 从机。读写规则:

  • 写寄存器:地址字节最高位置 1(addr | 0x80),然后发数据;
  • 读寄存器:直接发地址字节,然后读回数据。
c 复制代码
// SPI 底层读写
uint8_t sx1278_read(uint8_t addr) {
    uint8_t val;
    NSS_LOW();
    spi_transfer(addr & 0x7F);   // 读:最高位0
    val = spi_transfer(0x00);
    NSS_HIGH();
    return val;
}

void sx1278_write(uint8_t addr, uint8_t val) {
    NSS_LOW();
    spi_transfer(addr | 0x80);   // 写:最高位1
    spi_transfer(val);
    NSS_HIGH();
}

7.3 初始化流程(核心寄存器)

c 复制代码
void lora_init(void) {
    // 1. 硬件复位
    RST_LOW(); HAL_Delay(10); RST_HIGH(); HAL_Delay(10);

    // 2. 进入 Sleep + LoRa 模式(必须先Sleep才能切LoRa模式)
    sx1278_write(0x01, 0x80);        // RegOpMode: LoRa + Sleep
    sx1278_write(0x01, 0x81);        // LoRa + Standby

    // 3. 设置频率 433MHz
    //    Frf = 433MHz / 61.035Hz ≈ 0x6C4000(三步分频寄存器)
    sx1278_write(0x06, 0x6C);        // RegFrfMsb
    sx1278_write(0x07, 0x40);        // RegFrfMid
    sx1278_write(0x08, 0x00);        // RegFrfLsb

    // 4. 发射功率 17dBm(PA_OUTPUT_PA_BOOST)
    sx1278_write(0x09, 0xF0);        // RegPaConfig

    // 5. BW=125kHz, CR=4/5, 显式包头
    sx1278_write(0x1D, 0x72);        // RegModemConfig1

    // 6. SF=7, CRC开
    sx1278_write(0x1E, 0x74);        // RegModemConfig2

    // 7. 前导码长度 8
    sx1278_write(0x20, 0x00);
    sx1278_write(0x21, 0x08);

    // 8. DIO0 映射:RX 时=RxDone,TX 时=TxDone
    sx1278_write(0x40, 0x00);        // RegDioMapping1
}

7.4 发送流程

c 复制代码
void lora_send(uint8_t *data, uint8_t len) {
    sx1278_write(0x01, 0x81);          // Standby
    sx1278_write(0x0D, 0x00);          // FIFO 指针 -> Tx 基地址 0x00
    for (uint8_t i = 0; i < len; i++)
        sx1278_write(0x00, data[i]);   // 写入 FIFO (RegFifo)
    sx1278_write(0x22, len);           // RegPayloadLength
    sx1278_write(0x01, 0x83);          // 切到 TX 模式,自动发射
    // 等 DIO0 拉高 = TxDone
    while (dio0_read() == 0);
    sx1278_write(0x12, 0x08);          // 清 TxDone 中断标志
}

7.5 接收流程

c 复制代码
uint8_t lora_recv(uint8_t *buf) {
    sx1278_write(0x0D, 0x00);          // FIFO 指针 -> Rx 基地址
    sx1278_write(0x01, 0x85);          // RX Continuous 连续接收
    while (dio0_read() == 0);          // 等 RxDone 中断
    uint8_t irq = sx1278_read(0x12);   // RegIrqFlags
    sx1278_write(0x12, 0xFF);          // 清标志
    if (irq & 0x20) return 0;          // CRC 错误,丢弃
    uint8_t len = sx1278_read(0x13);   // RegRxNbBytes
    sx1278_write(0x0D, sx1278_read(0x25)); // 指针跳到本包起始
    for (uint8_t i = 0; i < len; i++)
        buf[i] = sx1278_read(0x00);    // 读出 FIFO
    return len;
}

不想手写寄存器?Arduino/ESP32 直接用开源库 RadioLibarduino-LoRa(Sandeep Mistry),几行代码搞定;STM32 可移植这些库或用官方参考代码。

7.6 互通条件清单(收发两端必须一致)

  • 频率(433MHz)
  • 扩频因子 SF
  • 带宽 BW
  • 编码率 CR
  • 前导码长度
  • CRC 开关
  • 显式/隐式包头模式

任何一项不同,两边就是"聋子"。


八、进阶:LoRaWAN 是什么

当你不满足于"两个模块互发",想让数据上云、让成千上万的节点接入一个网络时,就需要 LoRaWAN。

复制代码
传感器节点 ──LoRa──> LoRaWAN网关 ──互联网──> 网络服务器(TTN/ChirpStack) ──> 你的应用/云平台
  • 节点:E78、Ra-08、Heltec 板等;
  • 网关:多通道 SX1302 基带的设备(几百到几千元),不是普通 LoRa 模块;
  • 服务器:免费的 TTN,或自己搭 ChirpStack;
  • 节点入网需要 DevEUI / AppEUI / AppKey 三要素;
  • 协议栈用开源的 LoRaMac-node 或模块自带固件。

新手建议先把裸 LoRa 点对点玩熟,再上 LoRaWAN。


九、常见问题 FAQ

Q1:我只买一个模块,能收到别人的信号吗?

理论上如果附近有同频段同参数的设备在发,你能收到。但实际中别人参数你不知道,所以自学必须买 2 个。

Q2:433MHz 合法吗?

国内 433.05~434.79MHz 和 470~510MHz 属于免许可微功率频段,但发射功率有限制(一般 ≤50mW/17dBm 或特定条件 1W),买 SRRC 认证过的模块、民用场景实验一般没问题。

Q3:LoRa 能传多远?

标称"10km"是空旷可视 + 高增益天线 + 最低速率的理想值。城市里楼群间一般 1~3km,农田空旷 3~8km,别迷信宣传值。

Q4:能传图片、语音吗?

不能(或极痛苦)。速率只有几百 bps 到几十 kbps,适合小数据包。

Q5:模块发热/烧毁了?

检查:①供电超压(Ra 系列只能 3.3V);②没接天线就长时间大功率发射;③两个模块贴太近 + 满功率发射,可能烧 LNA,测试时拉开几米距离或降功率。

Q6:一对多怎么实现?

串口透传:所有节点同地址同信道,主机发大家都能收(广播);或定点模式逐个寻址。SPI 裸驱:自己设计协议,数据包开头带目标地址字节,收到后比对地址决定处理或丢弃。

Q7:LoRa 和蓝牙/WiFi 能互通吗?

不能,完全不同的物理层。需要网关做协议转换。

Q8:为什么我两个模块距离 1 米反而收不到?

近距离满功率会阻塞接收机。拉开距离,或把发射功率调低。


十、从零到精通的学习路线

第 1 阶段:点亮通信(1 天)

  • 买 2 个串口透传模块 + USB 转 TTL,电脑上互发 Hello World;
  • 玩懂上位机配置:地址、信道、空中速率、功率、定点/透传。

第 2 阶段:单片机接入(2~3 天)

  • STM32/51/ESP32 串口接 LoRa,做一个实际小项目:如 A 板采集温湿度,B 板 OLED 显示;
  • 学会处理分包、超时、校验。

第 3 阶段:吃透原理(1 周)

  • 换 SPI 裸芯片模块(Ra-02),对着 SX1278 数据手册手写驱动;
  • 用 DIO0 中断做收发,改 SF/BW 实测距离和速率的关系。

第 4 阶段:组网(1~2 周)

  • 自己设计简单协议:地址帧头 + 数据 + CRC,实现 1 主多从轮询;
  • 低功耗:休眠 + 定时唤醒 + CAD 信道检测。

第 5 阶段:LoRaWAN(进阶)

  • 网关 + ChirpStack 服务器,节点入网,数据上云。

附:推荐采购清单(新手入门版)

物品 数量 参考价
亿佰特 E220-400T22S(433MHz) 2 ~20元×2
USB 转 TTL(CH340) 2 ~5元×2
433MHz 胶棒天线(若模块不送) 2 ~3元×2
(进阶)安信可 Ra-02 2 ~12元×2
STM32F103C8T6 最小系统板(若没有) 2 ~15元×2

相关推荐
何事误红尘2 小时前
Mqtt学习笔记(一):Mosquitto服务器搭建、MQTTX安装测试
学习
青山是哪个青山3 小时前
LangChain 学习笔记(三):LangSmith 调试与监控
笔记·学习·langchain
那年窗外下的雪.4 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
蒸蒸yyyyzwd5 小时前
cpp选手备战后端学习笔记day6 秋招笔试题
笔记·学习
weixin_446260857 小时前
AVA-Encoder:面向智能体原生视频表征学习框架
学习·音视频
DeviceHub7 小时前
硬件工程师选型笔记:ALPS SKPMAPE010 与 Tonevee TS-3025 贴片轻触开关 PIN TO PIN 评估指南
笔记
吃好睡好便好7 小时前
说说口罩的佩戴
学习·生活·口罩
fīɡЙtīиɡ ℡8 小时前
大模型结构化输出
人工智能·学习
疯狂打码的少年8 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法