编程技巧:轻松实现Si446x超长数据包收发
SILICON LABS EZRadioPro 系列的Si446x 无线收发器,TX FIFO 和 RX FIFO只有64字节。那么如何实现超过64字节的数据包收发呢?需要繁琐的去把长包拆分成小于等于64字节的小包,每个小包单独发送,然后接收端把这些小包数据拼接回原始的长包数据吗?回答是:不!因为长包的收发在Si446x 收发芯片实现是非常简单的。
打开WDS软件或者查看API寄存器描述文档,有两个中断非常有用,就是TX_FIFO_ALMOST_EMPTY_PEND 和 RX_FIFO_ALMOST_FULL_PEND,这个两个中断代表的意思就是TX FIFO 的数据即将发送完,或者RX FIFO即将被填充满。那么我们只需要根据这两个中断,就可以实现超长数据包收发了。
例如,在TX_FIFO_ALMOST_EMPTY_PEND中断产生时,立刻填充数据到TX FIFO中,新填充的数据会紧跟着之前的数据发送出去,直到数据包完全发送完成,最终产生一个发送完成中断,表示这包数据发完。接收时也是类似,当收到的数据不断往RX FIFO中填充,快要填满的时候,就会产生RX_FIFO_ALMOST_FULL_PEND中断,这时立刻把RX FIFO读取出来,那么空出来的FIFO又可以继续接收新的数据,直到接收到的总数据等于整个完整的数据包长度,产生一个接收完成中断。整个过程都是连续的,根据包长度和设定的阀值,会产生多个TX_FIFO_ALMOST_EMPTY_PEND和RX_FIFO_ALMOST_FULL_PEND中断,但是每包数据发送完成和接收完成中断只会有一个,和短包的收发是一样的。
超长数据包的具体实现步骤如下:
1)使用WDS 配置TX_FIFO_ALMOST_EMPTY和RX_FIFO_ALMOST_FULL 阀值,如图:
2)使能TX_FIFO_ALMOST_EMPTY和RX_FIFO_ALMOST_FULL中断。如图:
3)在收到 TX_FIFO_ALMOST_EMPTY_PEND中断时,添加对应的填充TX FIFO 代码。
if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_SENT_PEND_BIT)
{
/* Nothing is sent to TX FIFO */
bPositionInPayload = 0u;
/* Position to the very beginning of the custom long payload */
pPositionInPayload = (U8*) &pRadioConfiguration->Radio_Custom_Long_Payload;
return TRUE;
}
if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_TX_FIFO_ALMOST_EMPTY_PEND_BIT)
{
/* Calculate the number of remaining bytes has to be sent to TX FIFO */
bNumOfRestBytes = RadioConfiguration.Radio_PacketLength - bPositionInPayload;
if(bNumOfRestBytes > RADIO_TX_ALMOST_EMPTY_THRESHOLD)
{ // remaining byte more than threshold
/* Fill TX FIFO with the number of THRESHOLD bytes */
si446x_write_tx_fifo(RADIO_TX_ALMOST_EMPTY_THRESHOLD, pPositionInPayload);
/* Calculate how many bytes are sent to TX FIFO */
bPositionInPayload += RADIO_TX_ALMOST_EMPTY_THRESHOLD;
/* Position to the next first byte that can be sent to TX FIFO in next round */
pPositionInPayload += RADIO_TX_ALMOST_EMPTY_THRESHOLD;
}
else
{ // remaining byte less or equal than threshold
/* Fill TX FIFO with the number of rest bytes */
si446x_write_tx_fifo(bNumOfRestBytes, pPositionInPayload);
/* Calculate how many bytes are sent to TX FIFO */
bPositionInPayload += bNumOfRestBytes;
/* Position to the next first byte that can be sent to TX FIFO in next round */
pPositionInPayload += bNumOfRestBytes;
}
}
4)在收到 RX_FIFO_ALMOST_FULL_PEND中断时,添加对应的读取RX FIFO 代码。
if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_PEND_PACKET_RX_PEND_BIT)
{
/* Blink once LED3 as CRC OK or not enabled */
vHmi_ChangeLedState(eHmi_Led3_c, eHmi_LedBlinkOnce_c);
/* Calculate the number of free bytes in the array */
bNumOfFreeBytes = RADIO_MAX_LONG_PACKET_LENGTH - bPositionInPayload;
if (bNumOfFreeBytes >= RADIO_MAX_PACKET_LENGTH)
{// free space in buffer more than RX FIFO size
/* Read the RX FIFO with the number of RX FIFO size */
si446x_read_rx_fifo(RADIO_MAX_PACKET_LENGTH, pPositionInPayload);
/* Calculate how many bytes are already stored in the array */
bPositionInPayload += RADIO_MAX_PACKET_LENGTH;
/* Position to the next free byte that can be written in the next RX FIFO reading */
pPositionInPayload += RADIO_MAX_PACKET_LENGTH;
}
else
{
/* Read the RX FIFO with the number of free bytes */
si446x_read_rx_fifo(bNumOfFreeBytes, pPositionInPayload);
/* Calculate how many bytes are already stored in the array */
bPositionInPayload += bNumOfFreeBytes;
/* Position to the next free byte that can be written in the next RX FIFO reading */
pPositionInPayload += bNumOfFreeBytes;
}
/* Calculate how many bytes are already stored in the array */
bPositionInPayload = 0u;
/* Set writing pointer to the beginning of the array */
pPositionInPayload = &fixRadioPacket[0u];
/* free space */
bNumOfFreeBytes = RADIO_MAX_LONG_PACKET_LENGTH;
/* Start the radio */
vRadio_StartRX(pRadioConfiguration->Radio_ChannelNumber);
return TRUE;
}
if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PH_STATUS_RX_FIFO_ALMOST_FULL_BIT)
{
/* Calculate the number of free bytes in the array */
bNumOfFreeBytes = RADIO_MAX_LONG_PACKET_LENGTH - bPositionInPayload;
if (bNumOfFreeBytes >= RADIO_RX_ALMOST_FULL_THRESHOLD)
{ // free space in the array is more than the threshold
/* Read the RX FIFO with the number of THRESHOLD bytes */
si446x_read_rx_fifo(RADIO_RX_ALMOST_FULL_THRESHOLD, pPositionInPayload);
/* Calculate how many bytes are already stored in the array */
bPositionInPayload += RADIO_RX_ALMOST_FULL_THRESHOLD;
/* Position to the next free byte that can be written in the next RX FIFO reading */
pPositionInPayload += RADIO_RX_ALMOST_FULL_THRESHOLD;
}
else
{
/* Not enough free space reserved in the program */
ERROR_HOOK;
}
}
更多的详细参考代码,可以使用WDS,选择long packet TX 和 long packet RX工程生成并参考。
- |
- +1 赞 0
- 收藏
- 评论 2
本网站所有内容禁止转载,否则追究法律责任!
相关推荐
【经验】如何测试无线收发器的发射功率和频偏?
在设计好Sub-GHz无线收发器si446x 或者si4438的PCB板,完成元器件贴板和焊接之后,就可以开始测试PCB板的射频性能了。
【经验】手把手教你将HEX 文件烧录进无线收发器Si4010
Silicon Labs射频发射器Si4010广泛使用于汽车遥控器、家居安防、车库门等应用场合,本文介绍了其烧录工具和烧录步骤。
【经验】低电流无线收发器锁存RSSI值读取该如何操作?
Silicon Labs 无线收发器Si446x或者Si4438开发产品的时候,应用代码中很多需要使用到信号强度RSSI值。
Silicon Labs(芯科科技)EZR32HG220带ARM Cortex-M0+CPU和Sub-GHz无线电的无线MCU数据手册
描述- EZR32HG Wireless MCUs EZR32HG220 Wireless MCU family with ARM Cortex-M0+ CPUand sub-GHz Radio Data Sheet
型号- EZR32HG220FXXR69G-C0,EZR32HG,EFM32,EZR32HG220FXXR61,EZR32HG220FXXR61G-C0,EZR32HG220F64R55G,EZR32,EZR32HG220FXXR63,EZR32HG220FXXR67G-C0,EZR32HG220FXXR60,EZR32HG220FXXR69,EZR32HG220F32R55GR,EZR32HG220F64R55GR,EZR32HG220FXXR63G-C0,EZR32HG220FXXR55,EZR32HG220FXXR60G-C0,EZR32HG220F32R55G,EZR32HG220FXXR67,EZR32HG220,EZR32HG220FXXR55G-C0,EZR32HG220FXXR68G-C0
【经验】仅需3步,轻松实现Si446x无线收发器的变长包收发
Silicon labs EZRadioPro 系列的si446x 无线收发器,具备高级自动包处理功能。其中可变包长的收发在应用中非常普遍。那么如何轻松快速实现可变包长收发呢?仅需三步即可。
Silicon Labs(芯科科技)Si446x Sub-GHz无线收发器软件参考代码
描述- 发射端长前导码、变长包、休眠带RTC 1秒检测间隔、低功耗实现-接收端基于EFM32ZG平均功耗14uA左右
型号- SI4463,SI4438,SI446X
【经验】低电流无线收发器实时RSSI值读取该如何操作?
Silicon Labs 无线收发器Si446x或者Si4438开发产品的时候,应用代码中很多需要使用到信号强度RSSI值。
【产品】支持远距离通信的低功耗远距离Sub-GHz SoC EFR32FG
Silicon Labs的高性能双频段无线SoC EFR32FG支持Rail、Connect私有协议和动态双协议,支持2.4GHz和Sub-GHz共存的无线机制。单从芯片指标性能上说,该芯片有+20dbm最大发射功率,-126dbm接收灵敏度,链路预算非常优秀。EFR32FG目前已经支持1.2kbps DSSS+FEC长距离模式,现在已经是Lora的强力竞争对手,助力更低成本、高性能的长距离通信产
【经验】如何配置寄存器,实现无线收发器LDC低功耗接收功能?
Silicon labs公司的si4438/si446x系列Sub-Ghz无线收发器支持LDC低功耗接收功能,本文讲述的就是实现LDC低功耗接收功能的方法及步骤。
【经验】应用技巧:如何轻松实现无线收发器硬件CRC校验?
无线收发器支持硬件CRC校验,在WDS软件中点点鼠标就能快速完成CRC相关的设置。
Si4460无线收发器是否支持直接模式?是如何实现数据收发的?
对于在主机MCU内或其他基带芯片内执行数据包处理的传统系统,不适合使用FIFO。对于这种情况,Si4460无线发射器提供可完全绕过FIFO的直接模式。在TX直接模式下,TX调制数据被应用于芯片的输入引脚并进行“实时”处理(即不会存储在寄存器中稍后发送)。任何GPIO可被配置成TX数据输入功能来使用。而且,如果需要GFSK调制,则TX时钟输出功能需要一个额外的引脚(FSK只需要TX数据输入引脚)。为达到直接模式,GPIO必须在“GPIO_PIN_CFG”API命令和“MODEM_MOD_TYPE”API属性中进行配置。对于GFSK,“TX_DIRECT_MODE_TYPE”必须设置到同步。对于2FSK或OOK,类型可设置为异步或同步。对于所有的直接模式配置,MOD_SOURCE[1:0] 应设置为01h。在RX直接模式下,RX数据和RX时钟可被编程以实现直接(实时)输出到GPIO引脚,然后微控制器可以在不使用FIFO或RFIC分组处理程序功能的情况下处理RX数据。
【经验】低功耗Sub-GHz无线收发器Si4438在国网南网标准的无线数据白化配置
Silicon Labs的低功耗高性能Sub-GHz无线收发器Si4438,+20dbm(100mW)的输出功率,-124dbm的接收灵敏度。集成度高,包括硬件的CRC、数据白化、曼彻斯特编码等,在工程开发时可以减少软件的工作,提高系统的稳定性。Si4438在国网和南网的电力无线抄表中被广泛应用。
【应用】434MHz无线收发器Si4438用于无线烟感,具有低功耗、传输距离远等优势
随着无线技术发展,无线的独立式烟感报警器已经在行业内兴起,Silicon Labs推出的无线收发器Si4438,可覆盖从425 MHz至525 MHz的Sub-GHz频段,射频性能优异,传输数据远,功耗低,非常适合独立式烟感应用需求。
电子商城
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥16.5384
现货: 2,355
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥15.8878
现货: 2,329
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥12.3574
现货: 1,480
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥17.5602
现货: 150
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥16.3528
现货: 29
品牌:SILICON LABS
品类:HIGH-PERFORMANCE LOW-CURRENT TRANSCEIVER
价格:¥16.5384
现货: 10
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
支持铲齿散热器鳍片最大加工厚度0.1-10mm,最大宽度600mm,铝挤散热器鳍片最小铝挤厚度5mm,最小鳍片间距1cm;定制散热器产品工艺有热管焊接,穿片,打磨,铲齿,铝挤及CNC加工修边飞面等。
最小起订量: 2pcs 提交需求>
提供7~27寸工控机定制,支持嵌⼊式/ 壁挂式 /桌⾯式/悬挂式等安装方式,采用纯平⾯板IP65防尘防⽔等级,莫⽒7级硬度触摸屏,兼容多种操作系统:组态软件/安卓/XP/win7/8/10/Linux等,支持主板、接⼝、外观、⽀架、刷卡器、⾝份证阅读器、LOGO、⻨克⻛、系统、电池、蓝⽛、4G/5G、摄像头、GPS系统、⼆维码扫描器、指纹等特殊应⽤场景定制
最小起订量: 1台 提交需求>
登录 | 立即注册
提交评论