工具与软件:
大家好!
我是德州农工大学的学生、正在使用设计一个射频项目 CC1354P10-1 LaunchPad . 我使用的是 rfEchoTx.c 作为演示基础、并将其与 LCD 显示屏集成、而 LCD 显示屏是我上学期构建的一项驱动程序。
项目目标:
我们的目标是创建一个 对讲机式网络 、每个 LaunchPad 都可以 发送和接收音频数据包 动态地配置。 LCD 应根据器件的状态进行更新、如所示 "正在传输..." 、 "正在接收..." 或空闲时的默认消息"即按即说"。 我还想首先使用 LED 来指示这些状态。 发送时为绿色、接收时为红色、空闲时在红色和绿色之间切换。 按下一个 LaunchPad 上的按钮后、将进入发送模式、另一个 LaunchPad 将进入接收模式。 空闲和发送状态按预期工作、但接收状态不工作。
我面临的问题:
我目前遇到与的问题 RF 接收处理 . 具体而言:
- LCD 未更新为"正在接收..." 即使正在发送数据包也是如此。
- 接收时、红色 LED (CONFIG_GPIO_RLED)不会保持亮起。 相反、它会快速地在红色和绿色之间切换、表示 LaunchPad 正在接收某些容量、但逻辑未按预期执行。 接收时、红色 LED 应保持亮起、而不会在红色和绿色之间闪烁/切换。
- RF 接收似乎不一致 我怀疑这个问题在我的
rfCallback()
功能中。
下面是我的代码:
#include
#include
#include
#include
#include
/* TI 驱动程序*/
#include
#include
#include
#include "ti_drivers_config.h"
#include
/*自定义 LCD 库*/
#include "LCD.h"
/*数据包配置*/
#define PAYLOAD_LENGTH 30.
#define PACKET_INTERVAL (uint32_t)(4000000 * 1.0f)
#define RX_TIMEOUT (uint32_t)(4000000 * 0.5f)
#define NUM_DATA_ENTRIES 2.
#define NUM_APPLATED_BYTES 2.
/* LED 闪烁间隔*/
#define LED_TOGGLE_INTERVAL 500000 // 500ms
/*回波模式保持时间*/
#define ECHO_HOLD_TIME (uint32_t)(4000000 * 0.2f)// 200ms 延迟
/*无线电状态*/
typedef 枚举{
LISTE_MODE、
TRANSMIT_MODE、
echo_mode
}无线电状态;
/*全局变量*/
静态 RF_Object rfObject;
静态 rf_handle rfHandle;
静态 RadioState radioState = LISTE_MODE;
静态 uint8_t txPacket[PAYLOAD_LENGTH];
静态 uint16_t seqNumber;
静态 dataQueue_t dataQueue;
静态 RFC_propRxOutput_t rxStatistics;
static volatile bool buttonPressed = false;
静态易失性 bool isReceiving = false;
静态 uint32_t lastStateChangeTime = 0;
static I2C_handle i2cHandle;//全局 I2C 句柄
/*函数原型*/
静态 void rfCallback (RF_Handle h、RF_CmdHandle ch、RF_EventMask e);
静态 void buttonCallback (uint_least8_t index);
void setupRadio();
void transmitPacket();
void receivePacket();
void echPacket();
void updateLEDState();
void holdEchoMode();
void displayDefaultMessage();
void displayTransmitingMessage();
void displayReceivingMessage();
/*按钮中断处理程序*/
静态 void buttonCallback (uint_least8_t index){
buttonPressed =!buttonPressed;//切换发送状态
}
/*无线电事件回调*/
/*无线电事件回调*/
/*无线电事件回调*/
静态 void rfCallback (RF_Handle h、RF_CmdHandle ch、RF_EventMask e){
如果(e & RF_EventRxEntryDone){
GPIO_WRITE (CONFIG_GPIO_RLED、CONFIG_GPIO_LED_ON);//**接收时红色亮起**
Usleep(50000);//**短暂延迟**
GPIO_WRITE (CONFIG_GPIO_RLED、CONFIG_GPIO_LED_OFF);
RadioState = ECHO_MODE;
IsReceiving = true;
lastStateChangeTime = RF_getCurrentTime ();
updateLEDState();
displayReceivingMessage();
}
否则为(e 和 RF_EventCmdDone){
if (radiostate == TRANSMIT_MODE){
//**保持传输模式、直到按钮释放**
RadioState = TRANSMIT_MODE;
}
else if (radioState == echo_mode){
isReceiving = false;//**退出接收模式**
RadioState = LISTE_MODE;
displayDefaultMessage();
}
}
}
/*短时间保持回波模式*/
void holdEchoMode(){
while ((RF_getCurrentTime ()- lastStateChangeTime)< echo_hold_time){
//不执行任何操作(保持 echo_mode)
}
RadioState = LISTE_MODE;//仅在延迟后切换
displayDefaultMessage();
}
/*初始化 RF */
void setupRadio(){
rf_Params rfParams;
rf_params_init (&rfParams);
rfHandle = rf_open (&rfObject、&rf_prop、(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&R rfParams);
RF_postCmd (rfHandle、(RF_Op*)&RF_cmdfs、RF_PriorityNormal、NULL、0);
}
/*发送数据包*/
void transmitPacket(){
txPacket[0]=(uint8_t)(seqNumber >> 8);
txPacket[1]=(uint8_t)(seqNumber++);
对于(uint8_t i = 2;i < PAYLOAD_LENGTH;i++){
txPacket[i]= rand ();
}
RF_cmdPropTx.pktLen =有效载荷长度;
rf_cmdPropTx.pKT = txPacket;
RF_cmdPropTx.startTriggerType = trig_now;
RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、RF_PriorityNormal、rfCallback、RF_EventCmdDone);
}
/*回显数据包*/
void echPacket(){
RF_cmdPropTx.pktLen =有效载荷长度;
rf_cmdPropTx.pKT = txPacket;
RF_cmdPropTx.startTriggerType = trig_now;
RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、RF_PriorityNormal、rfCallback、RF_EventCmdDone);
}
/*接收数据包*/
void receivePacket(){
if (接收){
返回;
}
RF_cmdPropRx.pQueue =&dataQueue;
rf_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
rf_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
rf_cmdPropRx.maxPktLen =有效载荷长度;
rf_cmdPropRx.pOutput =(uint8_t *)&rxStatistics;
RF_cmdPropRx.endTrigger.triggerType = TRIG_REL_PREVEND;
RF_cmdPropRx.EndTime = RX_TIMEOUT;
RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropRx、RF_PriorityNormal、rfCallback、RF_EventRxEntryDone);
}
/*更新 LED 行为*/
void updateLEDstate(){
静态 uint32_t lastToggleTime = 0;
if (radiostate == TRANSMIT_MODE){
GPIO_WRITE (CONFIG_GPIO_GLED、CONFIG_GPIO_LED_ON);
GPIO_WRITE (CONFIG_GPIO_RLED、CONFIG_GPIO_LED_OFF);
}
否则、if (radioState == echo_mode || isReceiving){
GPIO_WRITE (CONFIG_GPIO_GLED、CONFIG_GPIO_LED_OFF);
GPIO_WRITE (CONFIG_GPIO_RLED、CONFIG_GPIO_LED_ON);
}
否则 if (radioState == listene_mode &&!isReceiving){
如果((RF_getCurrentTime ()- lastToggleTime)> LED_TOGGLE_INTERVAL){
GPIO_TOGGLE (CONFIG_GPIO_GLED);
GPIO_TOGGLE (CONFIG_GPIO_RLED);
lastToggleTime = RF_getCurrentTime ();
}
}
}
/*显示默认消息*/
void displayDefaultMessage(void){
LCD_setCursor (i2cHandle、0、0);//将光标移动到第1行
LCD_print (i2cHandle、"Push-to-talk ");//覆盖旧文本的额外空格
}
/*显示传输消息*/
void displayTransimentingMessage(void){
LCD_setCursor (i2cHandle、0、0);//将光标移动到第1行
LCD_print (i2cHandle、"transmitted..");
}
/*显示接收消息*/
void displayReceivingMessage(void){
LCD_setCursor (i2cHandle、0、0);//将光标移动到第1行
LCD_print (i2cHandle、"正在接收... ");
}
/*主程序*/
void * mainThread (void * arg0){
/*初始化外设*/
GPIO_init ();
I2C_INIT();
/*初始化 I2C 参数*/
I2C_Params i2cParams;
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_100kHz;
/*打开 I2C 实例*/
i2cHandle = I2C_open (CONFIG_I2C_1、&i2cParams);
if (i2cHandle == NULL){
printf ("I2C 打开失败!\n");
while (1);
}
/*配置 Button 引脚和寄存器回调*/
GPIO_setConfig (CONFIG_GPIO_Button_0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_Both_EDGE);
GPIO_setCallback (CONFIG_GPIO_BUTON_0、buttonCallback);
GPIO_enableInt (CONFIG_GPIO_BUTONG_0);//启用按钮的中断
/*初始化 LCD */
LCD_init (i2cHandle);
/*显示默认消息*/
displayDefaultMessage();
/*初始化 RF */
setupRadio();
while (1){
if (buttonPressed){
RadioState = TRANSMIT_MODE;
IsReceiving = false;
transmitPacket();
displayTransimentingMessage();
}
else if (radioState == echo_mode){
echoPacket();
holdEchoMode();//确保回波模式在返回 Listen_mode 之前保持
}
否则、如果(!isReceiving){
RadioState = LISTE_MODE;
displayDefaultMessage();
receivePacket();
}
updateLEDState();
usleep (50000);//睡眠50ms 以减少 CPU 的使用
}
}