SX1276 FSK模式下的空中耗时计算

前言

最近和国内某大厂对接了一个项目,计划采用TDMA协议架构,单时隙长度为2ms。这时间要求远比LoRaWAN Class B的时隙间隔快多了,此场景下LoRa不适用,决定采用SX1278的另一种调制方式 – FSK。

抽空研究了FSK的空中耗时,因此做个笔记分享下,看过这篇文章将会对FSK调制的空中耗时有个大致概念。

同时,很多朋友常问我这样的问题,ZigBee每秒可以发多少字节? SX1276每秒可以发多少字节? 其实没那么深奥,就是简单的 数据量/速率 = 时长。看过这篇文章,也将了解到基本计算原理,以后可以自己动手来计算咯。

本文作者twowinter,转载请注明作者:http://blog.youkuaiyun.com/iotisan/

SX1276 FSK 的帧长度

要分析空中耗时,肯定要先了解到具体的数据长度,从了应用层载荷之外,物理层帧格式还需要多少字节。

学习了datasheet,总结SX1276的FSK有两种帧格式。

初步以可变帧长度来分析,大致包括如下部分:

i.前导码 PreambleLen :0~65535 字节 // 常见的是4字节前导码。LoRa官方例程是5字节。
ii.同步字 SyncSize :0~8 字节 // 可以为0,特别是大规模网络,信道已然很拥堵,可将该Size降为0。
iii.固定长度 FixLen: 0 或者 1 字节 // 可变帧模式时,此位要占用1字节。
iv.地址域 NodeAddress:0 或者 1 字节 // 如果应用层有自己协议,这边就可以省略,本质上这也是应用层。
v.应用层载荷:
vi.校验域 CrcOn: 0 或者 2 字节 // 如果应用层校验,这边就不校验。

因此FSK的物理层要占用5~8字节,先初步认为是8字节。

FSK模式的空中耗时计算

对数据量有了大致把握后,就可以根据速率进行时长的计算。在讨论FSK的耗时计算前,我们先从github上看到了SX1276的空中耗时计算函数。这其中还包含了LoRa的耗时计算,但此处略过先不提。


uint32_t SX1276GetTimeOnAir( RadioModems_t modem, uint8_t pktLen )
{
    uint32_t airTime = 0;

    switch( modem )
    {
    case MODEM_FSK:
        {
            airTime = round( ( 8 * ( SX1276.Settings.Fsk.PreambleLen +
                                     ( ( SX1276Read( REG_SYNCCONFIG ) & ~RF_SYNCCONFIG_SYNCSIZE_MASK ) + 1 ) +
                                     ( ( SX1276.Settings.Fsk.FixLen == 0x01 ) ? 0.0 : 1.0 ) +
                                     ( ( ( SX1276Read( REG_PACKETCONFIG1 ) & ~RF_PACKETCONFIG1_ADDRSFILTERING_MASK ) != 0x00 ) ? 1.0 : 0 ) +
                                     pktLen +
                                     ( ( SX1276.Settings.Fsk.CrcOn == 0x01 ) ? 2.0 : 0 ) ) /
                                     SX1276.Settings.Fsk.Datarate ) * 1e3 );
        }
        break;
    case MODEM_LORA:
        {
		...
		}
		break;
    }
    return airTime;
}

经过上一节的帧格式解析,我们对FSK格式的前导码、同步字等等概念都有了理解。因此将这个公式精简一下,转化过来:

airTime = 8 * FSK数据帧长度 / 速率 * 1e3,速率单位为bps。

这个乘数8是配合比特率转化为字节率,1e3只是配合将速率单位中的s换算成ms。所以本质上,这个函数公式就是 帧长度/速率 得到 空中耗时,也就是简单的 数据量/速率 = 时长

举个例子来算算

现在来个例子,加深下印象。

如果FSK调制工作在250Kbps速率下,假设应用层载荷长度为20字节。
那么可以计算出空中大致耗时为,8*(20+8)/250=0.9ms

实际耗时还要再考虑一些因素

前面已经基本了解了空中耗时的计算方法。但这个耗时还只是个理论值,实际情况还要考虑多重因素。

实际发送数据时先要对SX1276进行多条的SPI操作,操作完毕SX1276还需要等待晶振响应,准备锁相环,之后才能发出数据。如下图所示:

这个等待晶振响应的TS_OSC大致为250us,准备锁相环的TS_FS大致为60us,再加上SPI操作预估大致也需要几十us,所以原本250Kbps下20字节的耗时就会从0.9ms变长到1.3ms左右。

拓展开,说说ZigBee的耗时

FSK还只是个物理层调制,简单粗暴,不用考虑重传,不用考虑路由寻址等等。如果换成同样250Kbps速率的ZigBee,那计算则要复杂多了。

ZigBee resides on IEEE 802.15.4 transceivers, which in the 2.4 GHz space communicate at 250 kilobits per second (kbps), but by the time retries, encryption/decryption, and the fully acknowledged mesh protocol is applied, the actual through-put is closer to 25 kbps.

ZigBee物理层为IEEE 802.15.4,速率确实能达到250kbps,但是考虑重传、编解码、mesh协议等等因素,实际的速率约为 25 kbps。

End

That’s all.


<think>嗯,用户想了解如何实现SX1276的低功耗模式。首先,我需要回忆一下SX1276芯片的基本特性和低功耗相关的功能。SX1276是Semtech公司的一款LoRa调制技术的射频芯片,常用于物联网设备中,低功耗对于这类设备非常重要。 首先,我应该考虑SX1276的工作模式。根据手册,SX1276有不同的工作模式,比如睡眠模式、待机模式、接收模式和发送模式等。低功耗模式通常指的是在不需要通信时切换到睡眠模式或者待机模式,以降低功耗。 接下来,用户可能需要知道具体的操作步骤。例如,如何通过寄存器配置来切换模式SX1276通过SPI接口进行控制,主要的操作寄存器是OpMode(操作模式寄存器)。需要设置RegOpMode中的Mode位来切换不同的模式。 然后,可能涉及到如何进入睡眠模式。将Mode位设置为Sleep模式,这时候芯片的功耗最低。但需要注意,在切换模式之前,可能需要完成当前的操作,比如发送或接收完成,否则可能会有问题。 另外,待机模式也是一个低功耗的选择,虽然比睡眠模式耗电稍高,但唤醒时间更短。用户可能需要根据应用需求选择不同的模式。例如,如果设备需要快速响应,待机模式可能更合适;如果对响应时间要求不高,睡眠模式可以进一步降低功耗。 还有,LoRa模式FSK模式下的功耗可能不同,需要确认用户使用的是哪种调制方式。通常LoRa模式在接收时的功耗较高,所以合理设置接收超时时间,或者使用轮询的方式而不是持续接收,可以节省功耗。 此外,其他外设的电源管理也很重要。比如,当SX1276进入低功耗模式时,微控制器是否可以进入低功耗状态,以及如何协调两者的唤醒周期。比如,使用中断唤醒MCU,再由MCU控制SX1276的工作状态。 还需要考虑天线开关、射频开关等外围电路的功耗,确保在低功耗模式下这些电路也被正确关闭或进入省电状态。 可能用户还会遇到配置后功耗没有明显下降的问题,这时候需要检查寄存器配置是否正确,是否有未关闭的功能模块,或者硬件电路中的其他部分是否在耗电。 另外,温度传感器、看门狗定时器等模块如果不需要的话,也应该关闭,以进一步减少功耗。 最后,应该提醒用户实际测试功耗,使用电流表测量不同模式下的电流消耗,确保配置正确,并优化唤醒策略,比如延长唤醒间隔,减少不必要的通信次数。</think>实现SX1276的低功耗模式需结合硬件配置和软件策略,以下是分步说明: --- ### **1. 理解SX1276工作模式** SX1276支持多种模式,功耗由高到低排序: - **发射模式 (TX)**: 功耗最高(约120mA@20dBm) - **接收模式 (RX)**: 约10-15mA(持续接收) - **待机模式 (Standby)**: 约1.5mA - **睡眠模式 (Sleep)**: 最低功耗(约0.2μA) --- ### **2. 硬件配置关键点** - **关闭未用外设**: - 禁用温度传感器(若不需要):设置`RegOpMode`的`LongRangeMode`位为LoRa模式后,温度传感器默认关闭。 - 关闭射频前端电路:通过`RegPaConfig`寄存器禁用PA(功率放大器)和LNA(低噪声放大器)。 - **优化电源管理**: - 使用低功耗MCU,并在SX1276休眠时同步进入MCU低功耗模式(如STM32的Stop模式)。 - 通过GPIO控制SX1276的`RESET`引脚,必要时彻底断电。 --- ### **3. 软件配置步骤** #### **步骤1:切换至睡眠模式** 通过SPI写入`RegOpMode`寄存器: ```c // 设置Mode[2:0] = 000(睡眠模式) uint8_t op_mode = read_spi(REG_OPMODE); op_mode &= ~0x07; // 清空低3位 write_spi(REG_OPMODE, op_mode); ``` #### **步骤2:禁用接收/发射电路** - 关闭接收机:设置`RegOpMode`的`RX`模式位为0。 - 关闭发射机:设置`RegOpMode`的`TX`模式位为0。 #### **步骤3:配置唤醒策略** - **定时唤醒**:利用MCU定时器周期性唤醒SX1276,检查通信需求。 - **事件触发唤醒**:通过DIO引脚中断唤醒(如`DIO0`配置为唤醒信号)。 --- ### **4. 功耗优化技巧** - **缩短接收窗口**: - 使用`RxTimeout`寄存器设置接收超时(例如100ms),超时后自动返回睡眠。 - 计算公式:$$ \text{RxTimeout} = \frac{\text{时间(ms)}}{15.625} $$ - **降低发射功率**: - 通过`RegPaConfig`调整输出功率(如从20dBm降至10dBm,电流从120mA降至30mA)。 - **禁用侦听前导码检测**: - 设置`RegModemConfig2`的`SymbTimeout`为最小值,减少持续监听时间。 --- ### **5. 实测验证** - **电流测量**: - 睡眠模式:用万用表测量电流应接近0.2μA。 - 异常高功耗时,检查SPI总线是否漏电或GPIO引脚配置。 --- ### **6. 示例代码片段** ```c void enter_sleep_mode() { // 切换到睡眠模式 write_spi(REG_OPMODE, 0x80); // LoRa模式 + Sleep // 关闭射频电路 write_spi(REG_PACONFIG, 0x00); // 禁用PA // 配置MCU进入低功耗 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); } ``` --- ### **常见问题** - **无法唤醒**:检查DIO中断配置和MCU唤醒源。 - **睡眠后寄存器复位**:确保`RegOpMode`的`Sleep`位正确写入,避免SPI时序错误。 通过以上方法,SX1276可实现在物联网设备中μA级待机功耗,显著延长电池寿命。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值