有关CC1310如何进行多任务,TX/RX,UART编程的问题
近期论坛上有很多关于CC1310如何进行多任务,TX/RX,UART编程的问题。
如此贴一个自己写的代码供大家参考。
3122.rfEasyLinkRxwithTx.7z
赞!
您好,我仔细阅读了您的代码,有两个问题需要问一下
1、您代码中UART任务的优先级和TXRX任务优先级相同,会不会有问题
2、您的这个代码我下载到了两个板子中,相同的代码,是否可以直接通讯? 我目前下载进去没有实现通讯,此外您定义的按键是否对任务切换有用,因为我们公司目前只画了核心板,没有TI官方的扩展板,只有上层的发射板。
您好,您的测试代码中屏蔽掉了RFEASYLINKRX_ASYNC
您的这个代码是否测试好用?
代码有没有RFEASYLINKRX_ASYNC 都好用 都可以进行TX和RX切换的通讯 烧到两个板子里面跑同样的代码就可以试了
但有没有RFEASYLINKRX_ASYNC的处理方式不一样,一个是用按键触发切换的,一个是用uart口接收数据切换的
在我这边优先级一样没有遇到问题,担心的话,可以尝试一个高一个低
个人觉得:
void SwithtoTx(uint8_t* packet, uint8_t len)里,先将TxSendFlag = FALSE;再Semaphore_post(txDoneSem);会比较好。
因为假如运行完Semaphore_post(txDoneSem);发生任务切换在Radio的任务,则是不是会出现问题。。
嗯 是有这种可能性 程序只是一个DEMO 有不严谨的地方
今天又发现一个问题,我目前使用IAR调试。在其他地方指定了地址对其的方式之后,发现EasyLink_receive()中的
//copy length from pDataEntry (- addrSize)
rxPacket->len = *(uint8_t*)(&pDataEntry->data);
出错, rxPacket->len一直为0.
因此手动将EasyLink_RxPacket结构体指定为单字节访问,问题得到解决。
这个可能和编译器有关。如果我取消掉其他地方的地址访问方式之后,上面运行又是对的。但是看结构体的结构,个人觉得确实应该要采用单字节对其比较好。
后续可以把结构体里的各个变量拿出来分析。
另外,我想请问在Tx函数里有如下一段解释:
/* Add a Tx delay for > 500ms, so that the abort kicks in and brakes the burst */
这段话是什么意思,为什么要加这个delay呢?
我试了一下,好像Tx的间隔比较短的情况下,系统就跑飞了。在我的应用中,会有连续两帧报文在几个ms内连续发送的情况,如果是这种情况的话,该如何处理呢?
这个delay的意思是间隔多久时间triger一次发送的command,应该在代码里已经改成5ms了,这个值应该可以更低
trigger条件的解释可以在CC1310的TRM文档里看到
http://www.ti.com/lit/ug/swcu117f/swcu117f.pdf
你好!WBJ:
我想实现收发的实时性(想要收的时候调用收的函数就能收,想要发直接调用发的函数就能发),不用通过按键、串口等触发切换,这种怎么实现?
您好 切换的实现实际上就是实现如下逻辑:
1. 如果RX或者TX command没有执行完成,则TX和RX之间加abord command
2. 如果RX或者TX已经完成了,直接切换就可以了。
例程里面触发的方法不同但是处理的逻辑实现的是以上的东西。
你好!WBJ:
你说的这个能实现实时收发吗? 我想实现接收完成,然后就实现发的功能(如果在收就不发送)。
你好,WBJ:
请问目前Driver版本更新了,增加了rfParams.pErrCb参数,请问在RF error的callback函数中该如何处理?请问这样操作是否合适?
void RF_Error_Callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
{
RF_close(h);
h = NULL;
h = RF_open(&rfObject, &EasyLink_RF_prop, (RF_RadioSetup*)&EasyLink_cmdPropRadioDivSetup, &rfParams);
RF_runCmd(h, (RF_Op*)&EasyLink_cmdFs, RF_PriorityNormal, 0, EASYLINK_RF_EVENT_MASK);
}
感谢。
你好,WBJ:
使用2_20_00_06版本的driver,IAR使用7.40,发现程序死在总线错误中断里,而出错的地址是0xE000EDF8(Debug Core Register Data)。很奇怪,是不是我的IAR 版本太低造成的?
感谢。
如下图所示:
你好,WBJ
我下载了您的程序,可是不知道出了什么问题,无法导入CCS6.13中进行编译。请问我那里出问题了呢?
您好
抱歉我的程序只有IAR中的,CCS需要自己porting。
哦哦,原来是这样,谢谢
{ /* Set Tx absolute time to current time + 100ms */ txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(5); } EasyLink_transmitAsync(&txPacket, txDoneCb); if(Semaphore_pend(txDoneSem, (15000 / Clock_tickPeriod)) == FALSE) //add by barbara { /* RX timed out abort */ if(EasyLink_abort() == EasyLink_Status_Success) { /* Wait for the abort */ Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); } // while(EasyLink_abort() != EasyLink_Status_Success); ///* Wait for the abort */ // Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); TxSendFlag = FALSE; } }
你好,在这个例程中,我借用了这部分发送接收切换的代码,但是EasyLink_ms_To_RadioTime(5),发现发送运行一次就了,EasyLink_ms_To_RadioTime(50),发送回调一直是abort_status,没有发送成功。发送和接收各自回调函数中都是abort_status,我想实现成功接收和成功发送。
有几点不太明,请教一下
1)
if(Semaphore_pend(txDoneSem, (15000 / Clock_tickPeriod)) == FALSE) //add by barbara { /* RX timed out abort */ if(EasyLink_abort() == EasyLink_Status_Success) { /* Wait for the abort */ Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); } // while(EasyLink_abort() != EasyLink_Status_Success); ///* Wait for the abort */ // Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); TxSendFlag = FALSE; }
这段代码的作用是什么?
2)txPacket.absTime = EasyLink_getAbsTime() + EasyLink_ms_To_RadioTime(5);
abstime为0和不为零的区别,对下面Semaphore_pend时间参数有什么影响?
谢谢了!
您好,这段代码的目的是等待TX发送完成。要么是等待一个超时时间,要么是等待txDoneSem信号。否则就abort TX命令。
abstime是定义这个命令执行的时间,如果是0则是立刻执行,不为零就是delay的时间。
有关Semaphore的用法,可以参考TIRTOS的说明文档file:///C:/TI/tirtos_cc13xx_cc26xx_2_20_00_06/products/bios_6_46_00_23/docs/cdoc/index.html
有关发送的command里面的配置是什么意思可以参考TRM文档: http://www.ti.com/lit/ug/swcu117f/swcu117f.pdf
您好,关于Semaphore_pend(),文档中说返回值:TRUE if successful, FALSE if timeout,该函数的说明说道If the semaphore count is greater than zero (available), this function decrements the count and returns TRUE. If the semaphore count is zero (unavailable), this function suspends execution of the current task until post() is called or the timeout expires.大致意思是,信号量count大于0(可用),函数让count增加并返回TRUE。信号量count等于0(不可用),就挂起当前正在执行的任务,直到调用post()或者超时时间到。前面你说,“要么是等待一个超时时间,要么是等待txDoneSem信号“,这里是不是有个优先满足的条件,先看信号count,count大于0直接返回真,等于0再看post()或者超时时间?
1)Semaphore_pend()中信号量、Semaphore_post()、Semaphore_pend()中超时时间是个什么逻辑关系?这里搞不清楚,特此请教一下
2)超时时间是从接收(发送)开始计时的吗?比如设定超时100ms,但是接收花了200ms,这样就超时了?可以这样理解吗?
3)还是上段代码,在测试中对接收部分,timeout设为5ms、100ms时,接收success和abort交替切换,而timeout改为500ms时,则一直是接收success,这和超时时间设置有关吗?仅超时时间起作用?但是每次在回调中都有Semaphore_post()调用啊?这里怎么理解?
1.Semaphore在这里仅仅是用来判断接收发送是否成功,pend会在一段延时后查询Semaphore是否占用,超时返回false则执行abort,若Semaphore空闲则占用Semaphore,而post则是释放占用的Semaphore,所以在程序执行完的回调函数中执行
2.超时时间应该是从执行pend开始
3.接收是否成功涉及到收发的同步问题,因为receive不到数据,rf则一直接收,但是异步情况下函数会返回可以继续执行pend,判断接收成功的条件时执行callback
当你的延时时间设置较小时,接收发送频率不一致则有可能出现有时成功有时超时abort
你好,我在接收回调函数里调用解析收到的数据包,然后调用SwithtoTx,SwithtoTx里EasyLink_abort()返回10,发送不了数据,请问怎么解决这个问题?谢谢了
我在异步接收回调函数里,调用EasyLink_abort(),返回cmd stop or abort 10的返回值,这是什么原因?
可能是你初始化的问题
你好,为什么我把频率设置为433MHz以后,就不能接收数据了?求指教!
你的板子是868的板子还是433的板子?RF前端会不一样。而且433要rev B以上版本芯片才支持,A版本不支持
这个例程 为何在我的板子上跑步起来,只能发送到PC机,CC1310接收不到PC机下发的数据,我用官网 的例程也一样,只能发数据上来,收不到下发的数据