*应用示例- CC120x Easy Link Tx/Rx (来自CC120x软件示例)
此示例生成一个仅Tx和一个仅Rx的端点。
是否可以使它相互交谈? (半双工)
因此,使两端同时执行Tx和Rx。
-当一端执行Tx时,B端执行Rx
-当B端执行Tx时,A端执行Rx
您能否指导如何在Tx模式和Rx模式之间切换?
此致,
海登
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.
您好,Hayden。
在我目前正在工作的项目中,我有一个主服务器和几个从属服务器。 其中每个都可以Tx和Rx。
我不知道这是不是最好的方法,但我正在做这样的事情:
1.初始化对讲机并创建任务
void radio_task_init(void)
{
u8 addrFilter[EasyLink_MAX_ADDR_SIZE * EasyLink_MAX_ADDR_filters]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//广播地址
0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0xff,//自有地址
0xFF,0xff,0xff,0xff,0xff,0xff,0xff};//未使用
EasyLink_init (dRADIO_EasyLink_modulement);
EasyLink设定频率(dRADIO_FREQUENCY);
EasyLink_setRfPwrd(dRADIO_POWER);
//它将接收到广播地址和地址的消息EasyLink_AdeFilter_AdeLink_AdgetLink_AdeFilter( EasyLink_EasyLink_Adget_Adget_Adget_Light_Light_Add_Filter_Adget_Adget_Ad_Adget_Adget_Ad_Adget_Ad_Light_Light_Light_Light_Add_Link_Add_Light_Light_Light_Light_Add_Filter(
EasyLink _MAX_ADDR_filters);
Event_Params eventParams;
EVENT_PARAM_INIT (&eventParams);
radioEvents = Event_create(&eventParams, NULL);
Task_Params taskParams;
Task_Params_init(&taskParams);
taskParams.STACKSIZE = dRADIO_TASK_STACK_SIZE;
taskParams.priority = dRADIO_TASK_priority;
taskParams.stack = radioTaskStack;
Task_construct (&radioTask,radio_task,&taskParams, 空);
}
2.在任务中,将对讲机置于Rx模式,并等待将对讲机重新置于Rx模式的事件。
现在我只有一个活动,但我可以在未来举办更多活动。
static void radio_task(UArg arg0, UArg arg1)
{
u32 eventResult;
EasyLink_receiveAsync (Rx_callback,0);
while (1)
{
eventResult = Event_pend(radioEvents, 0, dEVENT_All, BIOS_wait_Forever );
IF (eventResult & dEVENT_packet_Received){EasyLink_callback}
3.由于对讲机始终处于Rx模式,因此当接收到新数据包或回叫中发生错误时,我们需要将其重新置于Rx模式。
静态void rx_callback(EasLink_RxPacket * rxmitter Packet, EasyLink_Status status)
{if(status
== EasyLink_Status_suce)
{if(rxCallback
!=NULL)&&(RxPacket->len >0))
{if(!memcmp((const
*)rxPacket->dstAddr->ddr->dstAddr,(con_Broadcast_reastpy);)
//进程接收的数据包
process_packet(&rxPacket->payload[EasyLink_MAX_ADDR_size]);
}//
将对讲机放回Rx
Event_post(radioEvents,dEVENT_packet_received);
}
IF (状态== EasyLink_Status_Rx_Error)||(状态== EasyLink_Error_Timeout)|
状态=EasyLink_Error_Error_Status_Error_Error_Error_Link_Error_|
//将对讲机放回Rx
Event_post(radioEvents,dEVENT_packet_received);
}
IF (status == EasyLink_Status_Aborted)
{
//中止的Rx的函数负责将其放回Rx
中}
4.同样,由于对讲机始终处于Rx状态,我们需要在发送数据包之前中止Rx。 发送数据包后,我们将对讲机放回Rx中。
void radio_send (u8 * address,u8 * data,u8 size)
{
if (size > dRADIO_MAX_DATA_length)
size = dRADIO_MAX_DATA_length;
//在有效负载的前8个字节中插入我们自己的地址
EasyLink_getIeeAddr (txPacket.payload);
memcpy (&txPacket.MAX_DAX_Size)<EasyLink_Size)
txPacket.len =大小;
txPacket.absTime = 0;
memcpy(txPacket.dstAddr, address, EasyLink_MAX_ADDR_Size);
EasyLink_abort();
EasyLink_Transmit (&txPacket);
//将对讲机放回Rx中
EasyLink_receiveAsync(Rx_callback, 0);}
我使用这种方法已经有一段时间了,它运行得很好。
如果TI员工有更好的方法,我将很高兴看到! 欢迎任何改进!
此致。