无线收发器如何实现超长前导码发送?

转发请注重原创出处,谢谢!

有些应用,需要发送很长的前导码,例如发送持续1秒钟的AA AA …前导码,或者500bit或者1000字节的前导码,唤醒处于LDC状态的设备等等。但是Silicon Labs sub-GHz无线收发器Si446x控制前导码长度的寄存器只有1个字节,最长只可发送255字节的前导码,这种超长的前导码该如何发送呢?

 

首先我们来分析si446x的数据包格式(图1),一个完整的无线数据包由前导码,同步字,数据负载,在加上CRC校验(可选),共4部分组成。

 

                                

                                                                  图1:si446x的数据包格式

 

前导码:正常的数据包,前导码不会太长,通常在4字节到12字节左右。本文以WDS软件中默认的8字节为例。

同步字:可设置为1字节到4字节,本文以2字节为例。

 

数据负载:F1L+F2是数据负载区域,本文以变长包,F1L为1字节为例,用于变长包的数据长度指示。F1L容易和field1 的长度混淆,在此,就把F1L当成1字节的数据即可。

 

CRC校验:本文以不加CRC校验为例,此处忽略。

 

从以上数据格式,我们给出一个正常的数据包作为参考:

---------------------------------------------------------------------------

AA AA AA AA AA AA AA AA 2D D4 07 01 02 03 04 05 06 07

解析如下:

AA AA AA AA AA AA AA AA :8字节长度前导码;

2D D4 同步字;

07 01 02 03 04 05 06 07:负载数据

---------------------------------------------------------------------------

如果我们要发送一个超长的前导码的数据包,就可按照以下思路实现,注意区分颜色:

AA AA AA AA AA AA AA AA AA AA AA AA AA………AA AA AA 2D D4 07 01 02 03 04 05 06 07

解析如下:

AA AA:把原来同步字2D D4位置换成了前导码 AA AA;

AA AA AA………AA AA AA:数据前半段填充前导码发送出去,例如990字节的AA AA;

2D D4 07 01 02 03 04 05 06 07:用户数据。

---------------------------------------------------------------------------

那么我们来算算一共发送了多少字节的前导码,8字节AA AA AA AA AA AA AA AA + 2字节 AA AA + 990字节 AA AA AA………AA AA AA  = 1000字节具体需要发送多少字节的AA AA 前导码,请根据通信速率和前导码持续的时间来反算。算出了总共需要的前导码长度,然后减去8字节,再减去2字节,剩下的就是需要放到数据区域去发送的那一部分。

 

下面我们介绍具体的代码实现:

1、修改同步字为AA AA  :

同步字在空中传输时会高低位反向,需要用WDS来算出API命令应该填入的值。如下:

si446x_set_property( 0x11,0x04,0x01,0x55,0x55,0x00,0x00);//设置同步字AA AA

因为同步字最多可用4字节,如果只用到两字节,后面的就写0x00.

如果需要回到正常短前导码数据包发送,同步字需修改为原来的,例如2D D4

si446x_set_property( 0x11,0x04,0x01,0xB4,0x2B,0x00,0x00);//设置同步字2D D4

 

2、修改数据区域的发送长度。

我们需要准确的计算出需要发送的数据长度。

990字节的前导码 + 2字节的同步字 + N字节的数据 = M字节

除去原本8字节的前导码,2字节的同步字(已改成了AA AA),还有990字节的AA AA + 2字节同步字 + 8字节的负载数据需要发送,一共是M字节(本文1000字节为例)。因为负载数据在实际应用时,长度会随时变化,这部分要计算准确,否则会影响数据发送。

 

从以上计算,我们得出F1L + F2区域一共需要发1000字节,为了简单起见,可以减少修改寄存器,因为是变长包收发,F1L保持1字节长度不做任何修改,那么F2区域的需要发的长度就是M-1字节(本文999字节)。以后代码中需要修改的长度也仅仅是F2区域的,每个field区域的长度是13bit表示,因此M值最大不要超过13bit。

代码如下:

si446x_set_property(0x12,0x02,0x11,M-1高字节,M-1低字节);

常长前导码的数据包发送,原理是简单的。关键就是如何准确的计算F1L和F2区域的长度,以及同步字处理。注意,在同步字2D D4写到F2区域去发送的时候,是当成数据来看的,因此不需要高低位反向,直接把2D D4填入FIFO发送即可。

 

参考文档:

由于本文实现需要使用到超长数据包发送,边长数据包收发,更多详细的文档请参考:

1、《编程技巧:轻松实现si446x超长数据包收发》

2、《仅需3步,轻松实现Si446x无线收发器的变长包收发》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值