微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC1310接收和发送转换

CC1310接收和发送转换

时间:12-23 整理:3721RD 点击:

现在在做CC1310的数据传输项目

使用的RTOS为:tirtos_cc13xx_cc26xx_2_21_00_06

使用的工程为:rfEasyLinkTx 和 rfEasyLinkRx

我添加串口部分后,发现单独的接收和发送都没有问题。

现在想把接收和发送做在一个程序里面

我的思路是这样的

1.开启接收,然后Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER); 接收完数据后就post

  然后再次接收,依此循环

2.当有数据需要发送时,串口产生中断。使用EasyLink_abort() 终止接收

然后发送数据

但是这样不能终止接收,停在了下面黄色的部分。

我发现asyncCmdHndl 值通过 if (RF_cancelCmd(rfHandle, asyncCmdHndl, 0) == RF_StatSuccess)

没有改变,依然为4。

EasyLink_Status EasyLink_abort(void)
{
EasyLink_Status status = EasyLink_Status_Cmd_Error;

if ( (!configured) || suspended)
{
return EasyLink_Status_Config_Error;
}
//check an Async command is running, if not return success
if (!EasyLink_CmdHandle_isValid(asyncCmdHndl))
{
return EasyLink_Status_Aborted;
}

//force abort (gracefull param set to 0)
if (RF_cancelCmd(rfHandle, asyncCmdHndl, 0) == RF_StatSuccess)
{
/* Wait for Command to complete */
RF_EventMask result = RF_pendCmd(rfHandle, asyncCmdHndl, (RF_EventLastCmdDone | RF_EventCmdError |
RF_EventCmdAborted | RF_EventCmdCancelled | RF_EventCmdStopped));

if (result & RF_EventLastCmdDone)
{
status = EasyLink_Status_Success;
}
}
else
{
status = EasyLink_Status_Cmd_Error;
}

return status;
}

但是如果这样的话,此处代码在刚开始配置完1310后,while里面

就可以

asyncCmdHndl 的值通过此函数后if (RF_cancelCmd(rfHandle, asyncCmdHndl, 0) == RF_StatSuccess)

asyncCmdHndl 值就变成了-1.

EasyLink_receiveAsync(rxDoneCb, 0);
if(Semaphore_pend(rxDoneSem, (100000 / Clock_tickPeriod)) == FALSE)
{

if(EasyLink_abort() == EasyLink_Status_Success)
{
Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
}

还希望各位指点一下,不知道该怎么做

没有太看明白你列出来的区别再哪里。

你在哪里做了调整?

是这样的

如果配置完之后1310后这样使用

EasyLink_receiveAsync(rxDoneCb, 0);


if(Semaphore_pend(rxDoneSem, (100000 / Clock_tickPeriod)) == FALSE)
{

if(EasyLink_abort() == EasyLink_Status_Success)
{
   Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
}

}

这是有效的

但是如果配置完后这样使用

while(1)

{

EasyLink_receiveAsync(rxDoneCb, 0);
Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);

}

这样一直是接收状态,除非接收到数据(接收完数据会post)然后继续接收。

我是这样的,一直没有数据发送,程序就一直等待接收

但是当自身要发送数据的时候,我就调用了

EasyLink_abort();函数

然后填充数据发送数据

具体是这样的

if(EasyLink_abort() == EasyLink_Status_Success)
{
EasyLink_transmitAsync(&txPacket, txDoneCb);
}

但是一发送数据,进入上面 if部分 程序就卡在了EasyLink_abort() 函数中,

具体是卡在了EasyLink_abort() 函数中的这一部分

/* Wait for Command to complete */
RF_EventMask result = RF_pendCmd(rfHandle, asyncCmdHndl, (RF_EventLastCmdDone | RF_EventCmdError |
RF_EventCmdAborted | RF_EventCmdCancelled | RF_EventCmdStopped));

你的EasyLink_abort();是在哪里调用的?

你好,

是在UART部分调用的

当串口有数据的时候,先abort然后发送数据

就卡主了

看起来是你的abort里面的pendcmd一直没有执行完成

你最好是能够那你的测试代码工程发出来,我们可以看看你是哪里使用的不正确

好的,我上传一下代码

IAR使用的是7.70.2
我在这个工程中添加了SCS 部分调用的串口

你好,

测试代码这部分要改过来

while(1)
{
if(!txFlag)
{
EasyLink_receiveAsync(rxDoneCb, 0);
Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
}
/*
if(Semaphore_pend(rxDoneSem, (100000 / Clock_tickPeriod)) == FALSE)
{

if(EasyLink_abort() == EasyLink_Status_Success)
{
Semaphore_pend(rxDoneSem, BIOS_WAIT_FOREVER);
}

}
*/

}

你好

是思路不正确吗?

参考WSN Concentrator 和WSN Node例程

http://dev.ti.com/tirex/#/?link=Software%2FSimpleLink%20CC13x0%20SDK%2FExamples%2FDevelopment%20Tools%2FCC1310%20LaunchPad%2FEasyLink%2FrfWsnConcentrator

尝试了运行你的代码,通过串口给板子发送了很多数据也进入不到scTaskAlertCallback

你可以参考SDK中rfWsnConcentrator和rfWsnNode示例工程来实现你的应用。

好的,

谢谢两位耐心的解答

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top