工具/软件:
/***** 包括*** /
/*标准 C 库*/
#include
#include
#include //用于 uSleep 功能
/* TI 驱动程序*/
#include
#include
/* Driverlib 头文件*/
#include DeviceFamily_constructPath (driverlib/rf_prop_mailbox.h)
//*板头文件*/
#include “ti_drivers_config.h"</s>“
#include “RFQueue.h"</s>“
#include
#include
/***** 定义*** /
/*数据包 RX 配置*/
#define DATA_ENTRY_HEADER_SIZE 8.
#define MAX_LENGTH 30
//#define MAX_LENGTH 10
#define NUM_DATA_ENTRIES 2.
#define NUM_PASSIDED_BYTESS 2.
/*数据包 TX 配置*/
#define PAYLOAD_LENGTH 10.
#define PACKET_INTERVAL 500000
/***** 原型*** /
静态 void rxCallback (RF_handle h、RF_CmdHandle ch、RF_EventMask e);
/***** 变量声明*** /
静态 RF_Object rfObject;
静态 RF_Handle rfHandle;
静态 RF_CmdHandle rfPostHandle;
/* RX 数据输入缓冲区*/
#if Defined (__TI_COMPILER_VERSION__)
#pragma DATA_ALIGN (rxDataEntryBuffer、4);
静态 uint8_t rxDataEntryBuffer[rf_queue_data_entry_buffer_size (NUM_DATA_entries、MAX_LENGTH、NUM_added_bytes)];
#elif defined (__iar_systems_icc__)
#pragma DATA_ALIGNATION = 4
静态 uint8_t rxDataEntryBuffer[rf_queue_data_entry_buffer_size (NUM_DATA_entries、MAX_LENGTH、NUM_added_bytes)];
#elif defined (__GNUC__)
静态 uint8_t rxDataEntryBuffer[rf_queue_data_entry_buffer_size (NUM_DATA_entries、MAX_LENGTH、NUM_additioned_bytes)]__attribute__((aligned (4));
#else
#error 此编译器不受支持。
#endif
/* RX 的数据队列*/
静态 dataQueue_t dataQueue;
static RFC_dataEntryGeneral_t* currentDataEntry;
静态 uint8_t packetLength;
静态 uint8_t* packetDataPointer;
/* RX 和 TX 数据包*/
静态 uint8_t rxPacket[MAX_LENGTH + NUM_EXTEND_BYTESS - 1];
static uint8_t txPacket[10];//使 txPacket 足够大、能够保存接收到的数据
静态 uint8_t save[MAX_LENGTH + NUM_SUPPTED_BYTES- 1];
//static uint8_t output[MAX_LENGTH + NUM_EXTEND_BYTES- 1];
静态 uint8_t output[4];
静态 uint8_t input[10];
/***** 函数定义*** /
void *mainThread (void *arg0)
{
RF_Params rfParams;
RF_Params_init (&rfParams);
/*初始化 UART 参数*/
UART2_Params uartParams;
UART2_Params_init (&uartParams);
UART2_handle rs232Uart;
uartParams.baudrate = 115200;
rs232Uart = UART2_open (CONFIG_UART2_1、&uartParams);
UART2_WRITE (rs232Uart、“\r\nUART 成功打开\r\n“、strlen(“ UART 成功打开\r\n“)、NULL);
/*配置 LED */
GPIO_setConfig (CONFIG_GPIO_RLED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (CONFIG_GPIO_GLED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_WRITE (CONFIG_GPIO_RLED、CONFIG_GPIO_LED_OFF);
GPIO_WRITE (CONFIG_GPIO_GLED、CONFIG_GPIO_LED_OFF);
/*初始化 RX 队列*/
if (RFQueue_defineQueue (&dataQueue、rxDataEntryBuffer、sizeof (rxDataEntryBuffer)、NUM_DATA_Entriments、MAX_LENGTH + NUM_additioned_Bytes){
while (1);//分配失败
}
/*修改 RX 命令*/
rf_cmdPropRx.pQueue =&dataQueue;
RF_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
rf_cmdProprx.rxConf.bAutoFlushCrcErr = 1;
RF_cmdPropRx.maxPktLen = MAX_LENGTH;
/*设置 TX 命令*/
// RF_cmdPropTx.pktLen = payload_length;
RF_cmdPropTx.pktLen = 6;
RF_cmdPropTx.ppkt = txPacket;
RF_cmdPropTx.startTriggerType = TRIG_NOW;
/*请求访问对讲机*/
#if 已定义 (DeviceFamily_CC26X0R2)
rfHandle = RF_open (&rfObject、&RF_prop、(RF_RadioSetup*)&RF_cmdPropRadioSetup、&rfParams);
#else
rfHandle = RF_open (&rfObject、&RF_prop、(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&rfParams);
#endif
/*设置频率*/
RF_postCmd (rfHandle、(RF_Op*)&RF_cmdFs、RF_PriorityNormal、NULL、0);
while (1){
/*重置 RX 队列*/
// RFQueue_resetQueue (&dataQueue);
UART2_READ(rs232Uart、输入、sizeof(输入)、NULL);
UART2_WRITE (rs232Uart、&INPUT、sizeof (input)、NULL);
for (int c=2;c<=2;c++)
{
txPacket[2]=0x01;
txPacket[3]=0x02;
txPacket[4]= input[c];
txPacket[5]=0x04;
}
/*传输数据包*/
//RF_EventMask txTermination = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、RF_PriorityNormal、NULL、0);
RF_EventMask txTermination = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、RF_PriorityNormal、NULL、1);
if (txTermination & RF_EventLastCmdDone){
GPIO_TOGGLE (CONFIG_GPIO_GLED);//指示 TX 成功
// UART2_write (rs232Uart、“\r\nTX 数据成功\r\n“、strlen(“ TX 数据成功\r\n“)、NULL);
}
/*确保 RX 干净完成的可选延迟*/
uleep(500000);
/*启动 RX */
// RF_EventMask rxTermination = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropRx、RF_PriorityNormal、&rxCallback、RF_EventRxEntryDone);
RF_EventMask rxTermination = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropRx、RF_PriorityNormal、&rxCallback、RF_EventRxEntryDone);
/*处理 RX 终止原因*/
// RF_EventMask rxTermination = RF_EventCmdAborted | RF_EventCmdPreempted;
if(( rxTermination & RF_EventCmdAborted )&&( rxTermination & RF_EventCmdPreempted ))
{
//如果 (rxTermination & RF_EventLastCmdDone){
GPIO_TOGGLE (CONFIG_GPIO_RLED);//指示 TX 成功
}其他{
//根据需要处理其他终止原因
}
/*在数据包之间休眠*/
uSleep (packet_interval);
for (int p=0;p<MAX_LENGTH+ NUM_EXTENDED_BYTES - 1;p++)
{
if (rxPacket[p]==0XF0)
{
// UART2_write (rs232Uart、&rxPacket、sizeof (rxPacket)、NULL);
for (int q=0;q<=50;q++)
{
if (rxPacket[q]==0x03)
{
GPIO_TOGGLE (CONFIG_GPIO_RLED);//表示 RX
输出[0]=0x05;
输出[1]=0x04;
Output[2]=rxPacket[4];
输出[3]=0x06;
UART2_WRITE (rs232Uart、&OUTPUT、sizeof (output)、NULL);
}
}
}
}
//}
}
}
void rxCallback (RF_handle h、RF_CmdHandle ch、RF_EventMask e)
{
if (e & RF_EventRxEntryDone){
GPIO_TOGGLE (CONFIG_GPIO_RLED);//表示 RX
/*获取当前未处理的数据条目*/
currentDataEntry = RFQueue_getDataEntry ();
/*提取数据包数据*/
packetLength =*(uint8_t*)(¤tDataEntry->data);
packetDataPointer =(uint8_t*)(¤tDataEntry->data + 1);
memcpy (rxPacket、packetDataPointer、packetLength);
RFQueue_nextEntry();
// uleep(5000);
}
}
我们拥有此实现所需的三个功能:
- callbackFxn — 在发生 UART 中断时调用
- 将接收到的数据发送到射频 TX 并等待射频 RX 完成
- 启动 RF RX、直到完成
- 将接收到的从 RF RX 到 UART 的数据打印到
- rxCallback — 在从 RF RX 接收到数据包时调用 (仅在 EventRxEntryDone 为 true 后设置大小写)
- 切换引脚以指示 RX
- 从数据队列获取当前未处理的数据条目并提取数据包数据 (长度和 DataPointer)
- 复制到 rxPacket 变量中
- mainThread
- 初始化和配置 UART (回调读取模式)
- 使用 SEM_INIT 创建信标
- 使用 RF_OPEN 访问无线电并使用 RF_postCmd 设置频率
您 几乎已经拥有了所有的代码、这只是按顺序组织和调用函数的后续步骤。 如果您需要一些代码来帮助您朝着正确的方向前进、请告诉我。
请原谅我。