This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

rfEasyLinkEcho例程中的相关问题

rfEasyLinkEchoTX/RX例程中,单独的一方(TX或者RX)都可以进行双向通信。

1.在发送的API中EasyLink_transmitCcaAsync(&txPacket, echoTxDoneCb);这个函数是不是加入了(LBT)的机制。

2.这个例程可以使用节点的Mac地址进行通信吗?

3.这个例程中EasyLink_setFrequency(uint32_t ui32Frequency)和EasyLink_setRfPower(int8_t i8TxPowerDbm)这两个API,可以动态的修改节点的频率和RfPower吗?

4.在这个例程中,我看到

//Use an IEEE header for the Tx/Rx command
static bool useIeeeHeader = 0;

这个是使用哪种方式进行的通信?

  • if(useIeeeHeader)
    {
    uint16_t ieeeHdr = EASYLINK_IEEE_HDR_CREATE(EASYLINK_IEEE_HDR_CRC_2BYTE, EASYLINK_IEEE_HDR_WHTNG_EN, (txPacket->len + addrSize + sizeof(ieeeHdr)));
    hdrSize = EASYLINK_HDR_SIZE_NBYTES(EASYLINK_IEEE_HDR_NBITS);
    txBuffer[0] = (uint8_t)(ieeeHdr & 0x00FF);
    txBuffer[1] = (uint8_t)((ieeeHdr & 0xFF00) >> 8);
    }
    上面这个判断,如果使用了useIeeeHeader。这个地方有点不太理解。
  • 1、可以这么理解,发送之前会检查clear channel

    2、可以通过 EasyLink_GetIeeeAddr()获取IEEE地址并通过easylink header发出

    3、可以,不过不要在TX时修改TXpower,下面附一个动态修改frequency的例子:

    4、程序里IEEE header是false,easylink有一个基本的packet形式,请看下图。

    static EasyLink_Status statusFreq;
    static EasyLink_Status statusTx;
    static EasyLink_Status statusRx;
    
    static void rfEasyLinkEchoTxFnx(UArg arg0, UArg arg1)
    {
        uint32_t absTime;
    
        /* Create a semaphore for Async */
        Semaphore_Params params;
        Error_Block      eb;
    
        /* Init params */
        Semaphore_Params_init(&params);
        Error_init(&eb);
    
        /* Create semaphore instance */
        echoDoneSem = Semaphore_create(0, &params, &eb);
        if(echoDoneSem == NULL)
        {
            System_abort("Semaphore creation failed");
        }
        
        EasyLink_Params easyLink_params;
        EasyLink_Params_init(&easyLink_params);
        
        easyLink_params.ui32ModType = EasyLink_Phy_Custom; 
    
        /* Initialize EasyLink */
        if(EasyLink_init(&easyLink_params) != EasyLink_Status_Success)
        {
            System_abort("EasyLink_init failed");
        }
    
        /* Set output power to RFEASYLINKECHO_RF_POWER dBm */
        EasyLink_setRfPower(RFEASYLINKECHO_RF_POWER);
    
        // Packet Originator
        while(1) {
            /* Create packet with incrementing sequence number and random payload */
            txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
            txPacket.payload[1] = (uint8_t)(seqNumber++);
            uint8_t i;
            for (i = 2; i < RFEASYLINKECHO_PAYLOAD_LENGTH; i++)
            {
                txPacket.payload[i] = rand();
            }
    
            txPacket.len = RFEASYLINKECHO_PAYLOAD_LENGTH;
            txPacket.dstAddr[0] = 0xaa;
    
            /* Set Tx absolute time to current time + 1000ms */
            if(EasyLink_getAbsTime(&absTime) != EasyLink_Status_Success)
            {
                // Problem getting absolute time
            }
            txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(1000);
    
            statusFreq = EasyLink_setFrequency(868000000);/
    
            statusTx = EasyLink_transmitAsync(&txPacket, echoTxDoneCb);
    
            /* Wait for Tx to complete. A Successful TX will cause the echoTxDoneCb
             * to be called and the echoDoneSem to be released, so we must
             * consume the echoDoneSem
             */
            Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);
    
            statusFreq = EasyLink_setFrequency(900000000);
    
            /* Switch to Receiver */
            statusRx = EasyLink_receiveAsync(echoRxDoneCb, 0);
    
            /* Wait 500ms for Rx */
            if(Semaphore_pend(echoDoneSem, (500000 / Clock_tickPeriod)) == FALSE)
            {
                /* RX timed out abort */
                if(EasyLink_abort() == EasyLink_Status_Success)
                {
                   /* Wait for the abort */
                   Semaphore_pend(echoDoneSem, BIOS_WAIT_FOREVER);
                }
            }
        }
    }

  • 非常感谢您的回复!
    对于第四点,我还是有一些疑惑。在程序中IEEE header是false。如果我要使用,则变为true。在程序中,我看到在发送的API中有以下的代码段
    if(useIeeeHeader)
    {
    uint16_t ieeeHdr = EASYLINK_IEEE_HDR_CREATE(EASYLINK_IEEE_HDR_CRC_2BYTE, EASYLINK_IEEE_HDR_WHTNG_EN, (txPacket->len + addrSize + sizeof(ieeeHdr)));
    hdrSize = EASYLINK_HDR_SIZE_NBYTES(EASYLINK_IEEE_HDR_NBITS);
    txBuffer[0] = (uint8_t)(ieeeHdr & 0x00FF);
    txBuffer[1] = (uint8_t)((ieeeHdr & 0xFF00) >> 8);
    }
    这边好像也不是使用IEEE地址进行的通信,IEEE地址是64位的,感觉对不上。

    如果使用IEEE地址进行通信,是不是要自己在txpacketzhong 添加?

    如果可以,贴个示例代码看一下。