微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > CC1310 ADV+WOR收发,接收报CRC错误,关闭CRC收到数据是正确的

CC1310 ADV+WOR收发,接收报CRC错误,关闭CRC收到数据是正确的

时间:12-23 整理:3721RD 点击:

在ADV下通讯异常,报CRC错误,参数配置如下

void vSetRadioTxAdvancedWorCmd(rfc_CMD_PROP_TX_ADV_t *ptTxAdvCmd, float fWakeUpFreq)
{
/* Set command to CMD_PROP_TX_ADV */
ptTxAdvCmd->commandNo = CMD_PROP_TX_ADV; /* 命令 */
ptTxAdvCmd->status = 0; /* 状态,由RF CORE来填充 */

/* 命令触发条件 */
ptTxAdvCmd->startConf.bExtTxTrig = 0; /*触发器方式,0采用时间触发,1采用外部RAT触发 */
ptTxAdvCmd->startConf.inputMode = 0; /* RAT触发边沿 */
ptTxAdvCmd->startConf.source = 0; /* RAT触发数 */

ptTxAdvCmd->startTrigger.triggerType = TRIG_NOW; /* 触发类型->立即触发 */
ptTxAdvCmd->startTrigger.bEnaCmd = 0; /* 0禁用替代触发命令 */
ptTxAdvCmd->startTrigger.triggerNo = 0; /* 替代命令触发数 */
ptTxAdvCmd->startTrigger.pastTrig = 1; /*A trigger in the past is never triggered, or for start of commands, give an error*/
ptTxAdvCmd->startTime = 0; /* 触发时间 */

/* 运行下一条命令的条件 */
ptTxAdvCmd->pNextOp = NULL; /* 当前命令完成,指向下一个命令的指针 */
ptTxAdvCmd->condition.rule = COND_NEVER; /* 运行下一条命令的条件 ->不运行*/
ptTxAdvCmd->condition.nSkip = 0; /*Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...*/

/* 数据包格式设置 */
ptTxAdvCmd->pktConf.bFsOff = 0; /* 在当前命令后频率合成器状态,0打开,1关闭 */
ptTxAdvCmd->pktConf.bUseCrc = 1; /* 1,使用CRC */
ptTxAdvCmd->pktConf.bCrcIncSw = 0; /* 1,CRC包含同步字计算 */
ptTxAdvCmd->pktConf.bCrcIncHdr = 0; /* 1,CRC包含头HEAD */
ptTxAdvCmd->numHdrBits = 16; /* Head占用bit数 */

/* 从前导字到同步字转换的触发器 */
ptTxAdvCmd->preTrigger.triggerType = TRIG_REL_START; /* 相对于命令触发启动 */
ptTxAdvCmd->preTrigger.bEnaCmd = 0; /* 0不使用替代触发器 */
ptTxAdvCmd->preTrigger.triggerNo = 0; /* 触发数 */
ptTxAdvCmd->preTrigger.pastTrig = 1;
ptTxAdvCmd->preTime = WOR_PREAMBLE_TIME_RAT_TICKS(fWakeUpFreq); /* 从前导转换到同步的触发时间 */

ptTxAdvCmd->pktLen = RX_MAX_LENGTH; /* 0,无限包长,长度由头部确定 */
ptTxAdvCmd->syncWord = 0xeffffffe;
ptTxAdvCmd->pPkt = NULL;
}

void vSetRadioRxAdvancedSniffCmd(rfc_CMD_PROP_RX_ADV_SNIFF_t *ptRxAdvSniffCmd,
rfc_CMD_PROP_RADIO_div_SETUP_t *ptDivSetup, float fWakeUpfreq,
dataQueue_t *ptQueue, rfc_propRxOutput_t *tStatistics)
{
/* Calculate datarate from prescaler and rate word */
uint32_t datarate = uiCalculateSymbolRate(ptDivSetup);

/* Calculate basic timing parameters */
uint32_t symbolLengthUs = 1000000UL/datarate;//发一个bit需要的时间,uS
uint32_t preambleSymbols = (1000000.00/fWakeUpfreq)/symbolLengthUs; //前导的长度bit
uint8_t syncWordSymbols = ptDivSetup->formatConf.nSwBits; //同步字bit

uint32_t correlationPeriodUs = (syncWordSymbols + CORR_PERIOD_SYM_MARGIN)*symbolLengthUs;
uint32_t csEndTimeUs = (CS_END_TIME_MIN_TIME_SYM*symbolLengthUs + CS_END_TIME_MIN_TIME_STATIC_US);
uint32_t rxEndTimeUs = symbolLengthUs * (preambleSymbols + syncWordSymbols + RX_END_TIME_SYM_MARGIN);

memset(ptRxAdvSniffCmd, 0x00, sizeof(rfc_CMD_PROP_RX_ADV_SNIFF_t));

ptRxAdvSniffCmd->commandNo = CMD_PROP_RX_ADV_SNIFF; /* 设置命令 */

/* 设置触发器 */
ptRxAdvSniffCmd->startTrigger.triggerType = TRIG_ABSTIME; /* 设置命令启动为绝对运行时间 */
ptRxAdvSniffCmd->startTrigger.bEnaCmd = 0;
ptRxAdvSniffCmd->startTrigger.triggerNo = 0;
ptRxAdvSniffCmd->startTrigger.pastTrig = 1;
ptRxAdvSniffCmd->startTime = 0; /* 发送之前设置 */

/* 运行下一个命令的条件 */
ptRxAdvSniffCmd->pNextOp = NULL; /* 没有下一条命令 */
ptRxAdvSniffCmd->condition.rule = COND_NEVER; /* 运行下一条命令的条件 ->不运行*/
ptRxAdvSniffCmd->condition.nSkip = 0;

/* 包设置 */
ptRxAdvSniffCmd->pktConf.bFsOff = 1; /* 在命令结束后频率合成器状态,1关闭,0打开 */
ptRxAdvSniffCmd->pktConf.bRepeatOk = 0; /* 收到正确数据后的操作,0结束,1重新接收 */
ptRxAdvSniffCmd->pktConf.bRepeatNok = 0; /* 收到错误数据后的操作,0结束,1重新接收 */
ptRxAdvSniffCmd->pktConf.bUseCrc = 1; /* 1使能CRC */
ptRxAdvSniffCmd->pktConf.bCrcIncSw = 0; /* 1CRC包含前导 */
ptRxAdvSniffCmd->pktConf.bCrcIncHdr = 0; /* 1CRC包含头HEAD */
ptRxAdvSniffCmd->pktConf.endType = 0; /* 0收到同步字后,收到结束认为收到数据包 */
ptRxAdvSniffCmd->pktConf.filterOp = 0; /* 地址过滤器,但地址不匹配时,0停止接收,1接收但标识地址错误 */

/* 接收配置 */
ptRxAdvSniffCmd->rxConf.bAutoFlushIgnored = 1; /* 自动丢弃未处理的数据包 */
ptRxAdvSniffCmd->rxConf.bAutoFlushCrcErr = 1; /* 自动清除CRC错误的数据包 */
ptRxAdvSniffCmd->rxConf.bIncludeHdr = 1; /* 1储存的数据中包含头或者长度 */
ptRxAdvSniffCmd->rxConf.bIncludeCrc = 1; /* 1储存的数据包中包含CRC */
ptRxAdvSniffCmd->rxConf.bAppendRssi = 1; /* 1接收队列中追加RSSI */
ptRxAdvSniffCmd->rxConf.bAppendTimestamp = 0; /* 1接收队列中追加时间戳 */
ptRxAdvSniffCmd->rxConf.bAppendStatus = 0; /* 1接收队列中追加状态字 */

/* 包长和HEAD设置 */
ptRxAdvSniffCmd->hdrConf.numHdrBits = 16; /*Number of bits in header (0--32)*/
ptRxAdvSniffCmd->hdrConf.lenPos = 0; /*Position of length field in header (0--31)*/
ptRxAdvSniffCmd->hdrConf.numLenBits = 16; /*Number of bits in length field (0--16)*/
ptRxAdvSniffCmd->lenOffset = -4; /* 未知用途 */

/* 地址设置 */
ptRxAdvSniffCmd->addrConf.addrType = 0; /* 0地址在头后,1地址包含在中头 */
ptRxAdvSniffCmd->addrConf.addrSize = 0; /* 当addrType=0时,地址单位为Byte,否则为bit*/
ptRxAdvSniffCmd->addrConf.addrPos = 0; /* 当addrType=0时,地址作为同步的扩展字节,否则地址在头部中的大小单位为bit*/
ptRxAdvSniffCmd->addrConf.numAddr = 0; /* 地址例表中,地址的数量 */
ptRxAdvSniffCmd->pAddr = NULL; /* 地地列表 */

/* 唤醒设置 */
ptRxAdvSniffCmd->csConf.bEnaRssi = 1; /* 1使能RSSI检测 */
ptRxAdvSniffCmd->csConf.bEnaCorr = 1; /* 1使能PQT检测 */
ptRxAdvSniffCmd->csConf.operation = 1; /* 1检查到RSSI或者PQT其中一个就认为有数据存在 */
ptRxAdvSniffCmd->csConf.busyOp = 0; /* 0信道忙时继续监听,1信道忙时停止监听*/
ptRxAdvSniffCmd->csConf.idleOp = 1; /* 1没有监听到载波结束 */
ptRxAdvSniffCmd->csConf.timeoutRes = 1; /* 信道空闲返回PROP_DONE_IDLE_TIMEOUT */

/* RSSI configuration */
ptRxAdvSniffCmd->numRssiIdle = 1; /* One idle RSSI samples signals that the channel is idle */
ptRxAdvSniffCmd->numRssiBusy = 1; /* One busy RSSI samples signals that the channel is busy */
ptRxAdvSniffCmd->rssiThr = (int8_t)RSSI_THRESHOLD_DBM; /* Set the RSSI threshold in dBm */

/* PQT configuration */
ptRxAdvSniffCmd->corrConfig.numCorrBusy = 1; /* One busy PQT samples signals that the channel is busy */
ptRxAdvSniffCmd->corrConfig.numCorrInv = 1; /* One busy PQT samples signals that the channel is busy */
ptRxAdvSniffCmd->corrPeriod = (uint16_t)(correlationPeriodUs * US_TO_RAT_TICKS);/* PQT检测时间 */

ptRxAdvSniffCmd->csEndTrigger.triggerType = TRIG_REL_START; /* 同时相对于命令触发启动 */
ptRxAdvSniffCmd->csEndTrigger.bEnaCmd = 0;
ptRxAdvSniffCmd->csEndTrigger.triggerNo = 0;
ptRxAdvSniffCmd->csEndTrigger.pastTrig = 1;
ptRxAdvSniffCmd->csEndTime = (uint32_t)(csEndTimeUs * US_TO_RAT_TICKS);

/* 结束 */
ptRxAdvSniffCmd->endTrigger.triggerType = TRIG_REL_START;
ptRxAdvSniffCmd->endTime = (uint32_t)(rxEndTimeUs * US_TO_RAT_TICKS); /* 设置结束时间 */

/* Configure RX part of RX_SNIFF command */
ptRxAdvSniffCmd->syncWord0 = 0xeffffffe; /* 主同步字 */
ptRxAdvSniffCmd->syncWord1 = 0x00000000; /* 备用同步字,非0 */
ptRxAdvSniffCmd->pQueue = ptQueue;
ptRxAdvSniffCmd->pOutput = (uint8_t*)tStatistics;
ptRxAdvSniffCmd->maxPktLen = RX_MAX_LENGTH;
}

另外 ptRxAdvCmd->lenOffset = 0;         /* 未知用途 */这个一参数的用途是什么,参数该如何设置

自己解决问题了,发送数据时没有重新写pktLen,写上就正确了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top