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.

[参考译文] CC1120:CC1120 RX FIFO 上溢错误

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1357527/cc1120-cc1120-rx-fifo-overflow-error

器件型号:CC1120

您好!

我正在使用 GPIO2作为同步字接收中断。 当中断被置为有效时、我将读取 RX FIFO 以确保有可用的数据。 不过、我会遇到一个问题、即我在 RX FIFO 中读取129个字节(FIFO 溢出)、然后刷新 RX FIFO。 尽管如此,我偶尔会得到正确的数据,但我不确定为什么。 我已经对不同的 CRC 设置进行了实验、我认为该问题与接收数据后的 CRC 检查无关。 以下是我的配置设置:

static const registerSetting_t preferredSettingsMaxDR[] =
{
  {CC1120_IOCFG3,            0xB0},
  {CC1120_IOCFG2,            0x06},
  {CC1120_IOCFG1,            0xB0},
  {CC1120_IOCFG0,            0x40},
  {CC1120_SYNC_CFG1,         0x07},
  {CC1120_DEVIATION_M,       0x53},
  {CC1120_MODCFG_DEV_E,      0x2F},
  {CC1120_DCFILT_CFG,        0x04},
  {CC1120_PREAMBLE_CFG1,     0x18},
  {CC1120_FREQ_IF_CFG,       0x00},
  {CC1120_IQIC,              0x00},
  {CC1120_CHAN_BW,           0x01},
  {CC1120_MDMCFG0,           0x05},
  {CC1120_SYMBOL_RATE2,      0xA9},
  {CC1120_SYMBOL_RATE1,      0x99},
  {CC1120_SYMBOL_RATE0,      0x99},
  {CC1120_AGC_REF,           0x3C},
  {CC1120_AGC_CS_THR,        0xEC},
  {CC1120_AGC_CFG3,          0x83},
  {CC1120_AGC_CFG2,          0x60},
  {CC1120_AGC_CFG1,          0xA9},
  {CC1120_AGC_CFG0,          0xC0},
  {CC1120_FIFO_CFG,          0x80},
  {CC1120_FS_CFG,            0x12},
  {CC1120_PKT_CFG0,          0x20},
  {CC1120_PA_CFG2,           0x77},
  {CC1120_PA_CFG0,           0x01},
  {CC1120_PKT_LEN,           0xFF},
  {CC1120_IF_MIX_CFG,        0x00},
  {CC1120_TOC_CFG,           0x0A},
  {CC1120_FREQ2,             0x6C},
  {CC1120_FREQ1,             0x80},
  {CC1120_FS_DIG1,           0x00},
  {CC1120_FS_DIG0,           0x5F},
  {CC1120_FS_CAL1,           0x40},
  {CC1120_FS_CAL0,           0x0E},
  {CC1120_FS_DIVTWO,         0x03},
  {CC1120_FS_DSM0,           0x33},
  {CC1120_FS_DVC0,           0x17},
  {CC1120_FS_PFD,            0x50},
  {CC1120_FS_PRE,            0x6E},
  {CC1120_FS_REG_DIV_CML,    0x14},
  {CC1120_FS_SPARE,          0xAC},
  {CC1120_FS_VCO0,           0xB4},
  {CC1120_XOSC5,             0x0E},
  {CC1120_XOSC1,             0x03},
};

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

    由于得到了同步接收中断(GDO2的上升沿)、您不应只开始读取 FIFO。 即使接收到同步字、也不必在 FIFO 中放置任何内容、至少不是整个数据包。

    最简单的方法是使用数据包长度过滤、然后限制数据包长度、以便在 FIFO 中为整个数据包提供空间(如果启用、请记住为状态字节提供空间)。

    在这种情况下、您应该等待完整的数据包被接收(GDO2的下降沿)、然后读取 FIFO。

    如果使用任何类型的滤波、在读取 FIFO 之前、您需要检查 FIFO 中是否确实有、但实际上仍然是空的。 永远不要读取空的 FIFO、因为这会使 FIFO 指针出现故障。

    您应该使用此处的 ease_link_rx 示例作为起点。

    SWRC253代码示例或演示| TI.com

    如果您需要接收不适合 FIFO 的数据包(大于128字节)、则需要使用 FIFO 阈值来生成中断、以便您可以在接收到完整的数据包之前开始读取 FIFO。

    同样在这种情况下、开始读取时、您需要始终检查 FIFO 中实际有多少字节、这样读取的 数据就不会超过可用的字节。

    Siri

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

    感谢您的答复。
    现在、在读取 GDO2的下降沿时、问题仍然存在。 Im 发送10字节数据包长、我在接收端不能接收到。 Im 在读取之前控制 RX FIFO、并 打算在 FIFO 中获得129个字节、同时 Im 已填满 FIFO。 位于基准驱动器之后的 Im。 如何解决该问题?

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

    如果从 NUM_RXBYTES 读取129、也可能从 MARCSTATE 读取0x11、这意味着您收到的数据包 RX FIFO 中没有空间。

    您是否使用 CC1120进行传输、并且您是否确定设置了正确的长度字节?

    如果您使用 CC1120作为发送器、则需要将长度字节写入 TX FIFO:

    如果有效载荷是10个字节、则需要将11个字节写入 TX FIFO:

    0x0A、DATA1、DATA2 、 DATA3、...、  数据 A10

    若要在 RX 端实现数据包长度过滤、应设置 PKT_LEN = 125

    然后、您在 RX FIFO 中有1个长度字节、125个数据字节和2个状态字节的空间(总共128个字节、这是 FIFO 的大小)

    Siri

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

    是的、我同时使用 CC1120作为发送器和接收器。 在发送器侧、我有一个11字节 txBuffer、第一个字节为0x0A、接下来的两个字节用于表示数据包编号。 之后、我以500ms 的延迟在 while 循环中发送数据。  以下是我的中断处理程序:

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      // PKT_SYNC_RXTX (FALLING EDGE TRIGGER)
      if (GPIO_Pin == GPIO2_CC1120_EXTI_Pin)
      {
        // Sync & end of packet the interrupt
        if (cc1120_dev.rfmode == RF_MODE_RX)
        {
          // Wait for packet received interrupt
          serialstatus = rfRecieveRxPacket();
          cc112xGetRxStatus(&cc1120_dev);
          rfRunRx();
        }
        else
        {
          // Wait for interrupt that packet has been sent.
          return;
          // chipstatus = rfSendTxPacket(sensorData);
        }
      }
      // RXFIFO_THR_PKT ()
      if (GPIO_Pin == GPIO0_CC1120_EXTI_Pin)
      {
        // RXFIFO_THR Handler
        trxSpiCmdStrobe(&cc1120_dev, CC112X_SFRX);
        cc112xGetRxStatus(&cc1120_dev);
      }
    //  // RX FIFO overflow
    //  if (GPIO_Pin == GPIO3_C1120_EXTI_Pin)
    //  {
    //	  trxSpiCmdStrobe(&cc1120_dev, CC112X_SFRX);
    //	  cc112xGetRxStatus(&cc1120_dev);
    //  }
    }

    在接收器侧、我有一个11字节 rxBuffer、并且我已按照您的建议将 PKT_LEN 设置为125。 我已经检查了 MARCSTATE、在接收到字节129后、我将读取0x11。 我能够正确读取第30和第71个数据包、但在最后一个正确的数据包之后、无法获得任何中断。 下面是我的 rfReceiveRxPacket 函数:
    RfSerialStatus_t rfRecieveRxPacket()
    {
      RfChipStatus_t chipstatus;
      RfSerialStatus_t serialstatus;
      serialstatus = cc112xSpiReadReg(&cc1120_dev, CC112X_NUM_RXBYTES, &rxBytes, 1);
    
      // Check that we have bytes in FIFO
      if (rxBytes != 0)
      {
    
        // Read MARCSTATE to check for RX FIFO error
        serialstatus = cc112xSpiReadReg(&cc1120_dev, CC1120_MARCSTATE, &marcState, 1);
    
        // Mask out MARCSTATE bits and check if we have a RX FIFO error
        if ((marcState & 0x1F) == RX_FIFO_ERROR)
        {
    
          // Flush RX FIFO
          serialstatus = trxSpiCmdStrobe(&cc1120_dev, CC112X_SFRX);
        }
        else
        {
    
          // Read n bytes from RX FIFO
          serialstatus = cc112xSpiReadRxFifo(&cc1120_dev, rxBuffer, rxBytes);
    
          // Check CRC ok (CRC_OK: bit7 in second status byte)
          // This assumes status bytes are appended in RX_FIFO
          // (PKT_CFG1.APPEND_STATUS = 1)
          // If CRC is disabled the CRC_OK field will read 1
          if (rxBuffer[rxBytes - 1] & 0x80)
          {
    
            // Update packet counter
            rxPacketCounter++;
          }
        }
      }
      return serialstatus;
    }

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

    如果您从空 FIFO 开始、如果您使用数据包长度过滤、那么应该不会出现溢出(FIFO 中为129字节)。

    请确保在启动 RX 之前清空 RX FIFO。

    此外、如果接受长度字节125、则不能有11字节的 RX 缓冲区。 如果触发噪声或 长度字节中存在位错误、该怎么办?

    如果 rxBytes > 11、您将覆盖代码中的某些内容、且代码可能会崩溃。

    由于我无法重现您看到的情况、因此我需要使用 SPI 图表来分析故障情况。

    该图应显示4条 SPI 线路和使用的任何 GDO 线路。

    我希望看到您执行以下操作的情况:

    清空 RX FIFO (SFRX)

    输入 RX (SRX)

    等待将要接收的数据包

    运行 rfRecieveRxPacket 函数。

    Br

    Siri