TI论坛
直播中

王艳

7年用户 1270经验值
私信 关注

CC1310的ADV下通讯异常,报CRC错误代码解读

本帖最后由 alexdos 于 2018-5-18 18:03 编辑

在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;
]

回帖(3)

王艳

2018-5-15 04:10:29
另外 ptRxAdvCmd->lenOffset = 0;         /* 未知用途 */这个一参数的用途是什么,参数该如何设置
举报

王艳

2018-5-15 04:22:41
引用: blueshine 发表于 2018-5-15 04:10
另外 ptRxAdvCmd->lenOffset = 0;         /* 未知用途 */这个一参数的用途是什么,参数该如何设置

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

杨海清

2018-5-15 04:36:38
引用: blueshine 发表于 2018-5-15 04:22
自己解决问题了,发送数据时没有重新写pktLen,写上就正确了

您好,
    我现在也是碰到了这样的事情,在1Mbps传输下用TxAdv发送,接收时,把CRC屏蔽掉可以接收到数据,开启CRC就无法接收。请问您是怎么样在发送数据时重新写pktLen的?问了TI工程师,一直不给回复,希望能得到您的指教。
谢谢。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分