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.

[参考译文] CC1121:CC1121胶液检测不起作用

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/828061/cc1121-cc1121-collosion-detection-is-not-working

器件型号:CC1121

您好!

有以下问题:

我们的产品使用2个在同一信道(频率)上工作的 CC1121无线电。

我们的产品每隔几毫秒在对讲机2上发送一次信标消息、而另一个对讲机继续 RX。

在某些情况下、有效数据到达并提取到 Radio1 FIFO 中。 无线电2正在发送信标数据(信号强度更高)、数据正在覆盖有效数据。

我希望获得:

CRC 错误(在大多数情况下、我们确实得到它)

2.冲突发现信号,因为在接收到有效数据包时插入信标同步字。

但是、我们 没有 得到碰撞指示。 (MDMCFG1 = 0x4E)。

我们不能选择在冲突中获得中断(相关 GPIO 未连接)、而是 在验证接收到的数据包时从寄存器 DEM_STATUS 中读取标志。

碰撞的确切情形是什么?

 DEM_STATUS 中的标志被复位的触发器是什么(可能我读取它太晚了)?

目前、垃圾数据已输入到我们的系统中。

谢谢、

达根

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

    不确定我是否理解您的陈述:

    在某些情况下、有效数据到达并提取到 Radio1 FIFO 中。 无线电2正在发送信标数据(信号强度更高)、数据正在覆盖有效数据。

     

    您将什么定义为有效数据(CRC 是否正常)?为什么说有效数据被覆盖?

     

    如果您接收到有效的同步字(从、比如 TX1)、对讲机将开始填充 RX FIFO、并使用长度字段(可变数据包长度)或 PKTLEN 寄存器(固定数据包长度)指示的字节数量。

    如果启用了碰撞检测、对讲机将继续查找同步、即使您已开始填充 FIFO。

    如果您正在接收数据包、而另一个发送器(TX2)发送数据包、则可能会发生两种情况。

     

    1) 1)两个数据包相互干扰。 来自 TX2的数据将破坏您从 TX1接收的数据、并且您的数据包中将出现 CRC 错误。 很可能 FIFO 开头的数据正常(来自 TX1、但在 TX2开始发送后、数据将仅为垃圾)。 您将会发生冲突、因为来自 TX1的数据将来自 TX2的同步字路由、因此您不会检测到它

     

    2) 2)来自 TX2的数据比来自 TX1的数据强得多。 在这种情况下、RX FIFO 中的数据将首先是来自 TX1的数据、在 TX2开始发送后、RXFIFO 中的数据将是来自 TX2的数据(包括前导码和 SYNC)。 CRC 仍将失败、但会将 collision_found 置为有效:


    找到的冲突不会向您提供任何其他信息,而是在您接收数据包的过程中告诉您是否找到了同步字。

     

    如果您希望在上述情况下能够接收来自 TX2的数据(TX2发送比 TX1强得多的信号、您可以尝试使用 RSSI_STEP_FOUND 信号。

    当 RSSI 增加3或6 db 时、此信号被置为有效。 该信号必须用作 MCU 的中断、以便您可以读取 NUM_RXBYTES 以确定 FIFO 中来自 TX1数据包的字节数量、然后发送 SRX 选通以重新启动 RX、从而能够接收新数据包(TX2)

    我不确定3dB 或6dB 的阶跃是否足以接收新数据包而不会出现错误、因此另一种方法是使用 CS 信号、如用户指南的第6.10.1节(基于 RSSI 的检测)中所述

     

    BR

    Siri

     

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

    您好-感谢您的回答、

    有效数据是具有 CRC OK 的数据。

    我的问题在很大程度上取决于 TX2信标数据的时序。 让我解释一下每种情况:

    正常情况-无线电1获取长度为0x2A 的良好数据、无 TX2数据:

      2A 0A 6502 00 92 03 ....  4e 4e 01 00

    2. CRC 故障-对讲机1正在接收数据、TX2正在发送中间位置的信标数据、导致 CRC 错误-我不会对数据进行分段

    3.有问题的情形- 无线电1正在接收数据、TX2正在发送恰好覆盖  良好数据的最后3个字节的信标数据:

      2A 0A 6502 00 92 03 ....  4e 4e  02 BC FF


    在这种情况下、发生了碰撞。  CRC 还可以!  (我想 CRC 只在 TX2信标数据上计算、因此没关系)。

    我还读取 NUM_RXBYTES、其值为0x2A。

    但是、我尝试读取 碰撞发现 标志寄存器、它具有复位值(0)...

    我还尝试使用 RSSI_STEP_FOUND、但从未提出该标志。

    那么、为什么我没有读取该标志呢?

    导致该标志复位的原因(假设它确实已置位)。

     

    谢谢、

    达根

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

    你好,达根

    我已经做了一些测试、但我无法重现您报告的内容。 我在所有遇到冲突的情况下、都会遇到 CRC 错误、我可以在 FIFO 中看到来自 TX2的数据包以及来自 TX1的数据包。 将会发出 collision_found 信号

    当 CRC 被报告为正常时、数据包确实是正常的。

    为了更容易区分数据包,我发送了一个长度为0x00、0xFF、0x00、0xFF...的长数据包 和 TX2的0x55、0x55、0x55、0x55、0x55、0x55的短数据包。 TX2以比 TX1高得多的输出功率发送。 在接收器上、它如下所示:

    10:23:14.804|4D | 00ff 00ff 00................ FF 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 |-87

    10:23:14.923 | 4D | 00 ff 00 ff 00...... FF 00 ff 4a aa aa aa B2 61 6a 3b c0 aa aa aa aa bf E4 20 7f 00 ff 00 ff 00 ff 00 ff 00 |-87 CRC 错误

    10:23:15.038 | 4D | 00 ff 00 ff 00...... FF 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 |-87

    10:23:15.076 | 05 | 55 55 55 55 |-59

    10:23:15.152 | 4D | 00 ff 00 ff 00........ FF 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 |-87

    您能给我提供您正在使用的寄存器设置吗?还能给我提供您在读取 RXFIFO 和检查 CRC 时使用的代码吗?

    此外、请向我提供完整的有效数据包:

    2A 0A 6502 00 92 03 .... 4e 4e 01 00

    发生冲突但 CRC 正常时接收到的完整数据包:

    2A 0A 6502 00 92 03 .... 4e 4e 02 BC FF

    和完整的信标数据包。

    请记住、无线电不会因为发生冲突而自动重新启动、因此不可能仅通过来自 TX2的信标数据包计算 CRC。

    BR

    Siri

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

    您好、Siri、

    (请参阅有关配置的私人消息)

    我用于读取 FIFO 的代码:

    静态 SendDataStatus_t ValidateMsg (无线电选择无线电编号)

    uint8_t 偏移= 0;
    PacketFailCountersSt *无线电封装故障保护;
    uint8_t * RxBuff;

    //assert the RadioNum 参数
    IF (RadioNum!= radio_1 && RadioNum!= radio_2)

     返回 SendData_Fail;

    //根据 RadioNum 设置指针
    如果(RadioNum == RADIO_1)

     RxBuff = Radio1_RXBuffer;
     RadioPackFailPtr =&g_DiagContainer.Radio1_PackFail;

    其他

     RxBuff = Radio2_RXBuffer;
     RadioPackFailPtr =&g_DiagContainer.Radio2_PackFail;

    RADIO_ByteCount[RadioNum]= 0;
    RADIO_BytesInRxBuff[RadioNum]= 0;

    //读取对讲机 RX FIFO 中准备就绪的字节数
    对于(int i = 0;i < 3;i++)

     if (radio_read (RadioNum、&radio_BytesInRxBuff[RadioNum]、CC1121_NUM_RXBYTES、1)!= SPI_TRANSACTION _OK)
     {
      返回 SendData_Fail;
     }
     如果(RADIO_BytesInRxBuff[RadioNum]>0)
     {
      中断;
     }

    //将 RX FIFO 中准备好的字节数置为有效
    IF (RADIO_BytesInRxBuff[RadioNum]>0 && RADIO_BytesInRxBuff[RadioNum]<= RX_buff_size)

     //从 RX FIFO 中读取所有就绪字节
     IF (RADIO_READ (RadioNum、RxBuff、CC1121_BURST_RXFIFO、RADIO_BytesInRxBuff[RadioNum])!= SPI_TRANSACTION _OK)
     {
      返回 SendData_Fail;
     }

    else //BytesInRxBuff 断言失败

     如果(RADIO_BytesInRxBuff[RadioNum]=0)
     {
      返回 SendData_Abort;
     }
     返回 SendData_Fail;


    //如果是信标
    如果(RxBuff[0]= 2 && RxBuff[1]= 0xBC && RxBuff[2]= 0xFF)

     返回 SendData_Abort;


    uint8_t DATA_LENGTH = RxBuff[0]+ 1;//长度+数据包长度字节

    // RxBuff[0]是有效载荷长度
    //有效载荷长度+ 1长度字节+ 2状态字节= BytesInRxBuff
    RADIO_ByteCount[RadioNum]=(DATA_LENGTH + 2);// 2个状态字节(RSSI 和 CRC 状态)
    IF (RADIO_ByteCount[RadioNum]-1 >= RX_buff)

     返回 SendData_Fail;

    if (!(RxBuff[RADIO_ByteCount[RadioNum]-1]& 0x80))//数据包状态字节2:CRC 数据正常

     返回 SendData_Fail;

    IF (RADIO_ByteCount[RadioNum]!= RADIO_BytesInRxBuff[RadioNum])

     RADIO_BytesInRxBuff[RadioNum]= 0;
     返回 SendData_Abort;


    //解析 RX FIFO 内容-仅缓冲区中的第一条消息!!
    //断言至少可以读取总长度和协议版本
    if (radio_BytesInRxBuff[RadioNum]< header_identifier_size)

     //处理故障消息
     RadioPackFailPtR->PacketToSmall++;
     返回 SendData_Fail;

    (笑声)

     

    中断处理程序:(每个无线电一个)如果 GPIO 信号发出、我有 CRC 错误处理程序。

    我还通过读取状态字节位[7]来处理代码后面的 CRC 错误(请参阅上面标记为黄色的代码)。

    void Radio1_MCU_WAKEUP_IRQHandler (void)

    //同步字 interrupt2 - GPIO2
    IF (EXTI_GetFlagStatus (Radio1_SPI_INT2_EXTI_line)=>设置)

     EXTI_ClearFlag (Radio1_SPI_INT2_EXTI_line);
     EXTI_ClearITPendingBit (Radio1_SPI_INT2_EXTI_line);
     LastSyncTimeR1 = u64Ticks;


    // CRC 故障中断1 - GPIO3
    否则、如果(EXTI_GetFlagStatus (Radio1_SPI_INT1_EXTI_line)== set)

     EXTI_ClearFlag (Radio1_SPI_INT1_EXTI_line);
     EXTI_ClearITPendingBit (Radio1_SPI_INT1_EXTI_line);
     LastSyncTimeR1 = 0;


    // Marc 状态中断3 - GPIO0
    否则、如果(EXTI_GetFlagStatus (Radio1_SPI_INT3_EXTI_line)== set)

     LastSyncTimeR1 = 0;
     G_RXReadyCountR1++;

     //CRC_OK
     if (SendRadioEventFromISR (radio_1、g_RXReadyCountR1、RadioEvent_TagData))
     {
      //待定
     }

     EXTI_ClearFlag (Radio1_SPI_INT3_EXTI_LINE);
     EXTI_ClearITPendingBit (Radio1_SPI_INT3_EXTI_line);

    其他

     LastSyncTimeR1 = 0;

    我使用的是可变长度。

    无线电2上的信标消息(仅两个字节+长度字节):BC FF

    完整数据消息: 0A 65 02 00 92 03 a0 F7 09 02 A1 F4 09 49 23 01 00 a0 34 01 00 18 45 01 00 A1 F5 09 52 2b 01 00 A6 3c 01 00 4e 4e 01 00

    谢谢、

    达根

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

    你(们)好 Degan

    我不清楚您的代码是如何工作的。

    您在 MCU_WAKEUP 上有一个中断。 此信号仅在对讲机进入空闲模式时有效、但您使用 RXOFF_MODE = RX、TXOFF_MODE = RX 和 TERM_ON_BAD_PACKET = 0、这意味着对讲机永远不会进入空闲状态。

    Radio1_MCU_WAKEUP_IRQHandler 是 MCU_WAKEUP 的 ISR,还是有其他 ISR? 如果是、您在其他 ISR 中做什么?

    我也不清楚何时在应用程序中调用 ValidateMsg 函数

    我想使用 offmodes != idle、启用 CRC 自动刷新以及使用不同中断的组合,您可能会在错误的时间读取 FIFO 或 NUM_RXBYTES。

    这种情况的一个指示是 NUM_RXBYTES 为0x2A、但当您收到有效数据包时、由于您附加了状态字节、因此该值应为0x2C。

    当您处于连续 RX 模式并使用自动刷新时、您应该在 CRC_OK 上有一个中断。 只有具有 CRC 确定功能的数据包才会出现在 FIFO 中、并且您应该读取第一个字节以获得长度(而不是 NUM_RXBYTES)、因为长度字节会为您提供数据包中包含多少字节的信息。 num_RXBYTES 也可以包括下一个数据包、因为无线电始终处于 RX 中。

    恐怕我很难准确地找出会导致您问题的原因、但我已经测试了 Collision_found 功能、并且没有发现任何问题。

    我不知道您看到此问题的频率是多少、但如果很容易重现、您能否在未启用碰撞检测功能的情况下进行测试? 您也可以尝试禁用自动刷新功能、或停止使用关闭模式。

    Siri

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

    您好、Siri、

    您是正确的–配置似乎是错误的…

    遗憾的是、我正在调试一个不是我编写的代码中的错误、因此我在数据表中不知道这种情况"请注意、MCU_WAKEUP 仅在无线电进入空闲状态时有效"。

    我将尝试在 PKT_CRC_OK 上设置中断、并查看问题是否重现。

    感谢您的帮助–我将在再次测试后秘密更新您。

    我将关闭论坛主题。

     

    达根