本节摘要:SF、带宽、功率这些账本参数,最终都要落成射频芯片寄存器里的具体数值。本节以 SX126x 系列为例,讲射频抽象层(HAL)要封装哪些操作、寄存器级适配的关键点,以及实现里最容易翻车的三处。位置:2.1、2.2 建立了物理层的数字账,本节把这些数字写进硬件。
无论哪款 LoRa 芯片,驱动层都要提供四个基本能力:配置调制参数(SF、带宽、编码率)、设置发射接收频率与功率、收发数据包、查询状态与中断。HAL 的意义在于把芯片差异隔离在驱动层,上层协议栈只认"设置调制参数(SF12, 125kHz, 4/5)"这样的抽象接口。
以 SX126x 为例的关键操作:
/* 配置调制参数:扩频因子、带宽、编码率 */ SX126xSetModulationParams(MOD_LORA, SF12, BW125K, CR_4_5, 0); /* 设置发射功率:SX126x 用 22 - 功率值 表示寄存器参数 */ SX126xSetTxParams(14, RADIO_RAMP_200US); /* 14dBm */ /* 设置频率:868.1MHz,寄存器用频率分辨率 61.035Hz 换算 */ SX126xSetRfFrequency(868100000); /* 收发切换与中断等待 */ SX126xSetTx(0); /* 立即发射 */ while (SX126xGetIrqStatus() & IRQ_TX_DONE) == 0) { /* 等待完成 */ }
关键点一:频率分辨率。SX126x 的频率寄存器换算系数是 61.03515625Hz,868.1MHz 对应的寄存器值是 868100000 / 61.03515625 ≈ 14222933,直接按"频率值"写寄存器会差一截。所有芯片都要求"频率到寄存器值的换算"正确,这是发射不出去或频率越界的头号原因。
关键点二:功率的档位与封顶。芯片标称输出范围与法规上限是两回事:SX126x 硬件可到 +22dBm,但 EU868 法规限制 14dBm,且高频段大功率要开 PA 升压配置(PaDutyCycle 等)。HAL 必须把"硬件能力"与"法规上限"分开管理,由区域参数(第 6 章)决定最终输出。
关键点三:接收灵敏度的校准。芯片手册的灵敏度是典型值,实际板级表现受天线匹配、电源噪声影响。成熟的适配流程是在产线做一次灵敏度抽测,把实测值回填进驱动配置,用于链路预算计算——否则现场覆盖规划与实测会系统性偏差 2–3dB。
/* 应用层的一次上行发送(伪代码,省略错误处理) */ radio_lock(); /* 串行访问射频,防并发 */ SX126xSetRfFrequency(868100000); SX126xSetModulationParams(MOD_LORA, DR.toSF(), DR.toBW(), CR_4_5, 0); SX126xSetPacketParams(/* 前导码 8、隐式头关闭、CRC 开 */); SX126xSetTxParams(power_dbm, RADIO_RAMP_200US); SX126xWriteBuffer(payload, len); /* 写入要发的字节 */ SX126xSetTx(0); wait_irq(IRQ_TX_DONE, timeout_ms); /* 超时要复位芯片,否则卡死 */ radio_unlock();
实际项目里最常见的适配工作是从旧芯片 SX1276/SX1278 迁移到新芯片 SX1261/SX1262。差异集中在三处,其余 API 可保持兼容。
| 项目 | SX1276/1278 | SX1261/1262 | 移植要点 |
|---|---|---|---|
| 控制接口 | SPI + DIO 中断(3 根 DIO) | SPI + 单根 DIO 或 Busy 查询 | 中断引脚数减少,事件映射要重排 |
| 寄存器访问 | 直接读写寄存器 | 命令字 + 参数缓冲(SetPacketType 等) | 驱动层整体重写寄存器操作 |
| 频率换算 | Fstep = 61.03515625Hz | 相同 | 常数不变,但要确认写入顺序 |
| 发射功率上限 | +20dBm(1278) | +22dBm(1262) | 法规上限仍按区域表封顶 |
| 调制配置 | RegModemConfig1/2 | SetModulationParams 命令 | API 形态完全不同 |
| 低功耗模式 | Sleep 模式寄存器 | Sleep 模式命令 + 保留配置 | 唤醒后要重新配置部分参数 |
移植检查清单(按顺序执行):SPI 时序与 Busy 引脚 → 中断映射与事件注册 → 频率/功率换算常数 → 调制与包参数命令序列 → 收发状态机 → 功耗模式切换 → 灵敏度抽测对比。每完成一步就做一次收发回环测试,不要攒到最后一次性验证。
/* 射频芯片上电后的标准初始化(SX126x) */ SX126xReset(); /* 复位引脚时序 */ SX126xStandby(0); /* 进入待机 */ SX126xSetPacketType(MOD_LORA); /* 指定 LoRa 模式 */ SX126xSetRfFrequency(868100000); /* 频率 */ SX126xSetModulationParams(MOD_LORA, SF10, BW125K, CR_4_5, 0); SX126xSetPacketParams(8, 0, 0, 1, 0, 0, 0); /* 前导8、隐式头关、CRC开 */ SX126xSetDIO2AsRfSwitchCtrl(true); /* DIO2 控制收发开关 */ SX126xSetDIO3AsTCXOCtrl(TCXO_CTRL_1_7V); /* 温补晶振供电控制 */ SX126xCalibrate(0x7F); /* 全量校准 */ SX126xSetTxParams(14, RADIO_RAMP_200US); /* 功率与爬坡时间 */
这个序列里最容易漏的是 DIO2 射频开关控制与 DIO3 晶振供电——漏配任何一项,表现都是"芯片上电正常但收不到/发不出",且极难通过逻辑分析仪之外的途径定位。
要点回顾:HAL 封装调制、频率、功率、收发四类操作;寄存器级适配要盯住频率换算、功率封顶、灵敏度校准三处;收发流程要处理超时与并发。下一节上升到 MAC 层,看帧结构里每个字节都记在什么账上。