【经验】Si4438无线收发芯片调试收发超长数据包的过程
本文依据【经验】仅需3步,轻松实现Si446x无线收发器的变长包收发 和 编程技巧:轻松实现Si446x超长数据包收发 两篇文章,使用SILICON LABS无线收发芯片Si4438调试收发超长数据包的功能,介绍Si4438如何实现收发超长数据包的过程,方便用户快速实现超长数据包收发功能。
1、下载 Silicon Labs(芯科科技)Si446x模拟SPI接口以及radio驱动代码,并将radio驱动代码Si446x_Drivers文件夹中的代码全部移植到主控MCU程序中。
2、打开WDS软件,选择Empty framework工程,点击Packet,在Packet config页面,确认Packet TX threshold和Packet RX threshold的长度,默认都是48个字节,可以根据实际需要修改长度。
3、点击Variable length config,勾选Enable variable packet length,确认Enable variable packet length下面的参数跟下图红框中的参数一样;总共使用两个field,field 1存放数据的长度,field 2存放数据。
4、点击Interrupts,勾选Packet Handler HW interrupt下面的Enable,点击PSNT使能包发送完成中断,点击PRX使能包接收完成中断,点击TFAE使能发送缓存区几乎空中断,点击RFAF使能接收缓存区几乎满中断,根据实际应用确认是否需要点击CRCE使能CRC校验错误中断。
5、WDS中的其他无线参数根据实际需求配置,点击WDS软件右下角的Generate source,再点击Save custom radio configuration header file;
找到刚才移植到主控MCU程序的radio驱动代码中的radio_config.h文件,点击radio_config文件,再点击保存;
在询问是否替换的页面点击“是”,将radio驱动代码中的radio_config.h文件替换为WDS软件新生成的文件。
6、将radio.h文件中的RADIO_MAX_PACKET_LENGTH改为0xFF,虽然Si4438使用超长包收发数据,理论上每个field可设置的最大长度是2的13次方(8192个字节),但是实际使用中,一般建议每包数据最长不用要超过255个字节,减少丢包的可能性;增加ALMOST EMPTY和ALMOST FULL长度的宏定义,具体长度需要设置跟WDS中的Packet TX threshold和Packet RX threshold一样。
#define RADIO_FIFO_ALMOST_EMPTY_LENGTH 48
#define RADIO_FIFO_ALMOST_FULL_LENGTH 48
7、在radio.h中增加代码“extern U8 customRadioPacket[RADIO_MAX_PACKET_LENGTH]; ”,方便在其他文件中调用customRadioPacket[]数组。
8、打开radio.c文件,如果跟Si4438通信的主控MCU不需要code和xdata来定义变量,可以分别把Radio_Configuration_Data_Array[]前面的code和customRadioPacket[]前面的xdata删除。
9、在radio.c文件中,添加如下变量:
U8 u8NeedSendDataLength = 0;
U8 u8AlreadySendDataLength = 0;
U8 u8NeedRecieveDataLength = 0;
U8 u8AlreadyRecieveDataLength = 0;
10、在radio.c文件的bRadio_Check_Tx_RX()函数中,增加SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_TX_FIFO_ALMOST_EMPTY_PEND_BIT事件的处理代码;当Si4438产生ALMOST EMPTY中断时,MCU判断还需要发送多少字节的数据,并往Si4438的TX FIFO填充数据。
if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_TX_FIFO_ALMOST_EMPTY_PEND_BIT)
{
if((u8NeedSendDataLength - u8AlreadySendDataLength) > 0)
{
if(u8NeedSendDataLength - u8AlreadySendDataLength >= RADIO_FIFO_ALMOST_EMPTY_LENGTH)
{
si446x_write_tx_fifo(RADIO_FIFO_ALMOST_EMPTY_LENGTH, &customRadioPacket[u8AlreadySendDataLength]);
u8AlreadySendDataLength += RADIO_FIFO_ALMOST_EMPTY_LENGTH;
}
else
{
si446x_write_tx_fifo(u8NeedSendDataLength - u8AlreadySendDataLength, &customRadioPacket[u8AlreadySendDataLength]);
u8AlreadySendDataLength += (u8NeedSendDataLength - u8AlreadySendDataLength);
}
}
}
11、在radio.c文件的bRadio_Check_Tx_RX()函数中,增加SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_RX_FIFO_ALMOST_FULL_PEND_BIT事件的处理代码;当Si4438产生ALMOST FULL中断时,MCU读取Si4438的RX FIFO中数据。
if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_RX_FIFO_ALMOST_FULL_PEND_BIT)
{
si446x_read_rx_fifo(RADIO_FIFO_ALMOST_FULL_LENGTH, &customRadioPacket[u8AlreadyRecieveDataLength]);
u8AlreadyRecieveDataLength += RADIO_FIFO_ALMOST_FULL_LENGTH;
}
12、在radio.c文件bRadio_Check_Tx_RX()函数的SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT事件中,将“si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, &customRadioPacket[0]);”改为”si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, &customRadioPacket[u8AlreadyRecieveDataLength]); ”,并增加代码“u8AlreadyRecieveDataLength = 0;”。
13、在radio.c文件的vRadio_StartRX()函数中,添加代码“si446x_set_property(0x12, 0x02, 0x11, 0x00, RADIO_MAX_PACKET_LENGTH);”,设置field 2的长度为RADIO_MAX_PACKET_LENGTH。
14、将radio.c文件的vRadio_StartTx_Variable_Packet()函数修改为如下代码。由于在WDS中使用了field 1来存放需要发送数据的长度,使用field 2存放需要发送的数据,所以在调用si446x_set_property()设置的field 2长度,需要比调用si446x_write_tx_fifo()写入tx fifo的数据少一个字节;在超长数据发送模块下,发送数据的长度由field 1决定,所以在调用si446x_start_tx()发送数据时,把这个函数的数据长度参数写0。
void vRadio_StartTx_Variable_Packet(U8 channel, U8 *pioRadioPacket, U8 length)
{
/* Clears the length of data that has been sent */
u8AlreadySendDataLength = 0;
/* The length of all data that needs to be sent */
u8NeedSendDataLength = customRadioPacket[0] + 1;
/* Leave RX state */
si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEXT_STATE1_NEW_STATE_ENUM_READY);
/* Read ITs, clear pending ones */
si446x_get_int_status(0u, 0u, 0u);
/* Set Field_2 length */
si446x_set_property(0x12, 0x02, 0x11, 0x00, customRadioPacket[0]);
/* Reset the Tx Fifo */
si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_FIFO_TX_BIT);
if(u8NeedSendDataLength >= RADIO_FIFO_ALMOST_EMPTY_LENGTH)
{
/* Fill the TX fifo with datas */
si446x_write_tx_fifo(RADIO_FIFO_ALMOST_EMPTY_LENGTH, customRadioPacket);
u8AlreadySendDataLength += RADIO_FIFO_ALMOST_EMPTY_LENGTH;
}
else
{
/* Fill the TX fifo with datas */
si446x_write_tx_fifo(u8NeedSendDataLength, customRadioPacket);
u8AlreadySendDataLength += u8NeedSendDataLength;
}
/* Start sending packet, channel 0, START immediately */
si446x_start_tx(channel, 0x80, 0);
}
15、需要让Si4438发送数据时,先把需要发送的数据复制到customRadioPacket[]数组,确保customRadioPacket[0]存放的是需要发送数据的长度,然后调用“vRadio_StartTx_Long_Packet(0, 0, 0);”函数将数据发送出去。
16、在while循环中调用bRadio_Check_Tx_RX()读取radio中断状态,当读取到SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT事件时,就可以从customRadioPacket[]数组读取接收到的无线数据,customRadioPacket[0]存放接收到的数据长度。
17、将编译好的程序烧录到MCU后,测试发射模块发送80(0x50)个字节的数据,接收模块可以收到80个字节正确的数据。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由潮汕小菜提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
相关推荐
【经验】Silicon Labs无线收发芯片Si4463如何区分芯片版本号?
Si4463是Silicon Labs设计的支持Sub-G频段的无线收发芯片。目前Si4463芯片有B1和C2两种版本,这两个版本芯片radio驱动代码的si446x_patch.h和radio_config.h文件有差别。本文主要介绍Si4463芯片区分芯片版本号的方法。
设计经验 发布时间 : 2021-01-12
【经验】使用Si4463或者Si4438无线收发芯片来解析其他无线设备通信速率的方法
本文使用EFR32FG23无线SoC芯片来模拟老产品,通过按键来触发EFR32FG23芯片发送无线数据包,然后使用Si4438芯片来捉取波形,并介绍使用Si4438无线收发芯片来解析其他无线设备通信速率的方法。
设计经验 发布时间 : 2023-04-19
【经验】在芯科无线收发芯片Si4463开发板的工程中添加串口打印功能的方法
本文以芯科无线收发芯片Si4463开发板的Empty framework工程为例,介绍在Empty framework工程添加串口打印接收到的数据包功能的方法。
设计经验 发布时间 : 2023-03-14
【经验】芯科科技Si4463无线收发芯片硬件设计使用射频开关和不使用射频开关的区别介绍
Si4463是Silicon Labs推出的支持Sub-G频段的无线收发芯片,频率范围142-1050 MHz,最大发射功率为+20dBm,接收灵敏度为-126dBm。在设计Si4463硬件的时候,有使用射频开关和不使用射频开关两种方案可以选择,本文主要介绍这两种方案区别,方便用户选择适合自己产品的方案。
设计经验 发布时间 : 2020-06-30
【经验】芯科Si4463无线收发芯片使用ADC读取芯片内部温度的方法
Silicon Labs的Si4463无线收发芯片内部有一个温度传感器,我们可以使用ADC来读取芯片内部的温度,本文主要介绍如何使用ADC读取Si4463芯片温度的方法。
设计经验 发布时间 : 2022-11-02
【经验】如何通过无线收发芯片Si4438将数据发送到无线SOC芯片EFR32FG23
Silicon Labs推出的EFR32FG23是一款工作在1G赫兹频段以下的一款无线SOC芯片。它的射频参数及其工作频段可以通过软件进行配置,本次主要介绍如何通过Si4438将数据发送到EFR32FG23。
设计经验 发布时间 : 2022-08-31
【应用】Sub-G通讯的Si4463无线收发芯片用于无线测温模块,采用私有协议、小于50nA的待机功耗
本文主要介绍目前大量无线测温模块上使用的无线Sub-G通讯方案,特别是Silicon Labs的无线收发芯片Si4463方案,相对于其他无线技术方案,其特点在于芯片工作在Sub-G频段,通讯距离远;采用私有协议,产品开发更加灵活;待机功耗在50nA以下,功耗极低。
应用方案 发布时间 : 2020-04-01
【应用】宽空中速率的无线收发芯片Si4438在无人机远距离遥控中的应用
远距离遥控应用一直是无人机设计中的一个巨大的挑战。而世强推荐Silicon Labs的433M/915MHz应用方案解决了无人机遥控距离短的缺陷。
新应用 发布时间 : 2016-12-24
【应用】芯科无线收发芯片SI4438应用于路灯控制器,工作频段425–525MHz,实现业界领先的144dB链路预算
智慧城市智能路灯是将城市中的路灯串联起来,实现对路灯的远程控制和管理,控制各个路灯的开与关,而同时能控制上千个路灯实现这一功能我们管它叫路灯控制器,里面用到的主要器件无线收发芯片,本文推荐在这块有大量应用的Silicon Labs的SI4438。
应用方案 发布时间 : 2022-08-19
【经验】Si4438无线收发芯片使用同步直接模式收发数据的方法
Silicon Labs Si4438无线收发芯片在某些不适合使用FIFO模式的应用中,可以使用直接模式(direct mode)来收发无线数据。本文主要介绍Si4438如何使用同步直接模式收发数据的方法。
设计经验 发布时间 : 2021-06-08
【经验】无线收发芯片Si4463收发无前导码数据包的实现方法
Si4463是Silicon Labs设计的支持Sub-G频段的无线收发芯片,在双向通信的无线门铃应用中,由于某些无线门铃使用OOK调制模式,私有协议的数据包,且这些数据包无前导码,所以要求Si4463芯片能够收发无前导码的数据包。本文以“Empty framework”工程为例,介绍Si4463芯片收发无前导码数据包的实现方法。
设计经验 发布时间 : 2020-10-10
【经验】无线SoC芯片EFR32FG14和无线收发芯片Si4463实现互相通信的配置方法
在某些应用中,可以把Silicon Labs的无线SoC芯片EFR32FG14用于主机,无线收发芯片Si4463用于从机,因此需要让EFR32FG14和Si4463芯片相互通信。本文主要介绍如何配置EFR32FG14和Si4463的参数,让这两款芯片实现相互通信。
设计经验 发布时间 : 2020-09-10
双模通道板上面使用Si4438做无线收发芯片,Si4438和Si4463有什么区别?
1、收发频率范围不一样,Si4438是425-525M,Si4463是119-1050M;2、接收灵敏度Si4463会比Si4438好点,Si4463是-126dbm,Si4438是-124dbm;3、数据传输速率不一样,Si4438是100bps-500kbps,Si4463是0.123kbps-1Mbps。
技术问答 发布时间 : 2017-05-10
在使用无线收发芯片Si4438的无线抄表模块发送数据的时候,需要先检测RSSi的值,如何读取实时的RSSi值?
1、把Si4438的状态切换到Ready;2、采用函数Si446x_get_modem_status(0x22);RSSiVAL = Si446xCmd.GET_MODEM_STATUS.CURR_RSSi,来读取实时的RSSi值。
技术问答 发布时间 : 2017-05-10
【应用】支持Sub-G频段的Si4463无线收发芯片用于无线温控器,待机功耗低于50nA
温控器,通常是指用于水采暖,壁挂炉、电供热或者中央空调温度控制器。无线温控器越来越多地应用起来,例如Wifi、Zigebee、Z-Wave、Sub-G等,主要优势是设备安装方便,铺设成本更低。本文主要介绍目前大量使用的Silicon Labs的无线收发芯片Si4463无线Sub-G通讯方案,让产品开发更加快捷。
应用方案 发布时间 : 2020-01-04
电子商城
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
Ignion可支持多协议、宽频段的物联网天线方案设计,协议:Wi-Fi、Bluetooth、UWB、Lora、Zigbee、2G、3G、4G、5G、CBRS、GNSS、GSM、LTE-M、NB-IoT等,频段范围:400MHz~10600MHz。
最小起订量: 2500 提交需求>
世强深圳实验室提供Robei EDA软件免费使用服务,与VCS、NC-Verilog、Modelsim等EDA工具无缝衔接,将IC设计高度抽象化,并精简到三个基本元素:模块、引脚、连接线,自动生成代码。点击预约,支持到场/视频直播使用,资深专家全程指导。
实验室地址: 深圳 提交需求>
登录 | 立即注册
提交评论