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.

[参考译文] CC1125:连续传输

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1261159/cc1125-continuous-transmission

器件型号:CC1125

e2e.ti.com/.../continuous-transmission.pdf

我想在数据包中不中断地连续传输、即一个连续的数据包。  传输的开始和结束由用户控制。

TXFIFO_THR 用作中断、以指示 TX FIFO 已使用 GPIO 0减少到7个字节。

GPIO 0 连接至示波器。 我的第一个问题是 GPIO 0始终保持高电平。

我的第二个问题是射频传输似乎可以开始、但只持续很短的时间(可能是一个数据包)、然后停止。 我正在使用频谱分析仪来查看射频输出。

我有一个 TrxEB 评估板。 当 评估板设置为连续 TX 时、我可以看到连续射频输出。 但是、我似乎无法 在我自己的模块上复制连续 TX。

P.S.在我自己的模块上、我能够传输射频数据包并让  TrxEB 评估板成功接收它们、因此不存在硬件问题。

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

    目前不清楚在代码中要做什么、因此我制作了一个小型示例来演示无限数据包长度模式和 FIFO 阈值中断的使用。

    我使用 SmartRF Studio 生成设置、并使用2.4kbps 设置作为起点、但更改为无限数据包长度模式、并将 FIFO 阈值设置为7:

    static const registerSetting_t preferredSettings[]= 
    {
      {CC112X_IOCFG3,            0xB0},
      {CC112X_IOCFG2,            0x06},
      {CC112X_IOCFG1,            0xB0},
      {CC112X_IOCFG0,            0x02},
      {CC112X_SYNC_CFG1,         0x0B},
      {CC112X_DEVIATION_M,       0xA3},
      {CC112X_MODCFG_DEV_E,      0x02},
      {CC112X_DCFILT_CFG,        0x1C},
      {CC112X_FREQ_IF_CFG,       0x33},
      {CC112X_IQIC,              0xC6},
      {CC112X_CHAN_BW,           0x19},
      {CC112X_MDMCFG0,           0x05},
      {CC112X_SYMBOL_RATE2,      0x5A},
      {CC112X_SYMBOL_RATE1,      0x36},
      {CC112X_SYMBOL_RATE0,      0xE3},
      {CC112X_AGC_REF,           0x20},
      {CC112X_AGC_CS_THR,        0x19},
      {CC112X_AGC_CFG1,          0xA9},
      {CC112X_AGC_CFG0,          0xCF},
      {CC112X_FIFO_CFG,          0x78},
      {CC112X_SETTLING_CFG,      0x03},
      {CC112X_FS_CFG,            0x12},
      {CC112X_PKT_CFG0,          0x40},
      {CC112X_PA_CFG0,           0x7E},
      {CC112X_PKT_LEN,           0xFF},
      {CC112X_IF_MIX_CFG,        0x00},
      {CC112X_FREQOFF_CFG,       0x22},
      {CC112X_FREQ2,             0x56},
      {CC112X_FREQ1,             0xEC},
      {CC112X_FREQ0,             0x28},
      {CC112X_IF_ADC0,           0x05},
      {CC112X_FS_DIG1,           0x00},
      {CC112X_FS_DIG0,           0x5F},
      {CC112X_FS_CAL0,           0x0E},
      {CC112X_FS_CHP,            0x30},
      {CC112X_FS_DIVTWO,         0x03},
      {CC112X_FS_DSM0,           0x33},
      {CC112X_FS_DVC0,           0x17},
      {CC112X_FS_PFD,            0x50},
      {CC112X_FS_PRE,            0x6E},
      {CC112X_FS_REG_DIV_CML,    0x14},
      {CC112X_FS_SPARE,          0xAC},
      {CC112X_XOSC5,             0x0E},
      {CC112X_XOSC3,             0xC7},
      {CC112X_XOSC1,             0x07},
      {CC112X_PARTNUMBER,        0x58},
      {CC112X_PARTVERSION,       0x21},
      {CC112X_MODEM_STATUS1,     0x10},
      {CC112X_XOSC_TEST1,        0x00},
    };

    我的代码示例将122字节的0xf5写入 TX FIFO、然后是选通 STX。

    每次它在 GDO0上得到一个下降沿中断(TX FIFO 中少于7个字节)、我写入0xf5的122个新字节

    在接收器端、我使用了 SmartRF Studio 和 SYNC 串行模式、并在引脚上输出数据、以验证我的发送器是否连续发送了0xF5

    代码:

    void main(void) {
    
        // Initialize MCU and peripherals
        initMCU();
    
        // Write radio registers
        registerConfig();
    
        // Initialize packet buffer (sending an infinite packet with payload 0xF5)
        for (uint8 i = 0; i < PKTLEN; i++)
          txBuffer[i] = 0xF5;
    
        // Connect ISR function to GPIO0
        ioPinIntRegister(IO_PIN_PORT_1, GPIO0, &txFifoISR);
    
        // Interrupt on falling edge
        ioPinIntTypeSet(IO_PIN_PORT_1, GPIO0, IO_PIN_FALLING_EDGE);
    
        // Clear ISR flag
        ioPinIntClear(IO_PIN_PORT_1, GPIO0);
    
        // Enable interrupt
        ioPinIntEnable(IO_PIN_PORT_1, GPIO0);
    
        // Calibrate radio according to errata
        manualCalibration();
        
        // Write packet to TX FIFO
        cc112xSpiWriteTxFifo(txBuffer, sizeof(txBuffer));
    
        trxSpiCmdStrobe(CC112X_STX);
        
        while(1)
        {
            // Wait for interrupt (only 7 bytes left in the TX FIFO)
            while(fifoSemaphore != ISR_ACTION_REQUIRED);
            
            fifoSemaphore = ISR_IDLE;
            
            // refill the TX FIFO
            cc112xSpiWriteTxFifo(txBuffer, sizeof(txBuffer));
        }
    }
    
    static void txFifoISR(void) 
    {
        fifoSemaphore = ISR_ACTION_REQUIRED;
    
        // Clear ISR flag
        ioPinIntClear(IO_PIN_PORT_1, GPIO0);
    }
    

    逻辑分析仪图、其中显示了发送器上的 SPI + GDO0以及接收器上的接收数据和时钟(串行模式)(接收0xF5F5F5F5F5F5F5F5F5...)

    Siri

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

    感谢您的答复。 您可以使用一些函数,即  cc112xSpiWriteTxFifo()和 trxSpiCmdStrobe(CC112X_STX) 。 这些部分是否属于可下载的 TI CC112X 库?  

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

    可以。 我使用了此处的 EasyLink 示例作为起点:

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

    Siri

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

    这些示例适用于 MSP430 UP。 如果您使用其他类型的 UP、则效果不会很好。 CC1125用户指南有点混乱。 它指出 FIFO 深度为128字节。 但在您的示例中、CC112X_PKT_LEN = 0xFF、即256字节。

    为了能够将数据传输到 TX FIFO,SPI 通信必须包含:-

    标头   0x3F (STANDARD_TX_FIFO_REG 命令)。 实际上、对于突发模式写入、这将是0x7E。

    地址  0x00 (包含第一个数据字节的第一个 FIFO 寄存器的地址)

    后跟所有有效载荷字节。

    如果  CC112X_PKT_LEN = 0xFF 且 TX FIFO 容量为0x7F、那么 CC1125如何知道数据包何时到达结束?

    如果我只想传输5个字节该怎么办?  CC112X_PKT_LEN 是否= 0x05?

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

    这些示例是为畅销的套件中的 MCU 编写的。

    唯一需要移植的是低级 SPI 功能。 无论您使用何种 MCU、从 MCU 发送至 CC1125的数据都是相同的。

    在您的帖子中、您写下您想要实现并 连续 在您提供的示例代码中、您已配置对讲机 无限 数据包长度模式、在这种情况下不使用 PKT_LEN 寄存器。

    该寄存器用于固定数据包长度模式来确定应发送或接收多少字节、或者用于 I 可变数据包长度模式、以便在 RX 中实现最大数据包长度过滤。

    在固定或可变数据包长度模式下、最大长度为255字节、因为 PKT_LEN 寄存器为8位宽。

    事实上、RX FIFO 只有128个字节长、简单地说如果你想发送/接收多于128个字节的数据包、你必须在整个数据包被发送/接收前重新填充 TX FIFO 或开始读取 RX FIFO。 这就是 FIFO 阈值中断的用途。

    当使用无限数据包长度模式时、无线电没有数据包末尾的概念(因为不存在数据包末尾(它是无限的))

    根据您想要发送的数据包(它们是否包含长度信息)、它们比 FIFO 大小短还是长、它们比255短或长、是无限等、您对 TX 和 RX 的实现方式是不同的。

    要将数据写入 TX FIFO、您需要使用标准 FIFO 访问(否则、您的 FIFO 指针不会更新)。

    这意味着发送的第一个字节为0x7F (突发写入地址0x3F)、下一个字节是写入 FIFO 的第一个字节。

    没有接头(有关详细信息、请参阅用户指南中的表3)

    如果您只想发送5个字节、则不会将无线电配置为无限数据包长度模式。

    您可以使用固定数据包长度模式(设置 PKT_LEN = 5)并在选通 STX 之前将5个有效负载字节写入 FIFO。

    如果您使用可变数据包长度模式、则在 TX 中 PKT_LEN 无关、并且您将长度字节(0x05)+ 5个有效载荷字节写入 TX FIFO (必须写入总共6个字节)

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

    我仍然不确定如何将数据存储在 TX FIFO 中。 下面是一个代码片段。 它一次载入15个字节到 TXFIFO。 它执行此操作8次(15字节* 8 = 120字节)、然后最后加载 TX FIFO 中的4个字节。

     FIFO_CFG 寄存器= 0x78、即 TXFIFO_THR = 120字节。  

    每次装载一个15字节数据包时读取 MODEM_STATUS0寄存器。 读取该寄存器的结果始终为0x00。 我希望它在最后4个字节加载完毕后读取0x0C。

    空 Continuous_Mode (空)
    {
       volatile uint8_t index、结果;

       txArray[0]= standard_TX_FIFO_REG | burst_mode;//Burst mode。

       for (index = 1;index < size_of_TX_array;++index)//生成要传输的数据。
       {
          txArray[index]= 0xAC;
       }

       RF_SPI_Write (SFTX、0x00、0x00、SPI_TRANSATION_TYPE_WRITE);//清空 TX FIFO。

       for (index = 0;index < 8;++ index)
       {
          SPI_SpiUartPutArray (txArray、16);      //将15个字节加载到 TX FIFO 中。
                                          //即16字节- 1字节(txArray[0]= standard_TX_FIFO_REG | BURST_MODE)
          结果= RF_SPI_READ (EXTEND_REG、MODEM_STATUS0、SPI_TRANSACTION_TYPE_READ);//读取 TXFIFO 状态。
       }

       SPI_SpiUartPutArray (txArray、5);//将最后的字节加载到 TX FIFO 中。
       结果= RF_SPI_READ (EXTEND_REG、MODEM_STATUS0、SPI_TRANSACTION_TYPE_READ);//读取 TXFIFO 状态。

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

    我仍然不确定我是否明白您到底想要做什么、但对于不同寄存器的行为方式存在一些误解、因此我至少会解释它们。

    当 FIFO_CFG 寄存器= 0x78 (120)时、表示 TX FIFO 的阈值为7、RX FIFO 的阈值为128。

    用户指南中的表26对此进行了说明。

    在 MODEM_STATUS0中、您在写入 FIFO 时需要两个信号:

    MODEM_STATUS0[3]:  TXFIFO_FULL

    当 TX FIFO 已满时生效。 这意味着当 TX FIFO 中有128个字节时。 不是124、就像您假设的

    MODEM_STATUS0[2]:  TXFIFO_THR

    当字节数大于或等于 TX FIFO 阈值时生效。 在我们的案例中、即 TX FIFO 中有7个或更多字节时。

     

    这意味着、如果您向 TX FIFO 写入15个字节8次、则 MODEM_STATUS0将在前15个字节写入后变为0x04 (在7个字节后生效)。

    将8 x 15 + 8 = 128字节写入 TX FIFO 后、MODEM_STATUS0将为0x0C (TX FIFO 中有7个或更多字节、且已满)。

    此时您还可以读取 NUM_TXBYTES 寄存器、看看 FIFO 中现在有128个字节:

    for(index = 0; index < 8; ++index)
    {
        // Write the 15 bytes in the txArray to the FIFO
        cc112xSpiWriteTxFifo(txArray, sizeof(txArray));
            
        cc112xSpiReadReg(CC112X_MODEM_STATUS0, &modemStatus0, 1);
    }
    
    // Write 8 bytes from txArray to fill up the FIFO (8 x 15) + 8 = 128
    cc112xSpiWriteTxFifo(txArray, 8);
            
    cc112xSpiReadReg(CC112X_MODEM_STATUS0, &modemStatus0, 1);
    cc112xSpiReadReg(CC112X_NUM_TXBYTES,   &numTxBytes, 1);
    

    所有 SPI 流量均如下所示:

    放大所写入的前15个字节+ MODEM_STATUS0寄存器的读数、我们会看到 MODEM_STATUS0 = 0x04

    我们还可以看到 FIFO_THR 在写入7个字节之后生效

    将8 x 15 + 8 = 128字节写入 TX FIFO 后、MODEM_STATUS0将为0x0C (TX FIFO 中有7个或更多字节、且已满)。

    且 NUM_TXBYTES 将为128 (0x80):

    Siri