打印
[射频芯片]

求助!!!SI4438接收可变长度数据包错误

[复制链接]
3753|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 落叶飘飘 于 2016-10-20 15:40 编辑

本人刚入手SI4438,经过一段时间调试,可实现收发固定长度数据,可正常读取RSSI。但是接收可变长度数据时,只能收到前两个字节,获取到的数据包长度为2。我使用WDS进行参数配置。我的思路是:
(1)使用variable length模式;
(2) 在start_Tx中指定发送的数据长度;
(3)在start_rx中数据长度设为0.
WDS配置界面如下:





//开始接收可变数据包,在主函数中芯片初始化完成后执行
void vRadio_StartRX_Variable_Packet(u8 channel)
{
  // Read ITs, clear pending ones
  si446x_get_int_status(0u, 0u, 0u);

   // Reset the Rx Fifo
   si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT);

   /* Start Receiving packet, channel 0, START immediately, Length according to PH config */
   si446x_start_rx(channel, 0u, 0u,
                   SI446X_CMD_START_RX_ARG_RXTIMEOUT_STATE_ENUM_NOCHANGE,
                   SI446X_CMD_START_RX_ARG_RXVALID_STATE_ENUM_RX,
                   SI446X_CMD_START_RX_ARG_RXINVALID_STATE_ENUM_RX );
}

//接收程序:
u8 bRadio_Check_Tx_RX(void)
{//数据处理过程
          u8 kk;
        u8 tmp;
        u8 rssi = 0;
          if(radio_hal_NirqLevel() == RESET)
        {
                    /* Read ITs, clear pending ones */
                    si446x_get_int_status(0u, 0u, 0u);

                kk = Si446xCmd.GET_INT_STATUS.CHIP_PEND;
               if(kk & SI446X_CMD_GET_CHIP_STATUS_REP_CMD_ERROR_PEND_BIT)
                      {        
                              /* State change to */
                              si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_SLEEP);
        
                          /* Reset FIFO */
                              si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT);

                          /* State change to */
                              si446x_change_state(SI446X_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_RX);
                     }

                    /* check the reason for the IT */
                    if(Si446xCmd.GET_INT_STATUS.MODEM_PEND & SI446X_CMD_GET_INT_STATUS_REP_SYNC_DETECT_PEND_BIT)
                    {//SYNC WORD DETECT
                            //si446x_frr_a_read(rssi);
                            rssi = App_Read_Rssi_temp();//RF_LEVEL_dBm = RSSI_VALUE/2 - MODEM_RSSI_COMP - 70
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                        USART_SendData(USART1,rssi);        //串口打印RSSI
                        GPIO_Reverse(RECEIVEUART_LED_PORT, RECEIVEUART_LED_PIN);
                    }

                    if(Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT)
                    {//接收数据

                              /* Read the length of RX_FIFO */
                              si446x_fifo_info(0u);

                              /* Packet RX */
                              si446x_read_rx_fifo(Si446xCmd.FIFO_INFO.RX_FIFO_COUNT, variableRadioPacket);
                        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                        USART_SendData(USART1,Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//串口打印数据包长度        
                        UART1ToPC(variableRadioPacket,Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//串口打印数据包
                              return TRUE;
                    }

                    if (Si446xCmd.GET_INT_STATUS.PH_PEND & SI446X_CMD_GET_INT_STATUS_REP_CRC_ERROR_BIT)
                    {
                              /* Reset FIFO */
                              si446x_fifo_info(SI446X_CMD_FIFO_INFO_ARG_RX_BIT);
                    }
          }

          return 0;
}

附上我的配置文件。
radio_config.zip (7.39 KB)

请教大侠们!!!是我的配置文件错误还是数据读取过程错误,小弟在此谢过。



相关帖子

沙发
song9644| | 2016-10-20 17:11 | 只看该作者
主要是理解此函数,才能变长度。

使用特权

评论回复
板凳
song9644| | 2016-10-20 17:12 | 只看该作者
我们自己编写的API,可发任意长度,SI提供的API要理解。

使用特权

评论回复
地板
落叶飘飘|  楼主 | 2016-10-20 17:36 | 只看该作者
本帖最后由 落叶飘飘 于 2016-10-20 17:44 编辑
song9644 发表于 2016-10-20 17:12
我们自己编写的API,可发任意长度,SI提供的API要理解。

感谢,我找到问题了,我在发送数据包时没有将数据包长度放进TX_FIFO,更改后可以实现任意长度数据发送了。
现在又有另外的问题,在近距离时数据收发正确,距离稍远时,出现数据随机的错误,还有出现数据顺序错乱的情况,请问怎样避免这样的情况?

使用特权

评论回复
5
貌似稿手| | 2016-10-26 14:28 | 只看该作者
会出现死机的问题 小心了

使用特权

评论回复
6
落叶飘飘|  楼主 | 2016-10-27 16:29 | 只看该作者
貌似稿手 发表于 2016-10-26 14:28
会出现死机的问题 小心了

是有出现这样的情况,不知道是什么原因

使用特权

评论回复
7
貌似稿手| | 2016-10-30 12:39 | 只看该作者
落叶飘飘 发表于 2016-10-27 16:29
是有出现这样的情况,不知道是什么原因

芯片厂商的问题  芯片开发的时候本身就出现了问题, 建设选择其他公司的芯片。之前开发也是用这个后来进行不下去,总存在死机问题解决不了。除非冷启动

使用特权

评论回复
8
gaoyong118| | 2016-12-26 16:46 | 只看该作者
貌似稿手 发表于 2016-10-30 12:39
芯片厂商的问题  芯片开发的时候本身就出现了问题, 建设选择其他公司的芯片。之前开发也是用这个后来进 ...

哥们,我也遇到这种问题了,一开始没问题,运行一段时间后就死机了,实在找不出问题在哪里了

使用特权

评论回复
9
gaoyong118| | 2016-12-26 16:47 | 只看该作者
gaoyong118 发表于 2016-12-26 16:46
哥们,我也遇到这种问题了,一开始没问题,运行一段时间后就死机了,实在找不出问题在哪里了 ...

是NIRQ引脚不产生中断了

使用特权

评论回复
10
RF-7| | 2016-12-27 14:46 | 只看该作者
换用a7139性价比更好。管用sx1278更贵,性能更好

使用特权

评论回复
11
wjl520tyy| | 2017-9-14 09:19 | 只看该作者
你的数据包的长度放进TX_FIFO的命令的是什么,我在实现可变报数据处理的时候,总是出现CRC校验出错

使用特权

评论回复
12
yang_pengjian| | 2018-4-14 09:31 | 只看该作者
貌似稿手 发表于 2016-10-26 14:28
会出现死机的问题 小心了

请教使用4438做接收机 突然不能收到数据了,怎么能解决

使用特权

评论回复
13
ckc1119| | 2018-5-18 16:32 | 只看该作者
不理解它的固定长度,可变长度是什么意思啊。这几天看手册 看的晕晕了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝