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

来源:互联网 发布:网络语言的利与弊 编辑:程序博客网 时间:2024/05/22 12:53



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


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


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


本文作者twowinter,转载请注明作者。


SX1276 FSK 的帧长度


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


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




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


  1. 前导码 PreambleLen :0~65535 字节 // 常见的是4字节前导码。LoRa官方例程是5字节。

  2. 同步字 SyncSize :0~8 字节 // 可以为0,特别是大规模网络,信道已然很拥堵,可将该Size降为0。

  3. 固定长度 FixLen: 0 或者 1 字节 // 可变帧模式时,此位要占用1字节。

  4. 地址域 NodeAddress:0 或者 1 字节 // 如果应用层有自己协议,这边就可以省略,本质上这也是应用层。

  5. 应用层载荷:

  6. 校验域 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.