例程问题 WBJ
您好:
WBJ,这是我对你的代码进行的修改,红色部分:
static void rfEasyLinkRxTxFnx(UArg arg0, UArg arg1)
{
#ifndef RFEASYLINKRX_ASYNC
EasyLink_RxPacket rxPacket = {0};
#endif
//add by barbara -- begin
/* Create a semaphore for Async*/
Semaphore_Params paramsTx;
Error_Block ebTx;
/* Init params */
Semaphore_Params_init(¶msTx);
Error_init(&ebTx);
/* Create semaphore instance */
txDoneSem = Semaphore_create(0, ¶msTx, &ebTx);
//add by barbara -- end
EasyLink_init(EasyLink_Phy_50kbps2gfsk);
EasyLink_setFrequency(868000000);
#ifdef RFEASYLINKRX_ADDR_FILTER
uint8_t addrFilter = 0xac;
EasyLink_enableRxAddrFilter(&addrFilter, 1, 1);
#endif //RFEASYLINKRX_ADDR_FILTER
//add by barbara -- begin
/* Setup callback for button pins */
if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFunction) != 0) {
System_abort("Error registering button callback function");
}
//add by barbara -- end
while(1) {
if(!TxSendFlag)
{
//System_printf("TxSendFlag is FAlSE, EasyLink_receive will be call\n");
rxPacket.absTime = 0;
EasyLink_Status result = EasyLink_receive(&rxPacket);
if (result == EasyLink_Status_Success)
{
len = rxPacket.len;
memcpy(payload, rxPacket.payload, len);
Uart_PostEvent(UART_EVENT_PRINT);
if(payload[3]==0x05)
{
SwithtoTx("nihao", 5);
}
/* Toggle LED2 to indicate RX */
PIN_setOutputValue(pinHandle, Board_LED2,!PIN_getOutputValue(Board_LED2));
}
else
{
/* Toggle LED1 and LED2 to indicate error */
PIN_setOutputValue(pinHandle, Board_LED1,!PIN_getOutputValue(Board_LED1));
PIN_setOutputValue(pinHandle, Board_LED2,!PIN_getOutputValue(Board_LED2));
}
//System_printf("TxSendFlag is FAlSE, EasyLink_receive call returned\n");
}
else
{
PIN_setOutputValue(pinHandle, Board_LED1,!PIN_getOutputValue(Board_LED1));
PIN_setOutputValue(pinHandle, Board_LED2,!PIN_getOutputValue(Board_LED2));
Semaphore_pend(txDoneSem, BIOS_WAIT_FOREVER); //if in TX mode pend event;
}
}
}
能正常接收代码,接收到0x05后,调用Switchtotx功能函数,但是发送不成功,不明白原因,这个和串口调用应该没什么区别吧,为什么稍作改动就不能正常运行呢
你的修改是在RX接收到数据之后用TX发送数据。这个逻辑不需要调用SwitchtoTX的原因是不需要再调用abort命令了。
RX和TX切换的逻辑是: RX或者TX命令结束之后才能调用TX或者RX命令。如果RX或者TX命令还在执行那么就需要调用abort命令先取消掉之前的命令再调用新的TX或者RX命令。
RX命令结束有两种可能,一种是主动的,就是接受到数据包那么RX命令结束。一种是被动的,就是调用abort命令之后被取消掉结束的。
回到你的代码里面,逻辑是在RX接收到数据之后,因此RX已经结束了,需要发送直接post TX命令就可以了,不需要再调用abort命令了。
你好WBJ,最近在研究你的程序和easylink例程
代码看到这里
while(1) {
#ifdef RFEASYLINKRX_ASYNC
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);
}
}
#else
1.在EasyLink_receiveAsync(rxDoneCb, 0);中已经有回调函数行使Semaphore_post,那之后的Semaphore_pend(rxDoneSem, (300000 / Clock_tickPeriod)) 不是会立即触发?怎么样在没有收到数据的时候等待300ms?
2.我记得在rfpacket例程中进入接收模式是永久性的,EasyLink_receiveAsync是否也是一样?还是接收完数据会退出接收模式?
3.Semaphore是确保同步的逻辑吧?函数中为什么会使用Async字眼呢?
也许问题问的很菜鸟,还请ti工程师们不吝赐教,O(∩_∩)O谢谢