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.

[参考译文] LAUNCHXL-CC1312R1:CC1312R's Sub-1GHz 通信和 I2S 查询

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

https://e2e.ti.com/support/rf-microwave-group/rf-microwave/f/rf-microwave-forum/1515006/launchxl-cc1312r1-cc1312r-s-sub-1ghz-communication-and-i2s-inquiries

器件型号:LAUNCHXL-CC1312R1

工具/软件:

朋友、您好!我有关于 CC1312R1 中使用 Sub-1GHz 和 I2S 的工程的问题。

SDK 使用 simplelink_cc13x_cc26x_SDK_7_41_00_17、我在样本中基于 rfEchoRx 和 rfEchoTx 构建了工程。

症状是在将从 I2S 读取的数据发送到 Rx 时、Tx 仅发送 1 次带有 RF_cmdRun、然后接收到 Rx 是正常的、但不回显。 顺便说一下、

删除并执行 I2S 的 I2S_startClocks (i2sHandle) 时、Rx 回波正常工作。 请告诉我此症状的原因以及如何解决。

CMD_PROP_RX、CMD_PROP_TX 设置如下所示。

----- 。 Tx

/*根据应用需求修改 CMD_PROP_TX 和 CMD_PROP_RX 命令*/
RF_cmdPropTx_2gfsk1mbps868_0.pktLen = payload_length;
RF_cmdPropTx_2gfsk1mbps868_0.ppkt = txPacket;
RF_cmdPropTx_2gfsk1mbps868_0.startTriggerType = TRIG_NOW;//TRIG_NOW;//TRIG_ABSTIME;
RF_cmdPropTx_2gfsk1mbps868_0.startTrigger.pastTrig = 1;
RF_cmdPropTx_2gfsk1mbps868_0.StartTime = 0;
RF_cmdPropTx_2gfsk1mbps868_0.pNextOp =(RFC_radiOp_t *)&RF_cmdPropRx_2gfsk1mbps868_0;
/*仅在 TX 成功时运行 RX 命令*/
RF_cmdPropTx_2gfsk1mbps868_0.condition.rule = COND_Always;//COND_Always;//COND_STOP_ON_FALSE;

/*为接收的数据设置数据实体队列*/
rf_cmdProprx_2gfsk1mbps868_0.pQueue =&dataQueue;
/*丢弃 Rx 队列中忽略的数据包*/
RF_cmdPropRx_2gfsk1mbps868_0.rxConf.bAutoFlushIgnored = 1;
/*从 Rx 队列中丢弃带有 CRC 错误的数据包*/
rf_cmdProprx_2gfsk1mbps868_0.rxConf.bAutoFlushCrcErr = 1;
/*实现数据包长度过滤以避免 PROP_ERROR_RXBUF */
RF_cmdPropRx_2gfsk1mbps868_0.maxPktLen = payload_length;
RF_cmdPropRx_2gfsk1mbps868_0.pktConf.brepeatOk = 0;
RF_cmdPropRx_2gfsk1mbps868_0.pktConf.brepeatNok = 1;
RF_cmdPropRx_2gfsk1mbps868_0.pOutput =(uint8_t *)&rxStatistics;
/*接收操作将在命令启动后的 ms 内结束 RX_TIMEOUT */
RF_cmdPropRx_2gfsk1mbps868_0.endTriggerType = TRIG_NOW;//TRIG_NOW;//TRIG_REL_PREVEND;
RF_cmdPropRx_2gfsk1mbps868_0.condition.rule = COND_ALWAY;
RF_cmdPropRx_2gfsk1mbps868_0.EndTime = RX_TIMEOUT;

----- 。 Rx

/*根据应用需求修改 CMD_PROP_TX 和 CMD_PROP_RX 命令*/
/*为接收的数据设置数据实体队列*/
rf_cmdProprx_2gfsk1mbps868_0.pQueue =&dataQueue;
/*丢弃 Rx 队列中忽略的数据包*/
RF_cmdPropRx_2gfsk1mbps868_0.rxConf.bAutoFlushIgnored = 1;
/*从 Rx 队列中丢弃带有 CRC 错误的数据包*/
rf_cmdProprx_2gfsk1mbps868_0.rxConf.bAutoFlushCrcErr = 1;
/*实现数据包长度过滤以避免 PROP_ERROR_RXBUF */
rf_cmdProprx_2gfsk1mbps868_0.maxPktLen = payload_length;//payload_length+NUM_added_byts+1;
/*在正确接收到数据包时结束 RX 操作并继续到
*链中的下一个命令*/
RF_cmdPropRx_2gfsk1mbps868_0.pktConf.brepeatOk = 0;
RF_cmdPropRx_2gfsk1mbps868_0.pktConf.brepeatNok = 0;
RF_cmdPropRx_2gfsk1mbps868_0.startTriggerType = TRIG_NOW;
RF_cmdPropRx_2gfsk1mbps868_0.pNextOp =(RFC_radiOp_t *)&RF_cmdPropTx_2gfsk1mbps868_0;
/*仅在 RX 成功时运行 TX 命令*/
RF_cmdPropRx_2gfsk1mbps868_0.condition.rule = COND_STOP_ON_FALSE;//COND_ALWAY;//COND_STOP_ON_FALSE;
RF_cmdPropRx_2gfsk1mbps868_0.pOutput =(uint8_t *)&rxStatistics;

rf_cmdPropTx_2gfsk1mbps868_0.pktLen = payload_length;//payload_length+NUM_added_bytes+1;
RF_cmdPropTx_2gfsk1mbps868_0.ppkt = txPacket;
RF_cmdPropTx_2gfsk1mbps868_0.startTriggerType = TRIG_NOW;//TRIG_REL_PREVEND;
RF_cmdPropTx_2gfsk1mbps868_0.StartTime = 0;

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

    您好、Peter:

    如何填充 txPacket 变量? 它是否直接由 I2S 驱动器填充? 在发送之前从哪里复制 I2S 数据?

    此致、

    Arthur

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

    正在将 I2S 数据复制到队列、在发送之前、我们从队列中获取数据、将其放入 txPacket 变量中、然后发送该数据。

    从队列导入和传输数据的代码如下:

    if(!Queue_empty (queueHandle)){
    int16_t PCM_Buffer[64]={0};
    AUDIOBUFFER *audioBuffe =(AUDIOBUFFER *) Queue_dequeue (queueHandle);
    uint32_t sendSize = 0;
    int32_t pcmLData = 0x00000000;

    sendAudioDataField.rfAddress = 0xABCD;
    sendAudioDataField.command =命令状态;
    sendAudioDataField.deviceId = device_id;
    sendAudioDataField.curtime = rf_getCurrentTime();
    for (int i = 0、m = 0;i<PCMIZE;I++){
    int16_t pcmLData = 0x0000;
    pcmLData =(audioBuffe->i2sAudioData.data[m+1]);
    pcmLData |=(audioBuffe->i2sAudioData.data[m+2])<<8;
    pcm_buffer[i]= pcmLData;
    m = m+6;
    }

    IMA_ADPCM_encode_block (pcm_buffer、sendAudioDataField.encoded、&imaAdpcmState);

    memcpy (txPacket、&sendAudioDataField、sendAudioDataSize);
    currentCRC = CRC16_CCITT (txPacket、sendAudioDataSize);
    txPacket[44]=(currentCRC >> 8)& 0xFF;
    txPacket[45]=(currentCRC)& 0xFF;
    txPacket[46]='\0';

    //printf(“currentCRC:0x%x\n“、currentCRC);
    }

    RF_EventMask terminationReason = RF_EventCmdAborted | RF_EventCmdPreempted;
    while (terminationReason & RF_EventCmdAborted)&&(terminationReason & RF_EventCmdPreempted))

    //如果命令由于 SW Re 补偿而中止、则运行 TCXO-run
    //terminationReason = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx_2gfsk1mbps868_0、RF_PriorityNormal、NULL、0);
    terminationReason = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx_2gfsk1mbps868_0、RF_PriorityNormal、echallback、(RF_EventCmdDone | RF_EventEntryDone | RF_EventRxLastCmdDone);
    }

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

    您好、Peter:  

    我有几点意见:

    • TI-RTOS 队列默认不标记为线程安全。 您必须遵循以下代码片段来确保其安全: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_8_30_01_01/docs/tirtos7/doxygen/m4/html/Queue_8h.html#a96a54f733f0e473ad937fa458b362277
    • 我建议改用 MessageQueue.h API: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_8_30_01_01/docs/drivers/doxygen/html/_message_queue_p_8h.html#a7158ccab7f730769818300c5653790a9
      以下
      示例将 I2S 事务缓冲区发送到 MessageQueue:

          /* Treatment */
          while (1)
          {
              GPIO_write(CONFIG_GPIO_DBG_1, 1);
      
              /* Wait for transaction ready for treatment */
              retc = sem_wait(&semDataReady);
              if (retc == -1)
              {
                  while (1) {}
              }
      
              I2S_Transaction *transactionToSend = (I2S_Transaction *)List_head(&data2transfer);
      
              if (transactionToSend != NULL)
              {
                  started = 1;
      
                  if (MessageQueueP_getFreeCount(SendMsgQueueHandle) > 0)
                  {
                      /* We can wait until we get the next sample */
                      mq_status = MessageQueueP_post(SendMsgQueueHandle, (void *)transactionToSend->bufPtr, ClockP_getSystemTickPeriod() * 2);
      
                  }
      
                  List_remove(&data2transfer, (List_Elem *)transactionToSend);
                  List_put(&i2sReadList, (List_Elem *)transactionToSend);
              }
              GPIO_write(CONFIG_GPIO_DBG_1, 0);
          }


      semDataReady 发布在 I2S readCallbackFxn 中:


      static void readCallbackFxn(I2S_Handle handle, int_fast16_t status, I2S_Transaction *transactionPtr)
      {
          /*
           * The content of this callback is executed every time a read-transaction
           * is started
           */
          GPIO_write(CONFIG_GPIO_DBG_0, 1);
          /* We must consider the previous transaction (the current one is not over) */
          I2S_Transaction *transactionFinished = (I2S_Transaction *)List_prev(&transactionPtr->queueElement);
      
          if (transactionFinished != NULL)
          {
              /* The finished transaction contains data that must be treated */
              List_remove(&i2sReadList, (List_Elem *)transactionFinished);
              List_put(&data2transfer, (List_Elem *)transactionFinished);
      
              /* Start the treatment of the data */
              sem_post(&semDataReady);
      
          }
      
          GPIO_write(CONFIG_GPIO_DBG_0, 0);
      }
    • 最后、运行  I2S_startClocks 时是否看到异常?

    此致、

    Arthur

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

    我查看了您发送给我的内容。

    不能在项目中使用 MessageQueueP 相关代码。 MessageQueue 的 API 不能用于项目。 文件 ti/osal/messagequeue.h 未找到。

    即使应用了此内容、即使未使用队列、也无法通过低于 1GHz 的频率写入/读取数据。

    请再次告诉我、我如何才能了解导致这种情况的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后、运行  I2S_startClocks 时是否看到异常?

    您好、Peter:

    您在打开 I2SStartClocks 时是否观察到任何异常? 如果在 I2SStartClocks 后暂停器件、程序计数器在哪里?

    您可以使用我们的 ROV2 工具执行此操作。

    此致、

    Arthur

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

    我无法通过您发送给我的信息来确认。

    但是、我已经检查了一些内容、但现在 RF_EventLastCmdDone 事件发生在 rfEchoTx 的 echallBack 函数中、并确认为 RxtimedOut。
    是否应该针对此症状调整 RF 参数? 如果是、请告诉我应该调整哪个参数。

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

    您好、Peter:

    这是一个很好的线索。 如何计算  RX_TIMEOUT? 请注意、超时以对讲机计时器节拍(而不是毫秒)表示。

    以下是转换函数的辅助函数: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_8_30_01_01/docs/rflib/html/group__rf__driver__cc13x2__cc26x2.html#gaabead042beafa5e5347f1e7b003202f2

    此致、

    Arthur