主题中讨论的其它部件:CC1310, CC1350
您好,
我正在使用CC1310 Launchpad和CCS对其进行编程。 我正在构建noRTOS应用程序。
我想使用非阻塞无线电传输命令,即RF_postcmd()。 我想知道如何使用它,因为CCS中没有内置示例。
如何检查其状态?
谢谢
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.
您好,
我正在使用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
您可以使用回调来实现此目的。 请看一下rfEchoTx示例,其中有一个回调已用于runCmd。 同样,您也可以对回调使用postCmd。
我正在从待机模式生成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();
}
}
您是否可以在该行中放置断开点。
rtc =_INTP0;1310 =_INTP0;</s>405.5403万 405.5403万然后检查变量TX_STATUS此时的值,确保它为1。
然后在 这条线之后放置一个断点
[/quote]if1310 if (4.05540403亿 (TX_STATUS_405.5403万TX_STATUS_ rf= 1&rf= 1) busy =以确保实际发布所需的TX命令。
我们需要弄清楚代码的哪一部分未被到达,或者我们是否正在发布TX命令。此致,
SID
在这里,您提到当记录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]
您好,Gopal,
我在没有任何更改的情况下调试了您的项目,并且从未按下任何按钮。 我在中放置了断点
1. RTC_ISR()。 。
2. While循环中的断开点,如图所示。 如果您在此处注意到TX_STATUS的值,则它不会设置为1。
因此它从未到达我在RF_postCmd()处的第三个断点,因此它根本没有发布tx命令。
如果在验证RF_postCmd()正在执行后有任何代码修改,请重新检查逻辑并确保命令已发布。
此致,
SID
主席先生,
我正在上传视频以显示我的问题。 按下按钮一次后。触发RTC_ISR时,TX_STATUS为1,RF_BUSY为0。 此外,它到达RF_postCmd()处的断点,但此后,它永远不会到达RF_callback()中的断点。
首先,我认为这是硬件问题,所以我在CC1350上运行相同的项目,但该主板也面临相同的问题,即没有RTC,它会到达RF_Callback中的断点,但如果包括RTC,它永远不会到达RF_callback()中的断点。
我正在上传两个主板的视频。 (CC1310和CC1350)
此外,您是否对代码进行了任何更改?
您好,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