CC1310接收和发送转换
现在在做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示例工程来实现你的应用。
好的,
谢谢两位耐心的解答