【经验】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
本文由潮汕小菜提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
相关推荐
【经验】使用Si4463或者Si4438无线收发芯片来解析其他无线设备通信速率的方法
本文使用EFR32FG23无线SoC芯片来模拟老产品,通过按键来触发EFR32FG23芯片发送无线数据包,然后使用Si4438芯片来捉取波形,并介绍使用Si4438无线收发芯片来解析其他无线设备通信速率的方法。
【经验】Silicon Labs无线收发芯片Si4463如何区分芯片版本号?
Si4463是Silicon Labs设计的支持Sub-G频段的无线收发芯片。目前Si4463芯片有B1和C2两种版本,这两个版本芯片radio驱动代码的si446x_patch.h和radio_config.h文件有差别。本文主要介绍Si4463芯片区分芯片版本号的方法。
【经验】在芯科无线收发芯片Si4463开发板的工程中添加串口打印功能的方法
本文以芯科无线收发芯片Si4463开发板的Empty framework工程为例,介绍在Empty framework工程添加串口打印接收到的数据包功能的方法。
【经验】芯科科技Si4463无线收发芯片硬件设计使用射频开关和不使用射频开关的区别介绍
Si4463是Silicon Labs推出的支持Sub-G频段的无线收发芯片,频率范围142-1050 MHz,最大发射功率为+20dBm,接收灵敏度为-126dBm。在设计Si4463硬件的时候,有使用射频开关和不使用射频开关两种方案可以选择,本文主要介绍这两种方案区别,方便用户选择适合自己产品的方案。
【经验】芯科Si4463无线收发芯片使用ADC读取芯片内部温度的方法
Silicon Labs的Si4463无线收发芯片内部有一个温度传感器,我们可以使用ADC来读取芯片内部的温度,本文主要介绍如何使用ADC读取Si4463芯片温度的方法。
【经验】如何通过无线收发芯片Si4438将数据发送到无线SOC芯片EFR32FG23
Silicon Labs推出的EFR32FG23是一款工作在1G赫兹频段以下的一款无线SOC芯片。它的射频参数及其工作频段可以通过软件进行配置,本次主要介绍如何通过Si4438将数据发送到EFR32FG23。
【经验】Sub-G无线收发芯片Si4463实现自动跳频接收的具体方法
Si4463是Silicon Labs推出的支持Sub-G频段无线收发芯片。随着生活中的无线产品越来越多,大量的Sub-G产品集中运行在有限的频谱上,导致无线产品工作的电磁环境越来越恶劣,甚至严重影响到无线数据通信的稳定性。因此,越来越多的Sub-G产品需要采用跳频方式来解决通信干扰问题。本文介绍无线收发芯片Si4463如何实现自动跳频接收的具体方法。
Si446x 无线收发芯片实现空闲信道检查(CCA)的办法有哪些?
Si446x 无线收发芯片实现空闲信道检查(CCA)的办法有以下3种:方法1:任意选择Si446x的一个GPIOx引脚,配置成CCA输出模式,并设定RSSi阀值,只要信道的实时RSSi值超过了阀值,GPIO就会输出高电平,代表信道忙,反之信道空闲。这个方法完全由Si446x硬件完成,使用简单快速,推荐优先选择这种办法。办法2:主控MCU通过SPI执行GET_MODEM_STATUS命令,获取实时的RSSi值,然后通过软件代码判断这个RSSi是否超过阀值,如果大于阀值就表示信道忙。办法3:设定好Si446x的RSSi阀值,开启RSSi中断。如果实时的RSSi值超过了阀值,就会产生RSSi中断,通过查询RSSi中断也可以实现信道的闲忙检测。
【应用】芯科无线收发芯片SI4438应用于路灯控制器,工作频段425–525MHz,实现业界领先的144dB链路预算
智慧城市智能路灯是将城市中的路灯串联起来,实现对路灯的远程控制和管理,控制各个路灯的开与关,而同时能控制上千个路灯实现这一功能我们管它叫路灯控制器,里面用到的主要器件无线收发芯片,本文推荐在这块有大量应用的Silicon Labs的SI4438。
【应用】宽空中速率的无线收发芯片Si4438在无人机远距离遥控中的应用
远距离遥控应用一直是无人机设计中的一个巨大的挑战。而世强推荐Silicon Labs的433M/915MHz应用方案解决了无人机遥控距离短的缺陷。
【经验】Si4438无线收发芯片使用同步直接模式收发数据的方法
Silicon Labs Si4438无线收发芯片在某些不适合使用FIFO模式的应用中,可以使用直接模式(direct mode)来收发无线数据。本文主要介绍Si4438如何使用同步直接模式收发数据的方法。
【应用】低功耗小体积无线收发芯片用于温控器,宽工作频率284~960MHz,输出功率达13dBm
温控器的工作过程是先根据温度传感器测得的温度数据,跟预先设定的温度条件做比较后,控制热水阀和冷水阀的开度,从而实现温度的控制。芯科科技(Silicon Labs)的无线收发芯片SI4455-C2A-GMR用在温控器的设计上有高性能、低功耗和体积小等特点。
【经验】无线收发芯片Si4463收发无前导码数据包的实现方法
Si4463是Silicon Labs设计的支持Sub-G频段的无线收发芯片,在双向通信的无线门铃应用中,由于某些无线门铃使用OOK调制模式,私有协议的数据包,且这些数据包无前导码,所以要求Si4463芯片能够收发无前导码的数据包。本文以“Empty framework”工程为例,介绍Si4463芯片收发无前导码数据包的实现方法。
【应用】Sub-G通讯的Si4463无线收发芯片用于无线测温模块,采用私有协议、小于50nA的待机功耗
本文主要介绍目前大量无线测温模块上使用的无线Sub-G通讯方案,特别是Silicon Labs的无线收发芯片Si4463方案,相对于其他无线技术方案,其特点在于芯片工作在Sub-G频段,通讯距离远;采用私有协议,产品开发更加灵活;待机功耗在50nA以下,功耗极低。
【经验】无线SoC芯片EFR32FG14和无线收发芯片Si4463实现互相通信的配置方法
在某些应用中,可以把Silicon Labs的无线SoC芯片EFR32FG14用于主机,无线收发芯片Si4463用于从机,因此需要让EFR32FG14和Si4463芯片相互通信。本文主要介绍如何配置EFR32FG14和Si4463的参数,让这两款芯片实现相互通信。
电子商城
现货市场
品牌: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 提交需求>
提供是德(Keysight),罗德(R&S)测试测量仪器租赁服务,包括网络分析仪、无线通讯综测仪、信号发生器、频谱分析仪、信号分析仪、电源等仪器租赁服务;租赁费用按月计算,租赁价格按仪器配置而定。
提交需求>
登录 | 立即注册
提交评论