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.

[参考译文] CC1352R:如何通过 UART 和 RF CC1352R 实现低功耗

Guru**** 2390755 points
Other Parts Discussed in Thread: CC1352R

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1215215/cc1352r-how-to-achieve-low-power-consumption-with-uart-and-rf-cc1352r

器件型号:CC1352R

您好、专家!

我正在尝试通过 CC1352从主 uC 接收数据并通过射频在2.5kbps 远距离设置发送这些数据、然后 CC1352在给定的时间内进入低功耗模式这是整个任务、我已将以下代码用于我的应用、 以下代码未从  UART2_readCancel (UART)退出;、请检查以下代码并帮助解决问题、我们已使用 CC1352R 定制设计板。 以下代码消耗>15mA。

/***** 包括***** /
/*标准 C 库*/
#include
#include
#include
#include

/* TI 驱动程序*/
#include
#include
#include
//#include

/* Driverlib 头文件*/
#Include DeviceFamily_structPath (driverlib/rf_prop_mailbox.h)

/*板头文件*/
#include "ti_drivers_config.h"
#include

/* POSIX 头文件*/
#include

/***** 定义***** /

/*进行功率测量*/
#define power_measurement

/*数据包 TX 配置*/
确定有效载荷长度50.
#ifdef power_measurement
#define packet_interval 1 /*对于功率测量,将数据包间隔设置为5s */
#else
#define packet_interval 500000 //将数据包间隔设置为500000us 或500ms */
#endif

/***** 原型***** /

/***** 变量声明***** /
静态 RF_Object rfObject;
静态 rf_handle rfHandle;

静态 uint8_t packet[PAYLOAD_LENGTH];
//static uint16_t seqNumber;

//static sem_t sem;
Static Volatile size_t numBytesRead;

const size_t RX_size = 128;
静态 uint8_t RX_COM1 [128];
静态 int reset=0;
/*
*=========== callbackFxn=========
*/
void callbackFxn (UART2_handle handle、void *buffer、size_t count、void *userArg、int_fast16_t status)

如果(status!= UART2_STATUS_SUCCESS)

/* UART2_READ()*/中发生 RX 错误
while (1){}
}

numBytesRead =计数;
}

/***** 函数定义***** /

void *mainThread (void *arg0)

RF_Params rfParams;
rf_params_init (&rfParams);
UART2_Handle UART;
UART2_Params uartParams;
// int32_t semStatus;
uint32_t status = UART2_STATUS_SUCCESS;

GPIO_setConfig (CONFIG_GPIO_GLED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

GPIO_WRITE (CONFIG_GPIO_GLED、CONFIG_GPIO_LED_OFF);

/*在回调读取模式下创建 UART */
UART2_Params_init (&uartParams);
uartParams.readMode = UART2_Mode_callback;
uartParams.readCallback = callbackFxn;
uartParams.baudrate = 9600;
uartParams.readReturnMode = UART2_ReadReturnMode_partial;
// uartParams.readMode = UART2_Mode_Blocking;
uartParams.writeMode = UART2_Mode_blocking;

UART = UART2_OPEN (CONFIG_UART2_0、&uartParams);

如果(UART = NULL)

// UART2_OPEN()失败
while (1){}
}

复位=1;

rf_cmdPropTx.pktLen = payload_length;
rf_cmdPropTx.pPkt =数据包;
RF_cmdPropTx.startTrigger.triggerType = 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// DeviceFamily_CC26X0R2

/*设置频率*/
RF_postCmd (rfHandle、(RF_Op*)和 RF_cmdfs、RF_PriorityNormal、NULL、0);
STATUS = UART2_READ (UART、&RX_COM1、RX_SIZE、NULL);
while (1)

GPIO_WRITE (CONFIG_GPIO_GLED、1);
睡眠(1);
GPIO_WRITE (CONFIG_GPIO_GLED、0);
if (reset=0)

UART = UART2_OPEN (CONFIG_UART2_0、&uartParams);
如果(UART = NULL)

// UART2_OPEN()失败
while (1){}
}
STATUS = UART2_READ (UART、&RX_COM1、RX_SIZE、NULL);
}
//复位=0;
UART2_WRITE (UART、"while _OK\r\n "、sizeof ("while _OK\r\n ")、NULL);
睡眠(1);
if (numBytesRead > 0)

UART2_WRITE (UART、RX_COM1、RX_SIZE、NULL);

rf_cmdPropTx.pktLen = numBytesRead;
INT I;
for (i=0;i<numBytesRead;i++)

uint8_t* buffer8 =(uint8_t*) RX_COM1;
packet[i]= buffer8[i];
}

/*发送数据包*/
RF_EventMask terminationReason = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdPropTx、
RF_PriorityNormal、NULL、0);
memset (RX_COM1、0x0、sizeof (RX_COM1));
STATUS = UART2_READ (UART、&RX_COM1、RX_SIZE、NULL);
numBytesRead = 0;
交换机(终结状态)

案例 RF_EventLastCmdDone:
//独立的无线电操作命令或最后一个无线电
//链中的操作命令已完成。
中断;
案例 RF_EventCmdCanceled:
//命令在启动之前已取消;可能会导致此问题
//通过 RF_cancelCmd ()或 RF_flushCmd ()。
中断;
案例 RF_EventCmdAborted:
//由 RF_cancelCmd ()或引起的命令突然终止
// rf_flushCmd ()。
中断;
案例 RF_EventCmdStopped:
//由 RF_cancelCmd ()或引起的正常命令终止
// rf_flushCmd ()。
中断;
默认值:
//未捕获的错误事件
while (1);
}

uint32_t cmdStatus =((volatile RF_Op*)&RF_cmdPropTx)->status;
switch (cmdStatus)

案例 PROP_DONE_OK:
//成功传输数据包
中断;
案例 PROP_DONE_STOPPED:
//在发送数据包并完成时接收到 CMD_STOP
//传输数据包
中断;
案例 PROP_DONE_ABORT:
//发送数据包时收到 CMD_ABORT
中断;
案例 PROP_ERROR_PAR:
//观察到的非法参数
中断;
案例 PROP_ERROR_NO_SETUP:
//命令已发送,但未在受支持的中设置对讲机
//模式使用 CMD_PROP_RADIO_SETUP 或 CMD_RADIO_SETUP
中断;
案例 PROP_ERROR_NO_FS:
//在未对合成器编程的情况下发送命令
中断;
案例 PROP_ERROR_TXUNF:
//运行期间观察到 TX 下溢
中断;
默认值:
//未捕获的错误事件-这些可能来自
// rf_mailbox.h 中定义的状态池
while (1);
}
}

#ifndef power_measurement
GPIO_TOGGLE (CONFIG_GPIO_GLED);
#endif
/*关闭对讲机*/
UART2_WRITE (UART、"send_OK\r\n "、sizeof ("send_OK\r\n ")、NULL);
rf_yield (rfHandle);
/* UART2_WRITE (UART、"RF_OK\r\n"、sizeof ("RF_OK\r\n")、NULL);
UART2_rxDisable (UART);
UART2_WRITE (UART、"RDIS_OK\r\n"、sizeof ("RDIS_OK\r\n")、NULL);
UART2_readCancel (UART);
UART2_WRITE (UART、"RCAN_OK\r\n"、sizeof ("RCAN_OK\r\n")、NULL);
UART2_Close (UART);
UART2_WRITE (UART、"all_OK\r\n "、sizeof ("all_OK\r\n ")、NULL);*/
//GPIO_WRITE (CONFIG_GPIO_GLED、1);
//sleep (1);
//GPIO_WRITE (CONFIG_GPIO_GLED、0);

#ifdef power_measurement
/* packet_interval s 的睡眠*/
睡眠(packet_interval);
#else
/* packet_interval us 的睡眠*/
usleep (packet_interval);
#endif

}
}

此致

Surya.

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

    您好、Surya:

    该功能在您预期的电流消耗下是否可在 LaunchPad 上正常工作?

    如果使用单个线程来执行所有活动、请使用阻塞模式。 如果您的所有数据未传输、而您从读取返回、则可能会丢失一些数据。  

    请在此说明您要做什么。  

    此致、
    SID

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

    您好、 

    感谢您的回复、  

    我只是尝试通过 UART 从主控制器接收数据并通过射频进行发送 、然后 CC1352必须进入低功耗模式(在给定的时间段内休眠、如30分钟至60分钟) 然后唤醒、从控制器接收 UART 数据并通过射频发送。

    我不是使用 launchpad 进行测试、会使用阻塞模式进行检查、并让您知道结果。

    此致

    Surya.

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

    您好、 

    1.我使用过回调方法,是否可以在回调模式中使用回调方法???

    2.我得到了与  Launchpad 相同的结果(不会从 UART2_readCancel (UART);中退出)。

    请指导我如何 成功执行 UART2_readCancel (UART)。

    此致

    Surya.

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

    您好、Surya:  

    1.您可以使用回调模式立即从 UART 操作返回,也可以使用阻塞模式,以便 UART 操作在代码返回之前阻止代码执行。 在回调模式下、您无法阻止。

    2.我建议您测试一下 rfUARTBridge 示例 。 这从 UART 获取数据并通过无线电传输。 您可以使用此示例作为基线、然后删除该示例中发出的 RX 命令。 这应该能为您提供所需的信息。

    此致、

    SID

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

    您好、 

    1.感谢您的澄清,

    2.是的,您是正确的。我用的方法相同,但如果使用 UART 和 RF 数据包 TX,则消耗大于1.5mA,请在此论坛中查看我的上述代码。

    此致

    Surya.

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

    您好!  

    在执行 RF_Yield ()后,当您正在执行 UART_CLOSE ()时,应该没有必要使用任何其他 UART API ,如 UART2_readCancel

    所以,我建议你执行 jsut uart_close()。 此外、您的睡眠间隔似乎为1。 则会尤为重要。 我预计电流消耗会很高。  

    此致、
    SID