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.

[参考译文] CC1201:说前先听(LBT)

Guru**** 2501855 points
Other Parts Discussed in Thread: CC1201, CC1200

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1053853/cc1201-listen-before-talk-lbt

器件型号:CC1201
主题中讨论的其他器件: CC1200

你(们)好。

我目前正在尝试在 CC120x 上实现"说前先听"(LBT)功能。 根据用户手册、我只需将 PKT_CFG2.CCA_MODE 设置为0x04、硬件即可根据 ETSI 标准控制其余部分。

为了测试该功能、我有一个发送器(1)、每100ms 发送一次消息。 在选通 STX 之前、我在应用代码中设置一个 TEST 引脚。 我已经将"PKT_SYNC_RxTx"函数放置在 GPIO0上并生成一个带有其下降沿的中断。 在该中断中、我复位 TEST 引脚。 通过这种方式、我始终接收长度相同的脉冲、这反映了传输过程的持续时间。

另一个发送器(2)每47ms 发送一条消息、该消息应干扰发送器(1)。

现在、如果在发送器(2)当前正在传输时发生时间重叠、我希望发送器(1)生成一个测试脉冲、该脉冲至少会延长5ms。 遗憾的是、即使载波被发送器(2)占用、我也无法确定并且发送器(1)发送了它的消息。

如何测试 LBT 设置的功能?

非常感谢您的支持!

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

    此外:CC1201主要在监听模式下运行!

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

    请参阅以下有关如何测试 LBT 的文章:

    https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/370230/cc1200-random-back-off-in-lbt

    我强烈建议在不使用监听模式和使用接触 TX 作为干扰源的情况下开始测试该功能。

    我假设您在实施 LBT 时没有使用 Sniff 命令。 在这种情况下、您需要进入正常 RX 模式、并在确认对讲机处于 RX 状态后发出 STX 选通。

    Siri

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

    您好、Siri、

    感谢您的响应。 我现在已经尝试了一些操作。 最后、我使用 SmartRF-Studio 使用了2个带子板 CC120xEM (修订版1.1)的收发器评估板(v1.7)。 两种器件都使用模板"100kbps、2-GFSK、ETSI 标准(868MHz)"、并进行以下修改:

    • IOCFG2.GPIO_CFG = 0x11 (17d) CARER_SENSE
    • IOCFG0.GPIO_CFG = 0x1A (26D) RX0TX1_CFG
    • Pkt_CFG2.CCA_MODE = 0x04 (0b100)
    • RFEND_CFG1.RXOFF_MODE = 0x3 (RX)
    • RNDGEN.RNDGEN_EN = 1 (已启用)

    器件1每100ms 发送一次。

    器件2每47ms 发送一次。

    我使用逻辑分析仪监控两个器件的 GPIO0 (RX0TX1_CFG)和 GPIO2 (RX0TX1_CFG)。

    您可以看到、两个通道之间存在时间重叠。 遗憾的是、LBT 不像我所期望的那样工作!

    我出了什么问题?

    查找随附的 SmartRF-Studio 配置文件。

    e2e.ti.com/.../Test_5F00_LBT_5F00_2021_2D00_11_2D00_16.xml

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

    根据您向我展示的图表、不可能说出出错的地方。 例如、我不知道您在选通 TX 之前是否进入 RX (因为空闲和 RX 都将显示为0)。

    我执行了一个测试、在该测试中我使用了 Studio 中的100kbps 设置。

    我监控了 RX (LNA_PD 反相)、CS (CARRER_SENSE)和 TX_Packet (PKT_SYNC_RxTx)。

    jammer 在第二个器件上为 PKT_SYNC_RxTx、每500ms 传输一次长数据包。

    将 CS 阈值调整为高电平以进行测试。

    我选通 RX 并确保对讲机在频闪 STX 之前已进入 RX 状态。

     

    从下图中可以看到、无线电进入 RX、然后进入 TX (如果 CS 未置位)

    当存在干扰信号时、对讲机将保持 RX 状态并根据 LBT 算法检查信道、一旦信道清除、就会传输数据包。

    Siri

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

    感谢您的回答以及为证明 LBT 功能所做的努力。 不幸的是、我的项目中断了、必须先继续讨论其他主题。 我可能会在接下来的几天内再次找到处理 LBT 的时间。

    有关您的尝试的一些问题:

    • 两位参与者(测试设备和干扰设备)是否都使用 EVAL 板实现?
    • 您使用了哪种 Studio 标准模板、​​为了实现此结果、与之相比、哪些值发生了变化?

    还有一些问题需要了解 LBT 和数据表/用户手册:

    • 从用户手册中、我可以看到通过寄存器 PKT_CFG2.CCA_MODE = B100打开 LBT。 是这样吗?
    • 如何正确设置 CCA (清除渠道评估)?
    • LBT 是否涉及 AGC_CS_THR 寄存器? 如何计算有意义的值? 该寄存器值是有符号值还是无符号值? 是否要考虑偏移?
    • AGC_GAIN_ADJUST 寄存器是否也会影响 AGC_CS_THR 寄存器、并以何种方式?

    不幸的是,由于时间限制,我必须澄清《蓝牙》。 然而、我对解决方案非常感兴趣、因为我们的系统中将有大量无线电成员、并且不可避免地会发生冲突。

    非常感谢您的支持!

    此致、Andreas

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

    请查看我的以下评论:

    两位参与者(测试设备和干扰设备)是否都使用 EVAL 板实现?

    是的。 我在这两个器件上都使用了 TrxEB + CC1200 EM。 我没有 CC1201、但过程和结果是相同的

    您使用了哪种 Studio 标准模板、​​为了实现此结果、与之相比、哪些值发生了变化?

    对于干扰设备、我使用了标准的100 kbps 设置、每500 ms 传输一次长数据包。

    对于发送器、我在进行以下修改后使用了100kbps 设置:

    // Address Config = No address check 
    // Bit Rate = 100 
    // Carrier Frequency = 867.999878 
    // Deviation = 49.896240 
    // Device Address = 0 
    // Manchester Enable = false 
    // Modulation Format = 2-GFSK 
    // Packet Bit Length = 0 
    // Packet Length = 255 
    // Packet Length Mode = Variable 
    // RX Filter BW = 208.333333 
    // Symbol rate = 100 
    // Whitening = false 
    
    static const registerSetting_t preferredSettings[]= 
    {
      {CC1200_IOCFG3,            0x11}, // CARRIER_SENSE
      {CC1200_IOCFG2,            0x06},
      {CC1200_IOCFG0,            0x58}, // LNA_PD (Inverted): High when the radio is in RX
      {CC1200_SYNC_CFG1,         0xA8},
      {CC1200_SYNC_CFG0,         0x23},
      {CC1200_DEVIATION_M,       0x47},
      {CC1200_MODCFG_DEV_E,      0x0C},
      {CC1200_DCFILT_CFG,        0x4B},
      {CC1200_PREAMBLE_CFG0,     0x8A},
      {CC1200_IQIC,              0xD8},
      {CC1200_CHAN_BW,           0x08},
      {CC1200_MDMCFG1,           0x42},
      {CC1200_MDMCFG0,           0x05},
      {CC1200_SYMBOL_RATE2,      0xA4},
      {CC1200_SYMBOL_RATE1,      0x7A},
      {CC1200_SYMBOL_RATE0,      0xE1},
      {CC1200_AGC_REF,           0x2A},
      {CC1200_AGC_CS_THR,        0x1F}, // CS threshold set to -50 dBm for test purposes
      {CC1200_AGC_CFG1,          0x12},
      {CC1200_AGC_CFG0,          0x80},
      {CC1200_FIFO_CFG,          0x00},
      {CC1200_FS_CFG,            0x12},
      {CC1200_PKT_CFG2,          0x10}, // Set CCA_MODE = 4 
      {CC1200_PKT_CFG0,          0x20},
      {CC1200_PKT_LEN,           0xFF},
      {CC1200_IF_MIX_CFG,        0x1C},
      {CC1200_TOC_CFG,           0x03},
      {CC1200_MDMCFG2,           0x02},
      {CC1200_FREQ2,             0x56},
      {CC1200_FREQ1,             0xCC},
      {CC1200_FREQ0,             0xCC},
      {CC1200_IF_ADC1,           0xEE},
      {CC1200_IF_ADC0,           0x10},
      {CC1200_FS_DIG1,           0x04},
      {CC1200_FS_DIG0,           0x50},
      {CC1200_FS_CAL1,           0x40},
      {CC1200_FS_CAL0,           0x0E},
      {CC1200_FS_DIVTWO,         0x03},
      {CC1200_FS_DSM0,           0x33},
      {CC1200_FS_DVC1,           0xF7},
      {CC1200_FS_DVC0,           0x0F},
      {CC1200_FS_PFD,            0x00},
      {CC1200_FS_PRE,            0x6E},
      {CC1200_FS_REG_DIV_CML,    0x1C},
      {CC1200_FS_SPARE,          0xAC},
      {CC1200_FS_VCO0,           0xB5},
      {CC1200_IFAMP,             0x09},
      {CC1200_XOSC5,             0x0E},
      {CC1200_XOSC1,             0x03},
      {CC1200_RNDGEN,            0xFF}, // RNDGEN_EN = 1
    };

    以下代码用于测试:

    // Continiously sent packets until button is pressed
    do {
        // Create a random packet with PKTLEN + 2 byte packet
        // counter + n x random bytes
        createPacket(txBuffer);
    
        // Write packet to TX FIFO
        cc120xSpiWriteTxFifo(txBuffer, sizeof(txBuffer));
                    
        trxSpiCmdStrobe(CC120X_SRX);
    
        do {
            cc120xSpiReadReg(CC120X_MARCSTATE, &marcState, 1);
        } while (marcState != 0x6D);
                    
        // Strobe TX to send packet
        trxSpiCmdStrobe(CC120X_STX);
    
        // Wait for interrupt that packet has been sent.
        // (Assumes the GPIO connected to the radioRxTxISR function is
        // set to GPIOx_CFG = 0x06)
        while(packetSemaphore != ISR_ACTION_REQUIRED);
    
        // Clear semaphore flag
        packetSemaphore = ISR_IDLE;
    
        // Update packet counter
        packetCounter++;
            
        // Update LCD
        updateLcd();
                    
        // Wait for a random amount of time between each packet
        waitMs(3*(rand()%10+3));
                    
    } while (!bspKeyPushed(BSP_KEY_ALL));

    还有几个问题需要了解 LBT 和数据表/用户手册:从用户手册可以看出、LBT 是通过寄存器 PKT_CFG2.CCA_MODE = B100打开的。 是这样吗?

    是的

    如何正确设置 CCA (清除渠道评估)?

    请参阅上述设置和代码

    LBT 是否涉及 AGC_CS_THR 寄存器? 如何计算有意义的值? 该寄存器值是有符号值还是无符号值? 是否要考虑偏移?

    AGC_GAIN_ADJUST 寄存器是否也会影响 AGC_CS_THR 寄存器、并以何种方式?

    对于最后两个问题、请参阅用户指南中的 RSSI 部分。

    当它将要为阈值选择的值编码为代码时、通常会为您尝试兼容的标准指定该值。

    Siri

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

    非常感谢您的回答。 遗憾的是、我无法在评估板上运行任何代码、因为我没有 MSP430的编译器。 这就是为什么我相应地更改了我的当前项目并使用它执行了测试的原因。

    干扰设备每500ms 发送一个128字节的数据包。

    我的板每36ms 发送一次、应该执行一次 LBT。 如下图所示、两个发射器重叠:


    红色:干扰/干扰
    黄色:干扰和测试项目

    以下是我的寄存器设置:

    CC120x_REG_CONFIG(IOCFG3           , 0x11 ),
    CC120x_REG_CONFIG(IOCFG2           , 0x1A ),
    CC120x_REG_CONFIG(IOCFG1           , 0x30 ),
    CC120x_REG_CONFIG(IOCFG0           , 0x06 ),
    CC120x_REG_CONFIG(SYNC3            , 0x4D ),
    CC120x_REG_CONFIG(SYNC2            , 0x4D ),
    CC120x_REG_CONFIG(SYNC1            , 0x4D ),
    CC120x_REG_CONFIG(SYNC0            , 0x4D ),
    CC120x_REG_CONFIG(SYNC_CFG1        , 0xA8 ),
    CC120x_REG_CONFIG(SYNC_CFG0        , 0x22 ),
    CC120x_REG_CONFIG(DEVIATION_M      , 0x47 ),
    CC120x_REG_CONFIG(MODCFG_DEV_E     , 0x0C ),
    CC120x_REG_CONFIG(DCFILT_CFG       , 0x4B ),
    CC120x_REG_CONFIG(PREAMBLE_CFG1    , 0x14 ),
    CC120x_REG_CONFIG(PREAMBLE_CFG0    , 0x8A ),
    CC120x_REG_CONFIG(IQIC             , 0xD8 ),
    CC120x_REG_CONFIG(CHAN_BW          , 0x08 ),
    CC120x_REG_CONFIG(MDMCFG1          , 0x40 ),
    CC120x_REG_CONFIG(MDMCFG0          , 0x05 ),
    CC120x_REG_CONFIG(SYMBOL_RATE2     , 0xA4 ),
    CC120x_REG_CONFIG(SYMBOL_RATE1     , 0x7A ),
    CC120x_REG_CONFIG(SYMBOL_RATE0     , 0xE1 ),
    CC120x_REG_CONFIG(AGC_REF          , 0x2A ),
    CC120x_REG_CONFIG(AGC_CS_THR       , 0x1F ),
    CC120x_REG_CONFIG(AGC_GAIN_ADJUST  , 0x00 ),
    CC120x_REG_CONFIG(AGC_CFG3         , 0xB1 ),
    CC120x_REG_CONFIG(AGC_CFG2         , 0x20 ),
    CC120x_REG_CONFIG(AGC_CFG1         , 0x12 ),
    CC120x_REG_CONFIG(AGC_CFG0         , 0x80 ),
    CC120x_REG_CONFIG(FIFO_CFG         , 0x00 ),
    CC120x_REG_CONFIG(DEV_ADDR         , 0x00 ),
    CC120x_REG_CONFIG(SETTLING_CFG     , 0x0B ),
    CC120x_REG_CONFIG(FS_CFG           , 0x12 ),
    CC120x_REG_CONFIG(WOR_CFG1         , 0x08 ),
    CC120x_REG_CONFIG(WOR_CFG0         , 0x21 ),
    CC120x_REG_CONFIG(WOR_EVENT0_MSB   , 0x00 ),
    CC120x_REG_CONFIG(WOR_EVENT0_LSB   , 0x00 ),
    CC120x_REG_CONFIG(RXDCM_TIME       , 0x00 ),
    CC120x_REG_CONFIG(PKT_CFG2         , 0x10 ),
    CC120x_REG_CONFIG(PKT_CFG1         , 0x42 ),
    CC120x_REG_CONFIG(PKT_CFG0         , 0x20 ),
    CC120x_REG_CONFIG(RFEND_CFG1       , 0x0F ),
    CC120x_REG_CONFIG(RFEND_CFG0       , 0x00 ),
    CC120x_REG_CONFIG(PA_CFG1          , 0x7F ),
    CC120x_REG_CONFIG(PA_CFG0          , 0x56 ),
    CC120x_REG_CONFIG(ASK_CFG          , 0x0F ),
    CC120x_REG_CONFIG(PKT_LEN          , 0xFF ),
    CC120x_REG_CONFIG(PATABLE          , 0x00 ),
    CC120x_REG_CONFIG(TXFIFO           , 0x00 ),
    CC120x_REG_CONFIG(RXFIFO           , 0x00 ),
    
    /* extended registers */
    CC120x_REG_CONFIG(IF_MIX_CFG       , 0x1C ),
    CC120x_REG_CONFIG(FREQOFF_CFG      , 0x22 ),
    CC120x_REG_CONFIG(TOC_CFG          , 0x03 ),
    CC120x_REG_CONFIG(MARC_SPARE       , 0x00 ),
    CC120x_REG_CONFIG(ECG_CFG          , 0x0C ),
    CC120x_REG_CONFIG(MDMCFG2          , 0x02 ),
    CC120x_REG_CONFIG(EXT_CTRL         , 0x01 ),
    CC120x_REG_CONFIG(RCCAL_FINE       , 0x00 ),
    CC120x_REG_CONFIG(RCCAL_COARSE     , 0x00 ),
    CC120x_REG_CONFIG(RCCAL_OFFSET     , 0x00 ),
    CC120x_REG_CONFIG(FREQOFF1         , 0x00 ),
    CC120x_REG_CONFIG(FREQOFF0         , 0x00 ),
    CC120x_REG_CONFIG(FREQ2            , 0x56 ),
    CC120x_REG_CONFIG(FREQ1            , 0xD4 ),
    CC120x_REG_CONFIG(FREQ0            , 0x7A ),
    CC120x_REG_CONFIG(IF_ADC2          , 0x02 ),
    CC120x_REG_CONFIG(IF_ADC1          , 0xEE ),
    CC120x_REG_CONFIG(IF_ADC0          , 0x10 ),
    CC120x_REG_CONFIG(FS_DIG1          , 0x04 ),
    CC120x_REG_CONFIG(FS_DIG0          , 0x50 ),
    CC120x_REG_CONFIG(FS_CAL3          , 0x00 ),
    CC120x_REG_CONFIG(FS_CAL2          , 0x20 ),
    CC120x_REG_CONFIG(FS_CAL1          , 0x40 ),
    CC120x_REG_CONFIG(FS_CAL0          , 0x0E ),
    CC120x_REG_CONFIG(FS_CHP           , 0x28 ),
    CC120x_REG_CONFIG(FS_DIVTWO        , 0x03 ),
    CC120x_REG_CONFIG(FS_DSM1          , 0x00 ),
    CC120x_REG_CONFIG(FS_DSM0          , 0x33 ),
    CC120x_REG_CONFIG(FS_DVC1          , 0xF7 ),
    CC120x_REG_CONFIG(FS_DVC0          , 0x0F ),
    CC120x_REG_CONFIG(FS_LBI           , 0x00 ),
    CC120x_REG_CONFIG(FS_PFD           , 0x00 ),
    CC120x_REG_CONFIG(FS_PRE           , 0x6E ),
    CC120x_REG_CONFIG(FS_REG_DIV_CML   , 0x1C ),
    CC120x_REG_CONFIG(FS_SPARE         , 0xAC ),
    CC120x_REG_CONFIG(FS_VCO4          , 0x14 ),
    CC120x_REG_CONFIG(FS_VCO3          , 0x00 ),
    CC120x_REG_CONFIG(FS_VCO2          , 0x00 ),
    CC120x_REG_CONFIG(FS_VCO1          , 0x00 ),
    CC120x_REG_CONFIG(FS_VCO0          , 0xB5 ),
    CC120x_REG_CONFIG(GBIAS6           , 0x00 ),
    CC120x_REG_CONFIG(GBIAS5           , 0x02 ),
    CC120x_REG_CONFIG(GBIAS4           , 0x00 ),
    CC120x_REG_CONFIG(GBIAS3           , 0x00 ),
    CC120x_REG_CONFIG(GBIAS2           , 0x10 ),
    CC120x_REG_CONFIG(GBIAS1           , 0x00 ),
    CC120x_REG_CONFIG(GBIAS0           , 0x00 ),
    CC120x_REG_CONFIG(IFAMP            , 0x09 ),
    CC120x_REG_CONFIG(LNA              , 0x01 ),
    CC120x_REG_CONFIG(RXMIX            , 0x01 ),
    CC120x_REG_CONFIG(XOSC5            , 0x0E ),
    CC120x_REG_CONFIG(XOSC4            , 0xA0 ),
    CC120x_REG_CONFIG(XOSC3            , 0x03 ),
    CC120x_REG_CONFIG(XOSC2            , 0x04 ),
    CC120x_REG_CONFIG(XOSC1            , 0x03 ),
    CC120x_REG_CONFIG(XOSC0            , 0x00 ),
    CC120x_REG_CONFIG(ANALOG_SPARE     , 0x00 ),
    CC120x_REG_CONFIG(PA_CFG3          , 0x00 ),
    /* addresses 0x2F34...0x2F3E not used */
    /* addresses 0x2F3F...0x2F40 reserved */
    /* addresses 0x2F41...0x2F63 not used */
    CC120x_REG_CONFIG(WOR_TIME1        , 0x00 ),
    CC120x_REG_CONFIG(WOR_TIME0        , 0x00 ),
    CC120x_REG_CONFIG(WOR_CAPTURE1     , 0x00 ),
    CC120x_REG_CONFIG(WOR_CAPTURE0     , 0x00 ),
    CC120x_REG_CONFIG(BIST             , 0x00 ),
    CC120x_REG_CONFIG(DCFILTOFFSET_I1  , 0x00 ),
    CC120x_REG_CONFIG(DCFILTOFFSET_I0  , 0x00 ),
    CC120x_REG_CONFIG(DCFILTOFFSET_Q1  , 0x00 ),
    CC120x_REG_CONFIG(DCFILTOFFSET_Q0  , 0x00 ),
    CC120x_REG_CONFIG(IQIE_I1          , 0x00 ),
    CC120x_REG_CONFIG(IQIE_I0          , 0x00 ),
    CC120x_REG_CONFIG(IQIE_Q1          , 0x00 ),
    CC120x_REG_CONFIG(IQIE_Q0          , 0x00 ),
    CC120x_REG_CONFIG(RSSI1            , 0x80 ),
    CC120x_REG_CONFIG(RSSI0            , 0x00 ),
    CC120x_REG_CONFIG(MARCSTATE        , 0x41 ),
    CC120x_REG_CONFIG(LQI_VAL          , 0x00 ),
    CC120x_REG_CONFIG(PQT_SYNC_ERR     , 0xFF ),
    CC120x_REG_CONFIG(DEM_STATUS       , 0x00 ),
    CC120x_REG_CONFIG(FREQOFF_EST1     , 0x00 ),
    CC120x_REG_CONFIG(FREQOFF_EST0     , 0x00 ),
    CC120x_REG_CONFIG(AGC_GAIN3        , 0x00 ),
    CC120x_REG_CONFIG(AGC_GAIN2        , 0xD1 ),
    CC120x_REG_CONFIG(AGC_GAIN1        , 0x00 ),
    CC120x_REG_CONFIG(AGC_GAIN0        , 0x3F ),
    CC120x_REG_CONFIG(CFM_RX_DATA_OUT  , 0x00 ),
    CC120x_REG_CONFIG(CFM_TX_DATA_IN   , 0x00 ),
    CC120x_REG_CONFIG(ASK_SOFT_RX_DATA , 0x30 ),
    CC120x_REG_CONFIG(RNDGEN           , 0xFF ),
    CC120x_REG_CONFIG(MAGN2            , 0x00 ),
    CC120x_REG_CONFIG(MAGN1            , 0x00 ),
    CC120x_REG_CONFIG(MAGN0            , 0x00 ),
    CC120x_REG_CONFIG(ANG1             , 0x00 ),
    CC120x_REG_CONFIG(ANG0             , 0x00 ),
    CC120x_REG_CONFIG(CHFILT_I2        , 0x02 ),
    CC120x_REG_CONFIG(CHFILT_I1        , 0x00 ),
    CC120x_REG_CONFIG(CHFILT_I0        , 0x00 ),
    CC120x_REG_CONFIG(CHFILT_Q2        , 0x00 ),
    CC120x_REG_CONFIG(CHFILT_Q1        , 0x00 ),
    CC120x_REG_CONFIG(CHFILT_Q0        , 0x00 ),
    CC120x_REG_CONFIG(GPIO_STATUS      , 0x00 ),
    CC120x_REG_CONFIG(FSCAL_CTRL       , 0x01 ),
    CC120x_REG_CONFIG(PHASE_ADJUST     , 0x00 ),
    CC120x_REG_CONFIG(PARTNUMBER       , 0x21 ),
    CC120x_REG_CONFIG(PARTVERSION      , 0x11 ),
    CC120x_REG_CONFIG(SERIAL_STATUS    , 0x00 ),
    CC120x_REG_CONFIG(MODEM_STATUS1    , 0x10 ),
    CC120x_REG_CONFIG(MODEM_STATUS0    , 0x00 ),
    CC120x_REG_CONFIG(MARC_STATUS1     , 0x00 ),
    CC120x_REG_CONFIG(MARC_STATUS0     , 0x00 ),
    CC120x_REG_CONFIG(PA_IFAMP_TEST    , 0x00 ),
    CC120x_REG_CONFIG(FSRF_TEST        , 0x00 ),
    CC120x_REG_CONFIG(PRE_TEST         , 0x00 ),
    CC120x_REG_CONFIG(PRE_OVR          , 0x00 ),
    CC120x_REG_CONFIG(ADC_TEST         , 0x00 ),
    CC120x_REG_CONFIG(DVC_TEST         , 0x0B ),
    CC120x_REG_CONFIG(ATEST            , 0x40 ),
    CC120x_REG_CONFIG(ATEST_LVDS       , 0x00 ),
    CC120x_REG_CONFIG(ATEST_MODE       , 0x00 ),
    CC120x_REG_CONFIG(XOSC_TEST1       , 0x3C ),
    CC120x_REG_CONFIG(XOSC_TEST0       , 0x00 ),
    CC120x_REG_CONFIG(AES              , 0x00 ),
    CC120x_REG_CONFIG(MDM_TEST         , 0x00 ),
    /* addresses 0x2FA3...0x2FD1 not used */
    CC120x_REG_CONFIG(RXFIRST          , 0x00 ),
    CC120x_REG_CONFIG(TXFIRST          , 0x00 ),
    CC120x_REG_CONFIG(RXLAST           , 0x00 ),
    CC120x_REG_CONFIG(TXLAST           , 0x00 ),
    CC120x_REG_CONFIG(NUM_TXBYTES      , 0x00 ),
    CC120x_REG_CONFIG(NUM_RXBYTES      , 0x00 ),
    CC120x_REG_CONFIG(FIFO_NUM_TXBYTES , 0x0F ),
    CC120x_REG_CONFIG(FIFO_NUM_RXBYTES , 0x00 ),
    CC120x_REG_CONFIG(RXFIFO_PRE_BUF   , 0x00 ),
    /* addresses 0x2FDB...0x2FDF not used */
    CC120x_REG_CONFIG(AES_KEY15        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY14        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY13        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY12        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY11        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY10        , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY9         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY8         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY7         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY6         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY5         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY4         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY3         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY2         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY1         , 0x00 ),
    CC120x_REG_CONFIG(AES_KEY0         , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER15     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER14     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER13     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER12     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER11     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER10     , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER9      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER8      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER7      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER6      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER5      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER4      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER3      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER2      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER1      , 0x00 ),
    CC120x_REG_CONFIG(AES_BUFFER0      , 0x00 ),


    以下是发送时调用的代码:

    static void OnSendData(void)
    {
        Cc120xStrobe(CC120x_STROBE_SIDLE);
        if (CheckMarcstate(CC120x_MARCSTATE_IDLE))
        {
            uint8_t timeout = 0;
    
            /* flush tx fifo (arrives in CC120x_MARCSTATE_IDLE) */
            Cc120xStrobe(CC120x_STROBE_SFTX);
    
            /* copy data to send into tx fifo */
            Cc120xWrite(
                CC120x_REG_TXFIFO,
                (uint8_t *)&cc120x.txqueue.data[cc120x.txqueue.idxOut],
                cc120x.txqueue.data[cc120x.txqueue.idxOut].len + 1);
    
            /* to deal with LBT, chip must be set into RX mode */
            Cc120xStrobe(CC120x_STROBE_SRX);
    
    #if 1
            while (!CheckMarcstate(CC120x_MARCSTATE_RX)); // checks only 0x0D
    #else
            /* checking for 0x6D makes no difference... */
            uint8_t read = 0;
            do
            {
                Cc120xRead(CC120x_REG_MARCSTATE, &read, 1);
            }
            while (read != 0x6D);
    #endif
    
            /* set tx strobe to send data */
            Cc120xStrobe(CC120x_STROBE_STX);
    
            /* wait for start of transmission */
            {
                timeout = 0;
                wait(10);
                while (CheckMarcstate(CC120x_MARCSTATE_TX) == false)
                {
                    wait(3);
                    if (++timeout > 50)
                    {
                        break;
                    }
                }
            }
    
            cc120x.isSending = true;
    
            if (cc120x.callbacks.sending_started)
            {
                cc120x.callbacks.sending_started();
            }
    
            /* update calculation of duty cycle */
            cc120x.duty.count[cc120x.duty.minute].messages++;
            cc120x.duty.count[cc120x.duty.minute].bytes += cc120x.txqueue.data[cc120x.txqueue.idxOut].len;
    
            /* update in/out index */
            cc120x.txqueue.idxOut++;
            cc120x.txqueue.idxOut %= CC120x_TX_QUEUE_SIZE;
    
            /* update busy flag */
            cc120x.txqueue.busy = (cc120x.txqueue.idxOut != cc120x.txqueue.idxIn);
        }
    }

    您有什么想法、为什么 LBT 不起作用?

    此致、
    Andreas

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

    简短更新:

    当我在正常收发模式(在 RX 和 TX 模式之间切换)下操作 CC1201时、LBT 当前似乎正常工作。 如果这两条消息重叠、则测试板的消息将延迟一点。

    但是、也存在完全抑制消息的情况。 因此、问题是:是否总是随 LBT 一起发送消息? 必须发送前是否有最大超时?

    除此之外:

    我的应用是电池供电的器件。 为了节省能源、CC1201仅使用监听模式。 遗憾的是、在使用监听模式时、LBT 不起作用。 (代码:参见最后一条消息)。 如何从监听模式使用 LBT?

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

    不确定我是否理解您的问题。

    是否始终随 LBT 发送消息?

    如果您使用的是上述 LBT 模式、并且在选择 TX 之前进入 RX 模式、则在通道清零之前不会发送数据包。

    您不能将监听模式与 LBT 一起使用、我不明白您为什么要这样做。

    监听模式是一种 RX 模式、用于在搜索数据包(前导码和同步)时最大限度地缩短 RX 中的时间。

    LBT 用于 TX、而您之前所做的 RX 是确定通道在 ETSI 定义的最短时间内是否清零。 这无法通过使用监听模式在很短的时间内监听通道来实现。

    如果您有一个持续开启的强大干扰设备、这意味着在使用 LBT 并在 TX 之前频带 RX 时、您可能会长时间停留在 RX 中(只要干扰设备存在)。 如果由于电流消耗限制而无法执行此操作、则需要从应用程序中退出 RX 模式、然后稍后重试。

    Siri

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

    非常感谢您的回答。 我正在尝试再次完全重新描述我的任务。

    要开发的器件是一种应答器、它必须通过无线电向中央计算机发送各种数据。 稍后、系统中将会有大量应答器以异步方式相互发送数据。 无线电碰撞通常发生在这里。 为了避免这种情况、我想使用 LBT。

    应答器是由电池供电的设备、在发送消息后应准备好接收约500ms、以便能够接收来自中央计算机的命令。 只有按钮单元可用于电源。 为了延长电池寿命、应将接收准备就绪置于监听模式。

    我的程序流现在提供了在发送消息之前切换到监听模式的功能。 合成器和振荡器在发送前进行校准。 就在选通信号 SWOR 设置后、将调用发送例程。 执行发送后、必须立即进入监听模式。

    为了能够在监听模式下使用 LBT、我现在在传输例程中短暂进入 RX 模式、以便 CC1201能够确定通道是否空闲。 为此、有适用于 marcstate RX 的 strobe SRX 和 WAIT 语句。

    然后将选通信号 STX 设置为发送数据。 根据我对 CC1201的理解、现在应该执行 LBT。

    目前、当芯片在 RX 模式下静态运行时、我已经到了 LBT 的工作状态。 但是、如果我切换到监听模式、即使干扰器当前正在发送消息、我的设备也会发送其消息。

    LBT 和 Sniffmode 是否完全互斥? 或者、我应该选择哪种方式来使用监听模式下的 LBT?

    许多问候语、
    Andreas

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

    正如我在上一篇文章中所述、在使用监听模式时、您无法使用 LBT。 LBT 算法要求无线电保持在连续 RX 中以监控通道(无线电处于 RX 中、并且根据 ETSI EN 300 220-1 V2.3.1中描述的 LBT 自动检查 RSSI)。 当在 CC1200上以100kbps 的速率使用监听模式时、每次监听时、无线电都处于 RX 模式、大约100us。 这意味着、如果您处于 SWOR 模式并发送 STX 选通、则在接收选通时无线电很可能处于睡眠模式(而不是 RX)、并且无线电将始终进入 TX。

    Siri

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

    首先、我祝愿您在2022年新年快乐、健康、幸福!

    非常感谢您的回答。 我知道 LBT 不能直接在监听模式下工作。 但为什么即使我在 STX 前立即发送 SRX、LBT 也不起作用? 时间是否太短?

    static void OnSendData(void)
    {
    /* CC1200 is in SWOR! */
    
        Cc120xStrobe(CC120x_STROBE_SIDLE);
        if (CheckMarcstate(CC120x_MARCSTATE_IDLE))
        {
            /* flush tx fifo (arrives in CC120x_MARCSTATE_IDLE) */
            Cc120xStrobe(CC120x_STROBE_SFTX);
    
            /* copy data to send into tx fifo */
            Cc120xWrite(
                CC120x_REG_TXFIFO,
                (uint8_t *)&cc120x.txqueue.data[cc120x.txqueue.idxOut],
                cc120x.txqueue.data[cc120x.txqueue.idxOut].len + 1);
    
    /* set CC1200 to receive mode! */
    
            /* to deal with LBT, chip must be set into RX mode */
            Cc120xStrobe(CC120x_STROBE_SRX);
    
    /* wait for entering receive mode! */
    
            while (!CheckMarcstate(CC120x_MARCSTATE_RX)); // checks only 0x0D
    
    /* set CC1200 to transmit mode! */
    
            /* set tx strobe to send data */
            Cc120xStrobe(CC120x_STROBE_STX);
            
            ...
        }
    }

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

    在上述情况下、CCA 不应起作用是没有原因的。 我通过修改网络上可用的 CC1200_Rx_Sniff 模式示例对此进行了测试。 该示例处于 wor 模式、每次按下按钮时、我都会实现与您在 OnSendData 函数中所示类似的代码。 如果存在干扰(我发送续 Preamble from Studio)、数据包在干扰信号被关闭前不会被传输。  

    随附修改后的代码。

    Siri

    e2e.ti.com/.../cc1200_5F00_rx_5F00_sniff_5F00_mode_5F00_reg_5F00_config.h

    e2e.ti.com/.../cc1200_5F00_rx_5F00_sniff_5F00_mode_5F00_rx.c

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

    现在、它似乎也对我有效。 非常感谢您的支持! 我有两个寄存器设置不正确:

    1. MDMCFG - DVGA_GAIN 被设定为0dB。 (它的工作频率为-18dB。)
    2. AGC_CS_THR 位于0x1F。 (它适用于0xE4。)

    有关 AGC_CS_THR 寄存器的问题:
    在用户手册中、有"AGC 载波检测阈值。 具有1dB 分辨率的二进制补码编号"。 我的假设是、低值也会检测到弱载波。 但是、如果我设置一个小值、则 LBT 不起作用。 那么、为什么我必须设置一个大值呢? 如何准确计算 AGC_CS_THR 寄存器的合理值? 该寄存器的(可用)范围是多少?

    此致、
    Andreas

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

    你(们)好、Andreas

    在设置这些阈值时、您需要考虑几个因素。

    您首先需要做的是确保您在硬件上测量的 RSSI 正确。

    为此、您需要通过已知信号强度的电缆输入信号、然后调整 AGC_GAIN_ADJUST.GAIN_ADJUST 寄存器、直到您从 RSSI[11:0]中读取正确的值

    一旦 RSSI 偏移正确、您还应该测量您正在使用的 PHY 的灵敏度。

    对于 CC12x0、我们测量的灵敏度为-107 dBm、因此如果您在设计硬件时遵循了我们的参考设计、您应该能够实现相同的效果。

    当使用监听模式时、RSSI/CS 阈值应该被设定在/或者恰好高于灵敏度水平。

    将级别设置为高于灵敏度级别将使灵敏度级别上升到阈值。 这意味着、如果您在监听模式应用中将 RSSI 阈值设置为-100dBm、则只有当 RSSI 高于-100dBm 时、无线电才会保持唤醒状态、并且所有信号较弱(低至灵敏度水平)的数据包都将丢失。 较低的信号将再次触发更多的假唤醒(在噪声情况下唤醒)、从而增加电流消耗。

    对于 LBT 功能、您需要检查 ETSI 规范。 如果这是您要测试的结果。 我假设使用 LBT 时的 RSSI 阈值需要设置得远高于灵敏度水平。

    这意味着您需要在两种运行模式之间更改 RSSI 阈值。

    Siri

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

    您好、Siri、

    借助这些信息、我现在应该能够找到合适的设置并推进项目。

    感谢您的全力支持和耐心等待。

    此致、
    Andreas