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

前言

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

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

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

本文作者twowinter,转载请注明作者:http://blog.csdn.net/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的耗时计算,但此处略过先不提。

代码语言:javascript
复制
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,那计算则要复杂多了。

代码语言:javascript
复制
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.