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.

[参考译文] LAUNCXL-CC1310:如何使用非阻塞无线电发射命令

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1094587/launchxl-cc1310-how-to-use-non-blocking-radio-transmit-command

部件号:LAUNCHTXL-CC1310
主题中讨论的其它部件:CC1310CC1350

您好,

我正在使用CC1310 Launchpad和CCS对其进行编程。 我正在构建noRTOS应用程序。

我想使用非阻塞无线电传输命令,即RF_postcmd()。 我想知道如何使用它,因为CCS中没有内置示例。

如何检查其状态?

谢谢  

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

    您好,Gopal,  

    要测试POST命令,我建议您执行以下操作。
    在rfPacketTx示例中,替换以下行

            /* Send packet */
            RF_EventMask terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx,
                                                       RF_PriorityNormal, NULL, 0);
    
            switch(terminationReason)
            {
                case RF_EventLastCmdDone:
                    // A stand-alone radio operation command or the last radio
                    // operation command in a chain finished.
                    break;
                case RF_EventCmdCancelled:
                    // Command cancelled before it was started; it can be caused
                // by RF_cancelCmd() or RF_flushCmd().
                    break;
                case RF_EventCmdAborted:
                    // Abrupt command termination caused by RF_cancelCmd() or
                    // RF_flushCmd().
                    break;
                case RF_EventCmdStopped:
                    // Graceful command termination caused by RF_cancelCmd() or
                    // RF_flushCmd().
                    break;
                default:
                    // Uncaught error event
                    while(1);
            }

     使用  

            RF_CmdHandle cmdhandle = RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, RF_PriorityNormal, NULL, 0);
            RF_pendCmd(rfHandle, cmdhandle, 0);

    在这里,postCmd没有阻塞,但我们正在等待使用RF_pendCmd ()和RF_postCmd返回的命令句柄执行命令。  

    我们在这里使用pendCmd()进行阻止,只是为了保持与示例相同的行为。 发布TX命令后,您无需待装,也可以执行其他操作。  

    Tx命令的状态是RF_cmdPropTx命令结构的一部分。 因此 ,状态为“读取”的代码部分可以保持不变。

    您可以在下面的链接中找到rfPacketTx示例。

    https://dev.ti.com/tirex/explore/node?node=AKVED0I7bXHR.CdCmaDvBA__eCfARaV__LATEST

    此致,

    SID

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

    我不想用RF_pendCmd()来阻止它,而 是想知道是否有一个中断可以用来知道何时成功执行RF_postCmd()。

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

    您可以使用回调来实现此目的。 请看一下rfEchoTx示例,其中有一个回调已用于runCmd。 同样,您也可以对回调使用postCmd。  

    dev.ti.com/.../node

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

    我正在从待机模式生成RTC定期唤醒和GPIO中断唤醒。 我声明了一个类型为int和大小为4的数组。当GPIO按钮发生中断时,数据将存储到数组中。 当阵列完全填满或RTC唤醒MCU时,阵列中至少有一个数据条目将被传输。 我正在使用RF_postcmd()传输数据
    但问题在于数据不传输REST所有功能正常工作。

    我在RF_postcmd()中使用回调函数,但从未调用此回调函数。
    如何解决此问题。下面是我的代码片段

    /*标准C库*/
    #include <stdlib.h>
    #include <unistd.h>
    #include <stddef.h>
    #include <stdint.h>

    /* TI驱动程序*/
    #include <ti/drivers/RF/RF.h>
    #include <ti/drivers/PIN.h>
    #include <ti/drivers/pin/PINCC26XX.h>
    #include <ti/drivers/GPIC.h>
    #include <ti/devices/cc13x0/driverlib/aon_rtc.h>
    #include <ti/devices/cc13x0/driverlib/aon_event.h>
    #include <ti/devices/cc13x0/driverlib/interrupti.h>
    #include <ti/devices/cc13x0/driverlib/cpu.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26XX.h>
    #include <ti/devices/cc13x0/inc/hw_device.h>
    #include DeviceFamily_construtPath (inc/HW_prcm.h)
    #include DeviceFamily_construtPath(driverlib/sys_ctrl.h)
    #include DeviceFamily_construtPath(driverlib/RF_prop_mailbox.h)
    包含"Board.h"
    包括"SmartRF_settings/SmartRF_settings.h"

    /*数据包TX配置*/
    #define payload_length 6.
    #define size 4 // data_buffer数组的大小

    /***** 变量声明***** /
    静态RF_Object rfObject;
    static RF_handle rfHandle;

    /*插针拆装器手柄*/
    static PIN_handle ledPinHandle;
    static PIN_State ledPinState;
    静态PIN_handle按钮PinHandle;
    静态PIN_State按钮PinState;

    静态uint8_t seqNumber;
    静态uint8_t数据包[PAYLOAD长度];
    UINT8_t索引= 0;
    UINT8_t RF_BUSY = 0;
    UINT8_t event_NUM =0;//,用于计算发生的中断数
    UINT8_t TX_STATUS = 0;// TX状态。 1->data ready to transmit, 0->data not ready to transmit.(1->data ready to transmit, 0->data not ready to transmit
    UINT8_t BTN_INTPT_STATUS = 0;//按钮中断状态。 1->set (设置),0->reset (重置)
    UINT8_t RTC_INTPT_STATUS = 0;// RTC中断状态。 1->set (设置),0->reset (重置)

    /***** LED针脚配置表***** /
    PIN_Config pin表[]=

    Board_PIN_LED0 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,
    Board_PIN_LED1 | PIN_GPIO输出_EN | PIN_GPIO低| PIN_PushPull | PIN_DRVSTR_MAX,
    PIN_TERMINATE
    };

    /***** 中断PIN配置表***** /
    Pin_Config按钮PinTable[]={
    Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PLUUP | PIN_IRQ_NEGEDGE,
    PIN_TERMINATE
    };

    /***** RTC ISR ***** /
    void rtc_isR()

    AONRTCEventClear (AON_RTC_CH0 | AON_RTC_CH1 | AON_RTC_CH2);//清除RTC事件和中断
    RTC_INTPT_STATUS = 1;//将RTC中断状态设置为高
    }

    /***** 按钮ISR ***** /
    void按钮CallbackFxn (PIN_handle handle,PIN_ID pinId)

    BTN_INTPT_STATUS = 1;//设置中断状态为高
    }


    /**** RF回调******
    void RF_callback (RF_handle h,RF_CmdHandle ch,RF_EventMask e)

    RF_BUSY = 0;
    }

    /***** 函数定义***** /
    void *mainThread(void *arg0)

    /* LED针脚开路*/
    ledPinHandle = PIN_OPEN (&ledPinState,PinTable);
    IF (ledPinHandle ==空)
    while (1);/*初始化LED针脚时出错*/

    /* LED针脚开路*/
    buttonPinHandle = PIN_OPEN (&buttonPinState,buttonPinTable);
    IF (!buttonPinHandle)
    while (1);/*初始化中断引脚时出错*/

    /*设置按键插针的回叫*/
    如果(PIN_registerIntCb(buttonPinHandle,&buttonCallbackFxn)!=0){
    while (1);/*注册按钮回调函数时出错*/
    }


    RF_Params rfParams;
    rf_params_init(&rfParams);

    RF_cmdPropTx.pktLen =有效载荷长度;
    rf_cmdPropTx.pktt =数据包;
    RF_cmdPropTx.startrigger.triggerType = trig_now;

    /*请求访问对讲机*/
    #IF已定义(DeviceFamily_CC26X0R2)
    rfHandle = RF_OPEN (&rfObject,&RF_prop,(RF_RadioSetup*)&RF_cmdPropRadioSetup,&rfParams);
    #否则
    rfHandle = RF_OPEN (&rfObject,&RF_prop,(RF_RadioSetup*)&RF_cmdPropRadioDivSetup,&rfParams);
    #endif// DeviceFamily_CC26X0R2

    /*设置频率*/
    RF_postCmd (rfHandle,(RF_Op*)&RF_cmdF,RF_PriorityNormal,NULL,0);


    UINT8_t DATA_BUF[size];//存储数据的数组


    AONEventMcuWakeUpSet (AON_EVENT_MCU_WU2,AON_EVENT_RTC_CH2|AON_EVENT_IO);//在RTC通道2事件上唤醒MCU或在GPIO上中断
    AONRTCModeCh2Set (AON_RTC_MODE_CH2_CONTINUAL);//将RTC CH2设置为连续比较模式
    AONRTCCompareValueSet (AON_RTC_CH2,0x000f0000);//将RTC CH2比较值设置为15秒
    AONRTCIncValueCh2Set(0x000f0000);//将RTC CH2设置为每15秒生成一次事件
    AONRTCChannelEnable (AON_RTC_CH2);//启用RTC CH2
    AONRTCCombinedEventConfig (AON_RTC_CH0 | AON_RTC_CH1 | AON_RTC_CH2);//启用RTC组合事件
    IntEnable(INT_AON_RTC_Comb);//启用RTC组合事件以从WFI命令唤醒CPU
    IntRegister (INT_AON_RTC_Comb,RTC_ISR);//使用RTC_ISR功能注册RTC中断
    AONRTCEnable();//启用RTC


    同时(1)

    IF (BTN_INTPT_STATUS == 1)

    DATA_BUF[index+]= EVENT_NUM++;
    DATA_BUF[index+]= 1;

    IF (INDEX == Size && TX_STATUS == 0)

    TX_STATUS = 1;
    索引= 0;
    }
    BTN_INTPT_STATUS = 0;
    }


    IF (RTC_INTPT_STATUS == 1)

    IF (索引> 0 && TX_STATUS == 0)
    TX_STATUS = 1;

    RTC_INTPT_STATUS = 0;
    }


    IF (TX_STATUS == 1 && RF_BUSY == 0)

    //创建带有递增序列号和随机负载的数据包
    packet[0]=(uint8_t)(seqNumber >>8);
    packet[1]=(uint8_t)(seqNumber++);

    uINT8_t i;
    对于(i = 2;i <有效载荷长度;I++)

    packet[i]= DATA_BUF[I-2];
    }

    RF_postCmd (rfHandle,(RF_Op*)&RF_cmdPropTx,RF_PriorityNormal,&RF_callback,0);
    TX_STATUS = 0;
    RF_BUSY = 1;
    }

    IF (RF_BUSY == 0)
    PowerCC26XX_standbyPolicy();
    }
    }

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

    您需要检查以下几个事项。  

    1. postCmd返回命令句柄,请检查这是否是有效的命令句柄。  

    2.在调试会话中,在RF_postCmd处放置一个断点,以确保postCmd实际执行。

    此致,

    SID

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

    我将断点放在回调函数上,因为回调函数仅在执行RF_postcmd()时调用。 现在,在我的情况下,从不调用回调函数,因为调试器从不在回调函数处停止。

    我想说的另一件事是,当我评论RTC事件代码并保持其他内容相同时,数据就会成功传输,并且RF_postcmd()正在返回一个有效的命令句柄,如2,3,4,5,6等

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

    您能否详细说明您的应用程序需要做什么? 如果您尝试唤醒设备以进行传输,则可能有更简单的方法来执行此操作。

    如果您使用TI驱动程序和SDK中的示例,驱动程序将负责电源管理,以提供最佳的电源性能。  

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

    我对我的项目有以下要求

    1.中断发生时,我需要传输数据集1,数据集在中断时间之间进入休眠模式。

    2.它需要定期从断电模式唤醒并发送另一个数据集。

    我正在使用GPIO中断触发数据集1的传输。

    和使用RTC定期唤醒设备以触发数据集传输2.

    但我正面临RTC的问题。当RTC唤醒时,它不会传输数据。

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

    您是否已验证设备确实在RTC中断时唤醒?  

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

    是,设备在RTC中断时唤醒

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

    您是否可以在该行中放置断开点。  

    rtc =_INTP0;1310 =_INTP0;</s>405.5403万 405.5403万

    然后检查变量TX_STATUS此时的值,确保它为1。  

    然后在 这条线之后放置一个断点

    if1310 if (4.05540403亿 (TX_STATUS_405.5403万TX_STATUS_ rf= 1&rf= 1) busy =

    以确保实际发布所需的TX命令。  
    我们需要弄清楚代码的哪一部分未被到达,或者我们是否正在发布TX命令。

    此致,
    SID  

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

    是的,TX_STATUS设置为1,它也进入IF (TX_STATUS=1 && RF_BUSY==0)。
    正如我所说的,问题是RF_postCmd()正在执行,但从未调用回调。

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

    在这里,您提到当记录RTC代码时,RF_postCmd()给出了正确的命令句柄。  

    另1310另一405.6877万一件405.6877万件事,我想在收到相同的数据后,rf_6命令时,我要继续处理,回写同样的事。

    在这种情况下,当Rf_postCmd()在RTC中断处执行时,返回的句柄是什么?

    是1310是的406.3238万的,406.3238万,TX_1&IT=1还将进入rf_status= rf_1且rf=1(f=1f_1
    正如我所说的,问题是RF_postCmd()正在执行,但从未调用回调。

    值得检查postCmd此时是否返回有效的命令句柄。

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

    它传递有效命令句柄的值2。

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

    您是否可以与我们分享该项目? 我们需要重现您所看到的问题,以了解对讲机在TX命令获得有效命令句柄后仍无法传输的原因。   

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

    下面是我的项目的驱动器链接。
    项目URL

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

    您好,Gopal,

    我在没有任何更改的情况下调试了您的项目,并且从未按下任何按钮。 我在中放置了断点

    1. RTC_ISR()。 。

    2. While循环中的断开点,如图所示。 如果您在此处注意到TX_STATUS的值,则它不会设置为1。  

    因此它从未到达我在RF_postCmd()处的第三个断点,因此它根本没有发布tx命令。  

    如果在验证RF_postCmd()正在执行后有任何代码修改,请重新检查逻辑并确保命令已发布。

    此致,

    SID

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

    主席先生,

     RTC有一个条件(index>0)用于POST TX_status,即阵列"DATA_BUF"中至少应存在一个数据。 按下按钮时,数据将插入其中。

    由于您从未按下该按钮,因此阵列中不存在数据,并且RTC未发布TX_STATUS。因此它永远不会到达第三个断点

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

    在这种情况下,按下按钮一次后。 触发RTC_ISR时,我确实看到TX_STATUS为1,RF_BUSY为0。  
    它到达RF_postCmd()处的断点,然后每次都到达RF_callback()中的断点。  

    不确定,当您看到故障情况时。

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

    主席先生,

    我正在上传视频以显示我的问题。 按下按钮一次后。触发RTC_ISR时,TX_STATUS为1,RF_BUSY为0。 此外,它到达RF_postCmd()处的断点,但此后,它永远不会到达RF_callback()中的断点。

    首先,我认为这是硬件问题,所以我在CC1350上运行相同的项目,但该主板也面临相同的问题,即没有RTC,它会到达RF_Callback中的断点,但如果包括RTC,它永远不会到达RF_callback()中的断点。

    我正在上传两个主板的视频。 (CC1310和CC1350)

    此外,您是否对代码进行了任何更改?

    视频URL

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

    您好,Gopal,

    在代码中尝试这些更改。 我看到了你提到的行为。 我认为这是一个比赛条件。  

    我们需要确保在 执行Tx之前执行CmdFS。  为了确保这一点,我更改了行  

        /* Set the frequency */
        // RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
        RF_runCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);

    在这一变化之后,它似乎工作正常。

    此致,

    SID

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

    谢谢,此问题已解决