TI中文支持网
TI专业的中文技术问题搜集分享网站

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;

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

lin shi chang:

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。这个地方有点不太理解。

Viki Shi:

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_Blockeb;/* 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 Originatorwhile(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);}}}
}

lin shi chang:

回复 Viki Shi:

非常感谢您的回复!
对于第四点,我还是有一些疑惑。在程序中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 添加?

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

赞(0)
未经允许不得转载:TI中文支持网 » rfEasyLinkEcho例程中的相关问题
分享到: 更多 (0)