请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC1352R 主题中讨论的其他器件:CC1101
您好!
我正在进行一个使用低于1GHz 的项目、我需要将接收器与发送器同步、以减少功耗。 我使用了 CC1101、它允许在接收器检测到 SyncWord 时调用回调、这样我就可以执行同步、有没有类似的东西?
由于数据包的长度可变、在 RxDoneCallback 中执行同步不合适。
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.
在同步时、应使用引脚驱动程序设置回调。 以下代码显示了如何完成此操作。 我使用了 rfPacketRx 示例作为起点:
SYNC 信号路由到 IOID_7
/***** 包括***** //*
标准 C 库*/
#include
/* TI 驱动程序*/
#include
#include
#include
/* Driverlib 头文件*/
#include DeviceFamily_constructPath (driverlib/rf_prop_mailbox.h)
/*板头文件*/
#include "Board.h"
/*应用头文件*/
#include "RFQueue.h"
#include "smartrf_settings/smartrf_settings.h"
/***** 定义了***** /*
数据包 RX 配置*/
#define DATA_Entry_header_size 8 //通用数据条目的恒定标头大小*/
#define MAX_LENGTH 30 //最大长度字节无线电将接受*/
#define NUM_DATA_ENTRIES 2 /*注意:目前仅支持两个数据条目*/
#define NUM_SUBSTED_BYTES 2 /*数据条目数据字段将包含:
* 1标头字节(RF_cmdPropRx.rxConf.bIncludeHdr = 0x1)
*最多30个有效载荷字节
* 1个状态字节(RF_cmdPropRx.rxConf.bAppendStatus = 0x1)*/
/***** 原型***** /
静态空回调(rf_handle h、rf_CmdHandle ch、rf_EventMask e);
静态空 syncCallbackFxn (PIN_Handle handle、PIN_ID pinId);
/***** 变量声明***** /
static rf_Object rfObject;
static rf_handle rfHandle;
//引脚驱动程序句柄*/
static PIN_handle ledPinHandle;
static PIN_handle syncPinHandle;
static PIN_State ledPinState;
//包含用于接收数据的所有数据条目的缓冲区。
需要* pragma 以确保此缓冲区是4字节对齐的(射频内核要求)*/
#if defined (__TI_Compiler_version__)
#pragma DATA_ALIGN (rxDataEntryBuffer,4);
static uint8_t
rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries,
MAX_LENGTH、
num_apped_Bytes)];
#elif defined (__IAR_systems_icc_)
#pragma DATA_alignment = 4
static uint8_t
rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries、
MAX_LENGTH、
num_apped_Bytes)];
#elif defined (__Gnu_)
static uint8_t
rxDataEntryBuffer[RF_queue_data_entry_buffer_size (NUM_DATA_entries、
MAX_LENGTH、
num_apped_bytes)]
__attribute__((aligned(4)));
#else
#error 不支持此编译器。
#endif
//接收用于射频内核的数据队列以填入数据*/
静态 dataQueue_t dataQueue;
静态 RFC_dataEntryGeneral_t* currentDataEntry;
静态 uint8_t packetLength;
静态 uint8_t* packetDataPointer;
静态 uint8_t packet[MAX_LENGTH + CONFIDGE_LED_ENABLENGTH **在
应用表中单独存储*/BINARGE*
*-所有 LED 板 LED 均熄灭。
*/
PIN_Config pinTable[]=
{
BOARD_PIN_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
#IF 定义__CC1352R1_LAUNCHXL_Board_H__
Board_DIO30_RFSW | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、
#endif
PIN_TERMINATE
};
PIN_Config synctim[]={
ioID_7 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、
PIN_TERMINATE
};
/***** 函数定义***** /
void * mainThread (void * arg0)
{
rf_params rfParams;
rf_params_init (&rfParams);
/*打开 LED 引脚*/
ledPinHandle = PIN_OPEN (&ledPinState、pinTable);
if (ledPinHandle ==空)
{
while (1);
}
synctiminHandle = PIN_OPEN (&synctimState、synctimTable);
if (!syncPinHandle){
/*初始化 SYNC 引脚时出错*/
while (1);
}
PINCC26XX_setMux (syncPinHandle、IOID_7、PINCC26XX_MUX_RFC_GPO0);//设置 SYNC 引脚的回调*
if (PIN_registerIntCb (synctimPinHandle、&syncCallbackFxn)!= 0){
/*注册同步回调函数时出错*/
while (1);
}
if (RFQueue_defineQueue (&dataQueue、
rxDataEntryBuffer、
sizeof (rxDataEntryBuffer)、
num_data_entries、
max_length + NUM_apped_bytes))
{
/*未能为所有数据条目分配空间*/
while (1);
}
/*根据应用需求修改 CMD_PROP_RX 命令*/
/*为接收的数据设置数据实体队列*/
RF_cmdPropRx.pQueue =&dataQueue;
/*丢弃来自 Rx 队列的已忽略的数据包*/
rf_cmdProprx.rxConf.bAutoFlushIgnored = 1;
/*丢弃来自 Rx 队列的 CRC 错误数据包*/
rf_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
/*实施数据包长度过滤以避免 PROP_ERROR_RXBUF */
RF_cmdPropRx.maxPktLen = MAX_LENGTH;
/*请求对讲机的访问*/
rfHandle = rf_open (&rfObject、&rf_prop、
(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&rfParams);
/*设置频率*/
rf_postCmd (rfHandle、(rf_Op*)&rf_cmdf、rf_PriorityNormal、NULL、0);
while (1)
{
/*进入 RX 模式并一直保持在 RX 中*/
RF_EventMask terminationReason= RF_runCmd (rfHandle、(RF_OP*)&RF_cmdPropRx、
RF_PriorityNormal、回调(&R)、
RF_EventRxEntryDone);
switch (terminationReason)
{
案例 RF_EventCmdDone:
//链中的无线电操作命令已完成
中断;
案例 RF_EventLastCmdDone:
//独立无线电操作命令或最后一个无线电
//链中的操作命令已完成。
中断;
案例 RF_EventCmd 取消:
//命令在启动前被取消;这可能是导致的
//按 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_cmdPropRx)-> status;
switch (cmdStatus)
{
案例 PROP_DONE_OK:
//接收到的数据包,CRC 正常
中断;
PROP_DONE_RXERR 案例:
//接收到的数据包带有 CRC 错误
中断;
案例 PROP_DONE_RXTIMEOUT:
//同步搜索时观察到的结束触发
中断;
案例 PROP_DONE_break:
//在命令为时接收数据包时观察到结束触发
//配置的 endType 设置为1
中断;
案例 PROP_DONE_ENDended:
//观察完结束触发后收到的数据包;如果
//命令配置为 endType 设置为0,即结束触发器
//不会终止正在进行的接收
中断;
案例 PROP_DONE_STOPPED:
//命令启动后接收到 CMD_STOP,如果发现 SYNC,
//数据包被接收
中断;
案例 PROP_DONE_ABORT:
//命令启动后收到 CMD_ABORT
中断;
PROP_ERROR_RXBUF 案例:
//没有足够大的 RX 缓冲区来存放处可用的接收数据
//数据包开始
中断;
PROP_ERROR_RXFULL 案例:
//在接收部分读取期间超出 RX 缓冲区空间
中断;
案例 PROP_ERROR_PAR:
//观察到非法参数
中断;
PROP_ERROR_NO_SETUP 案例:
//在受支持的中未设置无线电的情况下发送命令
//模式使用 CMD_PROP_RADIO_SETUP 或 CMD_RADIO_SETUP
中断;
案例 PROP_ERROR_NO_FS:
//发送命令而不对合成器进行编程
中断;
案例 PROP_ERROR_RXOVF:
操作期间观察到// RX 溢出
中断;
默认值:
//未捕获的错误事件-这些可能来自
// rf_mailbox.h 中定义的状态池
while (1);
}
}
while (1);
}
void syncCallbackFxn (PIN_Handle handle、PIN_ID pinId){
//执行某些
操作}
void 回调(RF_Handle h、RF_CmdHandle ch、RF_EventMask e)
{
IF (e 和 RF_EventRxEntryDone)
{
/*切换引脚以指示 RX */
PIN_setOutputValue (ledPinHandle、Board_PIN_LED2、
!PIN_getOutputValue (Board_PIN_LED2);
/*获取当前未处理的数据输入*/
currentDataEntry = RFQueue_getDataEntry();
/*处理位于¤tDataEntry->data 的数据包数据:
*-长度是当前配置的第一个字节
*-数据从第二个字节开始*/
电池组长度 =*(uint8_t*)(¤tDataEntry->data);
packetDataPointer =(uint8_t*)(¤tDataEntry->data+1);
/*将有效载荷+状态字节复制到数据包变量*/
memcpy (packet、packetDataPointer、(packetLength + 1));
RFQueue_nextEntry();
}
}
在 smartrf_settings.c 中:
//覆盖 CMD_PROP_RADIO_DIV_SETUP 静态 uint32_t pOverrides[]= { 。 。 。 (uint32_t) 0x008F88B3、 HW_REG_OVERRIDE (0x1110、RFC_DBELL_SYSGPOCTL_GPOCTL0_RATGPO1)、 (uint32_t) 0xFFFFFFFF、 };
Siri