微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > 例程问题 WBJ

例程问题 WBJ

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

您好:
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(&paramsTx);
    Error_init(&ebTx);

    /* Create semaphore instance */
    txDoneSem = Semaphore_create(0, &paramsTx, &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谢谢

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

网站地图

Top