This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1101:是否有任何报告显示刷新 CC1101 RX FIFO 失败? RX FIFO 中的超大数据包

Guru**** 2387080 points
Other Parts Discussed in Thread: CC1101
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/998567/cc1101-is-there-any-reports-where-flushing-of-cc1101-rx-fifo-fails-oversize-packets-in-rx-fifo

器件型号:CC1101

您好!

我在 CC1101接收超大数据包时遇到问题、因此我已经实现了一个代码、应该是这样  

被照顾的人。 显示面板(用户界面)在两端使用 CC1101与控制单元进行通信。

显示面板使用 RTOS、其中 GDO0定期轮询在自己的任务中完成。 当 SW 检测到新的射频数据包时

接收到(RTOS_CHECKNewPacket 函  数)时、它会命令芯片空闲、然后通过首先检查数据包的长度来处理它(CC_DataReady 函数)。 如果数据包大于60字节(超大数据包)、则 FIFO 中的字节

仍在本地 RAM 阵列中读取、无线电设置为空闲、Rx 和 TX FIFO 均被清空、并循环为无线电芯片供电(Vdd)。 电流

无线电经过初始化和校准、并设置为 RX。 当接收到一个大小正确的数据包时、一个数据包从 FIFO 读取到本地 RAM 阵列。

读取数据后、对讲机被检查为处于空闲状态、然后清空 RX FIFO。 冲洗后、FIFO 大小被检查为零。

否则、芯片将设置为空闲、FIFO 将再次清空。 在接收功能结束时、芯片被设定为 RX。 问题是我的代码是否已正确实现?

尤其是 RX FIFO 刷写? 在我的实现中、命令之间是否需要任何延迟? 是否有报告称 RX FIFO 的刷新失败?

当多个并行显示/控制单元在同一射频范围内进行通信时、我将偶尔在 FIFO 中获得超过60字节的数据包、并且我必须为无线电提供一个功率循环。

使用较少的并行系统、我将得到更少的超大数据包。

我已经读出、CRC 正常时、读取 FIFO 就足够了、FIFO 清空也不是强制性的。 我是对的吗? 显示单元还有 USB 记忆棒、RTOS 在空闲任务中运行。

软件会定期轮询 USB 记忆棒以查看是否已连接。 有时甚至将 USB 记忆棒插入 HW 也会在 RX FIFO 中生成超大的数据包、但并非总是如此。

感谢您的帮助!

此致、

Mikko

以下是我的代码:

轮询新数据包:

静态空 RTOS_checkNewPacket (空)

 if (get_GD0 ())
 {
  cc_enter_idle();//在读取 RX FIFO 之前将 CC1101设置为空闲,并拒绝新的数据包
  CC_WriteStrobe (CC_SNOP);//写入 NOP 以获得正确的 CC1101状态
  cc_DataReady();//从 RX FIFO 读取数据包
 }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

新数据包的处理:

空 CC_DataReady (空)

taskENTER_critical ();

uint8_t FifoSize = CC_ReadRegister (CC_RXBYTES);//!读取数据包长度

IF (FifoSize > 60)

  CC_ReadRX (&CC.RX_PktArray[0]、FifoSize);//! 读取所有数据
  taskEXIT_critical ();
  RFNW_PowercycleRadio();
  返回;

如果(FifoSize >0)则为其他值
{//!如果接收到数据...
  CC_ReadRX (&CC.RX_PktArray[0]、FifoSize);//! 读取所有数据
  CC.RSSI = CC_ConvRSSI (CC.RX_PktArray[FifoSize - 2]);//! 获取此接收的 RSSI 值
  cc.RX_len = FifoSize;//!Store data length for future use
  irqFixTaskSted.CC_RX = true;//! 新数据包已获取、稍后处理;

否则{
  cc.RX_len = 0;

CC_GET_STATE ();//Get Radio 状态
while (CC.State!= CC_STB_IDLE)//在刷新 RX FIFO 之前确保 CC1101处于空闲状态
cc_flush_RX_FIFO ();//刷新 RX FIFO
CC_WriteStrobe (CC_SNOP);//在进入 RX 状态之前写入 NOP (只是为了产生一些延迟)

FifoSize = CC_ReadRegister (CC_RXBYTES);//!读取数据包长度

if (FifoSize){
  cc_enter_idle();
  CC_WriteStrobe (CC_SNOP);//保持短延迟以从 CC1101获得正确的状态
  CC_GET_STATE ();//Get Radio 状态
  while (CC.State!= CC_STB_IDLE)//在刷新 RX FIFO 之前确保 CC1101处于空闲状态
  cc_flush_RX_FIFO ();//刷新 RX FIFO

CC_ENTER_RX ();//!重新进入 RX

taskEXIT_critical ();

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    接收到数据包后无需选通空闲、因为如果您使用 SmartRF Studio 的推荐设置、选通将自动进入空闲状态。

    应使用长度过滤来避免 RX FIFO 溢出(将最大数据包长度设置为61 (1个长度字节、61个有效载荷字节和2个状态字节)。


    当数据包接收信号有效时的伪代码:

    //读取 RX FIFO 中的字节数(rxBytes = NUM_RXBYTES)

    //检查 FIFO 中是否有字节(由于长度过滤、信号可以取消置位)
    if (rxBytes!= 0)

       //读取 MARCSTATE 以检查 RX FIFO 错误(如果在 RX 启动时 FIFO 不为空、仍可能出现溢出情况)
       
       if (状态指示错误)
       {
          //刷新 FIFO
       }
       其他
       {    
          //从 FIFO 读取 rxBytes 字节数
       }

    //重新启动 RX

    BR

    Siri