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.

[参考译文] CC2652RSIP:CC2652RSIP UART

Guru**** 2502205 points
Other Parts Discussed in Thread: CC2652RSIP

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1555961/cc2652rsip-cc2652rsip-uart

器件型号:CC2652RSIP


工具/软件:

/***** 包括*** /
/*标准 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*)(&currentDataEntry->data);
packetDataPointer =(uint8_t*)(&currentDataEntry->data + 1);
memcpy (rxPacket、packetDataPointer、packetLength);


RFQueue_nextEntry();
// uleep(5000);
}
}

我们拥有此实现所需的三个功能:  

  1. callbackFxn — 在发生 UART 中断时调用
    1. 将接收到的数据发送到射频 TX 并等待射频 RX 完成
    2. 启动 RF RX、直到完成
    3. 将接收到的从 RF RX 到 UART 的数据打印到
  2. rxCallback — 在从 RF RX 接收到数据包时调用 (仅在 EventRxEntryDone 为 true 后设置大小写)
    1. 切换引脚以指示 RX
    2. 从数据队列获取当前未处理的数据条目并提取数据包数据 (长度和 DataPointer)
    3. 复制到 rxPacket 变量中
  3. mainThread
    1. 初始化和配置 UART (回调读取模式)
    2. 使用 SEM_INIT 创建信标
    3. 使用 RF_OPEN 访问无线电并使用 RF_postCmd 设置频率

您 几乎已经拥有了所有的代码、这只是按顺序组织和调用函数的后续步骤。 如果您需要一些代码来帮助您朝着正确的方向前进、请告诉我。  

请原谅我。

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

    您好、

    感谢您的联系。
    我不确定我明白您的问题是什么。 你有一个具体的问题,你想让我们消解吗?

    此致、
    Maxence

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

    尊敬的 Kumaravel:

    此致、
    Ryan

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

    在这个代码中,我想使它成为 UART 中断 和下电模式。

    我正在使用 cc2652rsip、我需要执行下电模式、当 UART 插入 UART 将读取数据时、 应将数据 发送到射频传输。 之后、它应该再次进入省电模式、这时射频再次接收任何数据时、UART 中断应该会调用然后的 UART 写入函数起作用。

    那么、如何 在此代码中执行 UART 中断以及如何执行断电模式

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

    您的代码由 rfPacketRx/Tx(无线电接收无限期打开)激发。  有两个与您的应用相关的使用场景会阻止断电模式:

    • UART RX 要求主 CPU 开启以提供 48MHz 时钟
      • 可以通过在接收 UART 字节之前使用唤醒引脚或使用虚拟字节发送到多路复用为 GPIO 输入中断的 UART RX 来缓解该问题。
    • 恒定无线电 RX 的平均值大于 7.3mA
      • 休眠式无线电设备通过使用接收窗口等在短时间内向其父设备请求信息来解决此问题

    rfDiagnosticsrfEchoTx15.4-Stack 传感器Zigbee 终端器件 将更适合您的需求(提供进一步修改)。

    此致、
    Ryan