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.

[参考译文] LP-EM-CC1354P10:使用板载 Rx LED&#39的 TX-GPIO 集成(Walkie-Talkie 项目帮助)

Guru**** 2341440 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/rf-microwave-group/rf-microwave/f/rf-microwave-forum/1470388/lp-em-cc1354p10-tx-rx-integration-using-onboard-gpio-led-s-walkie-talkie-project-help

器件型号:LP-EM-CC1354P10

工具与软件:

大家好!

我是德州农工大学的学生、正在使用设计一个射频项目 CC1354P10-1 LaunchPad . 我使用的是 rfEchoTx.c 作为演示基础、并将其与 LCD 显示屏集成、而 LCD 显示屏是我上学期构建的一项驱动程序。

项目目标:

我们的目标是创建一个 对讲机式网络 、每个 LaunchPad 都可以 发送和接收音频数据包 动态地配置。 LCD 应根据器件的状态进行更新、如所示 "正在传输..." "正在接收..." 或空闲时的默认消息"即按即说"。 我还想首先使用 LED 来指示这些状态。 发送时为绿色、接收时为红色、空闲时在红色和绿色之间切换。 按下一个 LaunchPad 上的按钮后、将进入发送模式、另一个 LaunchPad 将进入接收模式。 空闲和发送状态按预期工作、但接收状态不工作。  

我面临的问题:

我目前遇到与的问题 RF 接收处理 . 具体而言:

  1. LCD 未更新为"正在接收..." 即使正在发送数据包也是如此。
  2. 接收时、红色 LED (CONFIG_GPIO_RLED)不会保持亮起。 相反、它会快速地在红色和绿色之间切换、表示 LaunchPad 正在接收某些容量、但逻辑未按预期执行。 接收时、红色 LED 应保持亮起、而不会在红色和绿色之间闪烁/切换。
  3. 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 的使用
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    恐怕无法从仅仅看代码就知道出了什么问题。

    你只需要尝试缩小问题本身,然后我们可以尝试帮助你,如果你可以找出什么是失败的。

    如果您的问题看起来与 Rx 代码相关、则应尝试进行调试、而不对项目进行任何其他操作。

    只需实施代码、即将一块板置于 RX 中、并在每次按下按钮时让另一块板传输1个数据包。

    确保您不仅接收到您正在发送的数据包、而且正确处理所有可能的错误情况(如果您接收到带有 CRC 错误的数据包、数据条目中没有空间的数据包、没有更多可用的数据条目等)。

    一旦这一过程生效、您可以添加更多的协议。 一种好方法是在调用函数之前和之后、在回调等中切换引脚、然后使用逻辑分析仪来监控这些信号、在大多数情况下、这将为您提供有关问题的良好指示。

    从射频内核路由 LNA 和 PA 信号(将射频内核信号路由到物理引脚—SimpleLink CC13XX/CC26XX SDK 专有射频用户指南7.30.00文档)始终是调试的好选择、因为这将告诉您无线电处于何种状态。

    您应该同时监控接收器和发送器上的这些信号。

    简单地看一下代码、您不应该在回调中使用 usleep、并且您还应该考虑将 LCD 内容移出回调(不要在回调中调用阻塞函数)

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Siri。 在过去的几天里,我一直在努力缩小问题的范围。 我添加了 UART 调试语句以尝试找出问题所在、然后我将向您显示代码的当前状态。 我已经缩小了问题在几个函数之间的范围:

    void receivePacket(){
    uartPrint ("[RX]接收包开始\r\n");
    if (接收){
    uartPrint ("[RX]已在接收、跳过\r\n");
    返回;
    }

    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;

    uartPrint ("[RX]正在运行 RF 命令...\r\n");
    RF_CmdHandle cmd = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropRx、RF_PriorityNormal、rfCallback、RF_EventRxEntryDone);

    如果(cmd < 0){
    uartPrint ("[RX]错误:rf_runCmd 失败!\r\n");
    其他{
    uartPrint ("[RX] RF 命令成功\r\n");
    }
    uartPrint ("[RX] Packet Ready to receive\r\n");
    uartPrint ("[RX] RF 命令句柄:");
    字符缓冲器[20];
    snprintf (buffer、sizeof (buffer)、"%d\r\n"、cmd);
    uartPrint (缓冲区);
    }

    void transmitPacket(){
    uartPrint ("[TX] Transmit Packet Start\r\n");
    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;

    uartPrint ("[TX]正在运行 RF 命令...\r\n");
    RF_CmdHandle cmd = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、RF_PriorityNormal、rfCallback、RF_EventCmdDone);

    如果(cmd < 0){
    uartPrint ("[TX]错误:rf_runCmd 失败!\r\n");
    其他{
    uartPrint ("[TX] RF 命令成功\r\n");
    }
    uartPrint ("[TX]数据包已发送\r\n");
    }

    静态 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();
    } else if (e & RF_EventCmdDone){
    if (radiostate == TRANSMIT_MODE){
    //**保持传输模式、直到按钮释放**
    RadioState = TRANSMIT_MODE;
    } else if (radioState == echo_mode){
    isReceiving = false;//**退出接收模式**
    RadioState = LISTE_MODE;
    displayDefaultMessage();
    }
    }
    }

    我几乎可以肯定的问题在于 receivepacket()

    空闲时、这是串行输出:  

    [Rx] RF 命令成功
    [Rx]数据包准备好接收
    [Rx] RF 命令句柄:2.
    [Rx]接收数据包开始
    [Rx]正在运行射频命令...
    [Rx] RF 命令成功
    [Rx]数据包准备好接收
    [Rx] RF 命令句柄:2.
    [Rx]接收数据包开始
    [Rx]正在运行射频命令...
    [Rx] RF 命令成功
    [Rx]数据包准备好接收
    [Rx] RF 命令句柄:2.
    [Rx]接收数据包开始
    [Rx]正在运行射频命令...
    [Rx] RF 命令成功
    [Rx]数据包准备好接收
    [Rx] RF 命令句柄:2.
    [Rx]接收数据包开始
    [Rx]正在运行射频命令...

    此终端输出显示接收操作的重复周期。 系统持续尝试接收数据包、在 RF 命令被执行时输出一条成功消息、表示一个数据包已经为接收做好准备、并且显示 RF 命令句柄(值2)。 此循环无限期地持续下去、这表明器件处于恒定的接收状态、即使没有发送新的数据包也是如此。 当 LaunchPad 接收来自其他器件的信号时、串行输出速度会提高、但保持不变的周期。 发送时、这是输出:  


    按下[Main](主)按钮**
    [TX]发送包开始**
    [TX]正在运行 RF 命令...**
    [TX] RF 命令成功**
    [TX]已发送包**

    这指示每次按下按钮时、器件都会开始传输过程、成功运行 RF 命令、并发送数据包。 重复这些线路意味着正在按下按钮、每次都会触发传输序列。

    作为参考、这里是我的主循环:  while (1){
    if (buttonPressed){
    RadioState = TRANSMIT_MODE;
    IsReceiving = false;
    uartPrint (按下"[Main]按钮\r\n");
    transmitPacket();
    displayTransimentingMessage();
    } else if (radioState == echo_mode){
    echoPacket();
    holdEchoMode();
    }否则、如果(!isReceiving){
    RadioState = LISTE_MODE;
    displayDefaultMessage();
    receivePacket();
    }
    updateLEDState();
    usleep (50000);//睡眠50ms
    }
    非常感谢您提供任何帮助或调试建议

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我已经给了你调试提示,但你没有遵循它们(见我的第一个答案)。

    将数据打印到 UART 并不是一种好的调试方法、因为这需要花费大量时间、并且不会告诉您发生了什么情况。

    我在回调中的任何位置都看不到您正在处理队列。

    此外、Rx 命令的状态是什么?

    Siri