TI论坛
直播中

陈斌

8年用户 165经验值
私信 关注
[问答]

CC1310 TX RX整合在一起

我将TX和RX整合在一起,利用按钮做切换,但程式却丝毫没有动作,可以麻烦帮我看下问题出在哪?谢谢~

//TX + RX
//
//接收-LED0亮 (常态)
//发送-LED1亮
//
//BUTTON0-切换为TX模式,传送数据包,传送完再转为RX模式

#include
#include
#include time/System.h>
#include
#include
#include
#include
#include
#include
#include "Board.h"
#include "easylink/EasyLink.h"
#define RFEASYLINKTX_ASYNC
bool TXmode = FALSE; //预设为RX模式
uint8_t txBurstSize = 0;
EasyLink_TxPacket txPacket = [0];
//*****RX
#define RFEASYLINKRX_ASYNC
#define RFEASYLINKRX_ADDR_FILTER
#define RFEASYLINKEX_TASK_STACK_SIZE 1024
#define RFEASYLINKEX_TASK_PRIORITY 2
//*****TX
#define RFEASYLINKTX_ASYNC
#define RFEASYLINKTX_TASK_STACK_SIZE 1024
#define RFEASYLINKTX_TASK_PRIORITY 2
#define RFEASYLINKTX_BURST_SIZE 10
#define RFEASYLINKTXPAYLOAD_LENGTH 30


//*********RX
static Task_Params rxTaskParams;
Task_Struct rxTask;
static uint8_t rxTaskStack[RFEASYLINKEX_TASK_STACK_SIZE];


static PIN_Handle ledHandle;
static PIN_State ledState;
static PIN_Handle btnHandle;
static PIN_State btnState;
PIN_Config ledTable[] = [
Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_PIN_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
];
PIN_Config btnTable[] = [
Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
PIN_TERMINATE
];


//*******TX
static uint16_t seqNumber;


//*************RX
#ifdef RFEASYLINKRX_ASYNC
static Semaphore_Handle rxDoneSem;
#endif
//*************TX
#ifdef RFEASYLINKTX_ASYNC
static Semaphore_Handle txDoneSem;
#endif

void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)
[
if(!PIN_getInputValue(pinId))[
TXmode = TRUE; //button切换RX、TX模式
]
]

//***************RX
//紅燈長亮-RX 紅燈一閃-RX中止 紅黃燈一閃-RX(TX)不正常
#ifdef RFEASYLINKRX_ASYNC
void rxDoneCb(EasyLink_RxPacket * rxPacket, EasyLink_Status status)
[
if (status == EasyLink_Status_Success)
[
PIN_setOutputValue(ledHandle, Board_PIN_LED1, 1);
]
else if(status == EasyLink_Status_Aborted)
[
PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
]
else
[
PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
]
Semaphore_post(rxDoneSem);
]
#endif

//***************TX
//黃燈長亮-TX 黃燈一閃-TX中止 紅黃燈一閃-TX(RX)不正常
#ifdef RFEASYLINKTX_ASYNC
void txDoneCb(EasyLink_Status status)
[
if (status == EasyLink_Status_Success)
[
PIN_setOutputValue(ledHandle, Board_PIN_LED2, 1);
]
else if(status == EasyLink_Status_Aborted)
[
PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
]
else
[
PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
]
Semaphore_post(txDoneSem);
]
#endif

//**************RX
static void rfEasyLinkRxFnx(UArg arg0, UArg arg1)
[
#ifndef RFEASYLINKRX_ASYNC
EasyLink_RxPacket rxPacket = [0];
#endif
#ifdef RFEASYLINKRX_ASYNC
Semaphore_Params params;
Error_Block eb;
Semaphore_Params_init(¶ms);
Error_init(&eb);
rxDoneSem = Semaphore_create(0, ¶ms, &eb);
#endif //RFEASYLINKRX_ASYNC
EasyLink_init(EasyLink_Phy_Custom);

#ifdef RFEASYLINKRX_ADDR_FILTER
uint8_t addrFilter = 0xaa;
EasyLink_enableRxAddrFilter(&addrFilter, 1, 1);
#endif //RFEASYLINKRX_ADDR_FILTER
while(1) [
#ifdef RFEASYLINKRX_ASYNC
//RX模式
if(TXmode == FALSE)[
EasyLink_receiveAsync(rxDoneCb, 0);
/* Wait 300ms for Rx */
if(Semaphore_pend(rxDoneSem, (300000 / Clock_tickPeriod)) == FALSE)
[
/* RX timed out abort */
if(EasyLink_abort() == EasyLink_Status_Success)
[
/* Wait for the abort */
Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
]
]
]
//TX模式
else[
txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
txPacket.payload[1] = (uint8_t)(seqNumber++);
uint8_t i;
for (i = 2; i < RFEASYLINKTXPAYLOAD_LENGTH; i++)
[
txPacket.payload = i+2;
]
txPacket.len = RFEASYLINKTXPAYLOAD_LENGTH;
txPacket.dstAddr[0] = 0xaa;

if(txBurstSize++ >= RFEASYLINKTX_BURST_SIZE)
[
txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(50); //50->1000
txBurstSize = 0;
]
else
[
txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(5);
]
EasyLink_transmitAsync(&txPacket, txDoneCb);
if(Semaphore_pend(txDoneSem, (15000 / Clock_tickPeriod)) == FALSE)
[
if(EasyLink_abort() == EasyLink_Status_Success)
[
Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER);
]
TXmode = FALSE;
]
]
#else
if(TXmode == FALSE)
[
rxPacket.absTime = 0;
EasyLink_Status result = EasyLink_receive(&rxPacket);
if (result == EasyLink_Status_Success)
[
PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
]
else
[
PIN_setOutputValue(ledHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(ledHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
]
]
#endif //RX_ASYNC

]
]


//*******************RX
void rxTask_init(PIN_Handle ledPinHandle) [
ledHandle = ledPinHandle;
Task_Params_init(&rxTaskParams);
rxTaskParams.stackSize = RFEASYLINKEX_TASK_STACK_SIZE;
rxTaskParams.priority = RFEASYLINKEX_TASK_PRIORITY;
rxTaskParams.stack = &rxTaskStack;
rxTaskParams.arg0 = (UInt)1000000;
Task_construct(&rxTask, rfEasyLinkRxFnx, &rxTaskParams, NULL);
]


int main(void)
[
Board_initGeneral();

ledHandle = PIN_open(&ledState, ledTable);
if(!ledHandle) [
System_abort("Error initializing board LED pinsn");
]
btnHandle = PIN_open(&btnState, btnTable);
if (!btnHandle) [
System_abort("Error initializing button pinsn");
]

PIN_setOutputValue(ledHandle, Board_PIN_LED1, 0);
PIN_setOutputValue(ledHandle, Board_PIN_LED2, 0);

rxTask_init(ledHandle);

BIOS_start();
return (0);
]

回帖(4)

盛越熊

2020-3-25 07:59:47
你没有注册button的callback函数,所以,按键动作不会得到响应
参见pinInterrupt示例工程
/* Setup callback for button pins */
if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn) != 0) [
/* Error registering button callback function */
while(1);
]
举报

陈斌

2020-3-25 08:09:10
引用: 个人用户 发表于 2020-3-25 07:59
你没有注册button的callback函数,所以,按键动作不会得到响应
参见pinInterrupt示例工程
/* Setup callback for button pins */

谢谢你的发现,我补上之后已经可以运作,但现在有个问题:
两块板子CC1310汇入同一个程式,通电并搭配使用SmartRF studio7来看接收的资料,
当我板子A作为接收时,并开启SmartRF studio7里的packet.RX,板子B不开启SmartRF studio7,若B按下按钮,则我可以在SmartRF studio7看见数据;
当我板子A作为接收时,并开启SmartRF studio7里的packet.RX,板子B也开启SmartRF studio7,则不论是从A还是B的SmartRF studio7都看不到数据接收,而板子也没出现任何灯号
另外当我两块板子都不开启SmartRF studio7的话,是可以看到正常的灯号变化,我可以由灯号判断出是否进入TX模式,但我无法判断另一块板子是否接收成功....
请问是什么原因???
举报

盛越熊

2020-3-25 08:14:29
引用: cknz 发表于 2020-3-25 08:09
谢谢你的发现,我补上之后已经可以运作,但现在有个问题:
两块板子CC1310汇入同一个程式,通电并搭配使用SmartRF studio7来看接收的资料,
当我板子A作为接收时,并开启SmartRF studio7里的packet.RX,板子B不开启SmartRF studio7,若B按下按钮,则我可以在SmartRF studio7看见数据;

当你“开启”smartRF studio时,板子直接受studio控制,之前下载到板子Flash里的程序不会运行;
当你“不开启”smartRF studio时,板子才会运行Flash里的程序。
“开启”smartRF studio不会擦除或改写Flash里的程序。
所以,
你描述的第一种情况,A受studio控制,执行packet rx;B运行Flash里的代码,B按下按钮后开始发送,所以你能在A板对应的smartRF studio的packet rx中接收到B发出的数据
你描述的第二种情况,A和B都受studio控制,都在执行packet rx;这时没有设备发送数据,所以在两个studio界面里都看不到接收数据。因为两块板子都没有运行Flash里的程序,因此LED也不会闪烁
你描述的第三种情况,A和B都不受studio控制,都在运行Flash里的程序,具体是处于tx还是rx,取决于你的按钮操作。按照你的代码,在成功接收到数据后,应该会点亮LED_1。
举报

陈斌

2020-3-25 08:33:47
引用: 个人用户 发表于 2020-3-25 08:14
当你“开启”smartRF studio时,板子直接受studio控制,之前下载到板子Flash里的程序不会运行;
当你“不开启”smartRF studio时,板子才会运行Flash里的程序。
“开启”smartRF studio不会擦除或改写Flash里的程序。

好的,谢谢你的分析,我程式应该是没问题的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分