TI CC13x2/CC26x2载波侦听(CSMA)原理与实战:从RSSI/相关器到低功耗设计

📅 2026/7/26 23:36:51 👁️ 阅读次数 📝 编程学习
TI CC13x2/CC26x2载波侦听(CSMA)原理与实战:从RSSI/相关器到低功耗设计

1. 无线通信中的信道访问与载波侦听

在无线通信的世界里,信道就像一条共享的马路,所有设备都想在上面传输数据。如果大家都不看红绿灯,一拥而上,结果就是撞车——数据包冲突,谁也传不成。载波侦听多路访问(CSMA)就是这套交通规则里的“看和听”。它的核心思想很简单:发言前先听听频道里有没有别人在说话。对于像TI CC13x2/CC26x2这类资源受限的低功耗无线MCU来说,高效、低功耗地实现这套“听”的机制,是构建稳定无线网络(如Zigbee、Thread或私有协议)的基石。这不仅仅是软件轮询那么简单,而是通过芯片内部的射频命令引擎和专用硬件,实现纳秒级响应的精准信道状态感知。

你可能觉得,不就是检测一下有没有信号吗?但实际做起来,这里面门道很深。比如,怎么区分微弱的背景噪声和真正的有效信号?如何在确保不遗漏任何数据包的前提下,让设备的收音机(接收机)尽可能长时间地休眠以省电?这些问题的答案,就藏在芯片手册里那些关于CMD_PROP_CSCMD_PROP_RX_SNIFF命令以及csConfcorrConfig等寄存器的细节中。理解这些底层机制,能让你从“调用API”的开发者,变成“驾驭硬件”的专家,在设计竞争激烈的无线网络或超低功耗应用时,拥有排错和优化的主动权。

2. 载波侦听的核心原理与状态机拆解

载波侦听的目的,是判断无线信道当前是否被占用。在CC13x2/CC26x2的射频核心(RF Core)里,这不是一个简单的“有”或“无”的二元判断,而是一个基于RSSI相关器两个信息源的三态状态机。

2.1 信道三种状态的定义

首先,我们必须明确硬件视角下的三种信道状态:

  • BUSY(繁忙):信道上有信号存在。这个信号可能是我们想接收的有效数据包,也可能是其他网络的干扰,甚至是噪声。硬件只负责检测能量或特征,不区分其内容。
  • IDLE(空闲):信道上没有检测到有效的信号。注意,这不代表绝对安静,可能仍有底噪,但能量低于设定的阈值。
  • INVALID(无效):无法确定信道状态。这通常发生在侦听刚开始、信号能量在阈值附近波动,或相关器尚未建立起稳定判断的过渡期。

这个三态模型比简单的二元判断更符合实际射频环境,它为防抖和可靠判断提供了缓冲。

2.2 双信息源:RSSI与相关器

硬件提供了两种并行的侦听手段,你可以选择其一或组合使用,类似于用耳朵听音量(RSSI)和用大脑识别特定旋律(相关器)。

RSSI侦听:这是最直接的方式。射频前端会持续测量接收信号的强度,并将其转换为一个数字值(通常是带符号的dBm值)。你需要预先设置一个阈值rssiThr。硬件会持续采样RSSI,并应用防抖逻辑:

  • 当连续numRssiBusy次采样值高于rssiThr,状态才变为BUSY
  • 当连续numRssiIdle次采样值低于rssiThr,状态才变为IDLE
  • 不满足以上连续条件时,状态保持为INVALID

这里的numRssiBusynumRssiIdle是关键参数。设置太小,容易受噪声尖峰干扰,产生误判;设置太大,则反应迟钝,可能错过短暂的数据包。在典型的Sub-1GHz环境中,我通常会从numRssiBusy=2numRssiIdle=4开始调试,根据实际环境噪声调整。

相关器侦听:这种方式更“智能”。射频硬件内部有一个相关器,可以将其配置为匹配你数据包的前导码(Preamble)模式。当它在输入信号中检测到与预设前导码高度匹配的波形时,就会产生一个“相关峰”。其状态机逻辑如下:

  • 启动后初始状态为INVALID
  • 如果在corrPeriod(以RAT时钟滴答计数)时间内没有检测到任何相关峰,状态变为IDLE
  • 如果状态已是IDLE,随后在corrPeriod时间间隔内,连续检测到至少corrConfig.numCorrInv个相关峰,状态跳回INVALID
  • 如果状态是INVALID,随后在corrPeriod时间间隔内,连续检测到至少corrConfig.numCorrBusy个相关峰,状态变为BUSY
  • 如果状态不是IDLE,并且在corrTime时长内没有新的相关峰,状态也会回到IDLE

相关器侦听特别适合在已知前导码格式的专有协议中,它能极大提高抗干扰能力。比如,即使有一个很强的非协议信号导致RSSI很高,只要它没有正确的前导码,相关器就不会认为信道是BUSY。

2.3 状态合成逻辑

当你同时使能了RSSI和相关器侦听(csConf.bEnaRssi = 1csConf.bEnaCorr = 1)时,就需要一个规则来综合两个信息源的结果。这由csConf.operation位控制,其真值表是理解硬件行为的关键:

csConf.operationRSSI状态相关器状态最终信道状态
0INVALID任何INVALID
0IDLEINVALIDINVALID
0IDLEBUSYBUSY
0BUSY任何BUSY
1INVALIDINVALIDINVALID
1INVALIDIDLEIDLE
1INVALIDBUSYINVALID
1IDLEINVALIDIDLE
1IDLEIDLEIDLE
1IDLEBUSYIDLE
1BUSYINVALIDINVALID
1BUSYIDLEIDLE
1BUSYBUSYBUSY

如何选择operation模式?

  • operation = 0(逻辑与的变体):只要任一源报告BUSY,信道就是BUSY;只有当两者都报告IDLE,信道才是IDLE。这是一种保守策略,确保只要检测到任何可能的信号(无论是RSSI能量还是相关峰),就认为信道忙,最大程度避免冲突。适用于对可靠性要求极高、可以容忍一定概率误判空闲的场景。
  • operation = 1(逻辑或的变体):只要任一源报告IDLE,信道就是IDLE;只有当两者都报告BUSY,信道才是BUSY。这是一种激进策略,倾向于认为信道空闲,可以提高信道利用率,但冲突风险增加。适用于轻负载网络或对实时性要求高、可以接受少量重传的场景。

实操心得:在复杂的射频环境中(如2.4GHz频段),我通常首选仅使用RSSI侦听,因为它配置简单,对未知干扰也有反应。相关器侦听虽然精准,但需要精确匹配前导码,在存在频偏或调制失真的情况下可能失效。双源模式一般用于非常特定的场景,比如在强背景噪声中检测特定信号,这时可以设置operation=0,让RSSI先做粗筛,相关器做最终确认。

3. 核心命令详解:从独立侦听到嗅探接收

理解了原理,我们来看TI CC13x2/CC26x2 RF Core提供的三个核心命令如何将状态机付诸实践。这些命令通过“门铃”寄存器CMDR下发,由射频命令引擎(CPE)执行。

3.1 CMD_PROP_CS:独立的载波侦听命令

CMD_PROP_CS是一个纯粹的侦听命令。它的执行流程是标准化的:

  1. 启动条件:射频必须已通过CMD_PROP_RADIO_SETUPCMD_RADIO_SETUP命令配置为兼容的模式(如专有模式),并且频率合成器已通过CMD_FS编程。
  2. 执行过程:命令启动后,射频进入接收模式,并立即开始上述的载波侦听状态机操作。
  3. 结束条件与状态:命令的结束由以下事件触发,并返回相应的状态码,这些状态码直接决定了命令链中下一个操作(见第4部分):
    • 信道变忙(csConf.busyOp=1):如果csConf.busyOp设为1,当信道状态变为BUSY时,命令立即结束,返回PROP_DONE_BUSY
    • 信道变闲(csConf.idleOp=1):如果csConf.idleOp设为1,当信道状态变为IDLE时,命令立即结束,返回PROP_DONE_IDLE
    • 超时触发:这是由csEndTriggercsEndTime定义的硬件定时器触发。超时发生时,根据当时的信道状态决定返回值:
      • 状态为BUSY ->PROP_DONE_BUSY
      • 状态为IDLE ->PROP_DONE_IDLE
      • 状态为INVALID -> 取决于csConf.timeoutRes:0返回PROP_DONE_BUSYTIMEOUT,1返回PROP_DONE_IDLETIMEOUT
    • 强制停止:收到CMD_STOPCMD_ABORT命令,分别返回PROP_DONE_STOPPEDPROP_DONE_ABORT
    • 错误:参数错误、射频未设置等会返回PROP_ERROR_*

关键配置csFsConf:这个结构体控制命令结束时频率合成器的行为,对功耗至关重要。

  • bFsOffBusy:命令以BUSY状态结束时,是否关闭频率合成器。
  • bFsOffIdle:命令以IDLE状态结束时,是否关闭频率合成器。

注意事项:在典型的CSMA/CA流程中,我们通常先执行CMD_PROP_CS侦听信道。如果返回PROP_DONE_IDLE(信道空闲),则紧接着执行CMD_PROP_TX发送数据。此时,不应在CMD_PROP_CS结束时关闭合成器(即bFsOffIdle=0),因为紧接着的发送命令还需要它。否则,重新开启合成器并稳定需要额外的时间(可能几百微秒),不仅增加延迟,还可能在此期间信道状态已改变,失去了CSMA的意义。

3.2 CMD_PROP_RX_SNIFF 与 CMD_PROP_RX_ADV_SNIFF:集成嗅探的接收命令

这两个命令是CMD_PROP_RXCMD_PROP_RX_ADV的“嗅探增强版”。它们的行为几乎与标准接收命令相同,但在同步搜索(Sync Search)阶段,会并行执行载波侦听操作。这是实现超低功耗监听的关键。

工作流程

  1. 命令启动,射频开始同步搜索(寻找数据包前导码和同步字)。
  2. 同时,载波侦听状态机启动并运行。
  3. 关键逻辑
    • 如果信道状态变为IDLE,且csConf.idleOp=1,则整个接收命令立即结束,返回PROP_DONE_IDLE。这意味着设备在“听”的阶段发现信道空闲,就直接放弃本次接收窗口,可以迅速进入休眠。这是实现“周期性唤醒监听”超低功耗模式的核心。
    • 如果信道状态变为BUSY,且csConf.busyOp=1,则载波侦听操作停止,但接收操作继续。此后即使信道再变空闲,也不会影响本次接收。这保证了一旦开始尝试接收一个数据包,就会尽力完成。
    • 超时触发:如果csEndTrigger超时发生:
      • 信道状态为IDLE -> 接收命令结束,返回PROP_DONE_IDLE
      • 信道状态为BUSY -> 接收继续,但如果csConf.busyOp=1,载波侦听停止。
      • 信道状态为INVALID -> 由csConf.timeoutRes决定:0则接收继续且载波侦听停止(如果busyOp=1);1则接收结束,返回PROP_DONE_IDLETIMEOUT
  4. 如果成功找到同步字,则进入正常的包接收流程。接收完成后(无论成功或失败),当重新开始同步搜索时,如果之前载波侦听还在运行,它会恢复运行

与独立CS命令的差异:最大的区别在于对busyOp的处理。在CMD_PROP_CS中,busyOp=1会导致命令结束。而在嗅探模式中,busyOp=1仅停止载波侦听,不停止接收。这很合理,因为侦听的目的就是发现信号并接收它。

3.3 命令链与状态流转

这些命令很少孤立运行,通常以“命令链”的形式组织。一个命令结束后返回的状态,直接决定了链中下一个要执行的是什么命令。这是RF Core高效编程的精髓。

例如,一个典型的带冲突避免的发送流程伪代码逻辑如下:

// 1. 设置射频模式和频率 rfc_CMD_PROP_RADIO_SETUP_t radioSetup = {...}; rfc_CMD_FS_t fsCmd = {...}; // 2. 发送载波侦听命令 rfc_CMD_PROP_CS_t csCmd = {...}; csCmd.commandNo = CMD_PROP_CS; csCmd.condition.rule = COND_NEVER; // 无条件执行链中的第一个命令 // 3. 定义发送命令 rfc_CMD_PROP_TX_t txCmd = {...}; txCmd.commandNo = CMD_PROP_TX; txCmd.condition.rule = COND_STOP_ON_TRUE; txCmd.condition.nSkip = 0; // 关键:根据CS命令的结果决定是否跳转到TX txCmd.pNextOp = (rfc_radioOp_t*)&txCmd; // 默认指向自己(即不发送) // 我们需要修改条件判断,这通常在启动命令链前,通过设置条件表来实现 // 假设我们定义:如果CS返回IDLE,则执行TX;否则停止。 rfc_CMD_PROP_CS_csEnd_t csEndCond; csEndCond.status = PROP_DONE_IDLE; csEndCond.pNextOp = (rfc_radioOp_t*)&txCmd; // CS空闲则跳转到TX // 将CS命令的“下一个操作”表指向这个条件结构 csCmd.pNextOp = (rfc_radioOp_t*)&csEndCond; // 4. 启动命令链 RF_postCmd(rfHandle, (rfc_radioOp_t*)&radioSetup, ...); RF_postCmd(rfHandle, (rfc_radioOp_t*)&fsCmd, ...); RF_postCmd(rfHandle, (rfc_radioOp_t*)&csCmd, ...);

实际上,SDK(如TI-RTOS或SimpleLink SDK)提供了更高级的API(如RF_runCmdRF_getCmd等)来简化命令链的构建和状态处理。但理解底层pNextOp和条件判断的机制,对于调试复杂流程和阅读SDK源码至关重要。

4. 关键寄存器配置与参数详解

要让载波侦听按预期工作,必须正确配置一系列参数。这些参数通常通过一个rfc_CMD_PROP_CS_trfc_CMD_PROP_RX_SNIFF_t命令结构体中的嵌套结构来设置。

4.1 载波侦听配置结构体 (csConf)

这是最核心的配置结构,决定了侦听的行为模式。

  • bEnaRssi/bEnaCorr:使能RSSI和/或相关器侦听。两者不能同时为0。
  • rssiThr:RSSI阈值。这是一个有符号整数,单位通常是dBm。设置它是门艺术。设得太高(如-30 dBm),可能忽略掉远处的合法信号;设得太低(如-90 dBm),则容易把背景噪声当成BUSY。你需要用频谱仪或设备的RSSI读取功能,在实际部署环境中测量背景噪声水平。一个常用的起点是噪声基底 + 3~10 dB。例如,测得噪声约为-95 dBm,阈值可以设为-85 dBm。
  • numRssiIdle/numRssiBusy:RSSI状态防抖计数。如前所述,用于避免瞬时干扰导致的误判。在稳定的环境中可以设小(如2),在嘈杂环境中要设大(如4或6)。
  • corrConfig:相关器配置结构。包含numCorrInv,numCorrBusy,corrPeriod,corrTime等。numCorrIdle必须大于0。corrPeriod定义了判断相关峰连续性的时间窗口,需要根据前导码长度和波特率计算。例如,前导码是8个字节的0xAA,波特率100 kbps,则一个前导码持续时间为8 * 8 / 100000 = 640 uscorrPeriod应略小于此值,以确保能捕捉到连续的前导码比特。
  • operation:双源合成逻辑,见2.3节详解。
  • busyOp/idleOp:BUSY/IDLE事件操作。为1时,对应事件会触发命令结束(对于CS命令)或停止载波侦听(对于SNIFF命令)。
  • timeoutRes:超时且状态为INVALID时的默认结果(0->BUSY, 1->IDLE)。

4.2 定时器与超时控制 (csEndTrigger,csEndTime)

载波侦听不能无限期进行。超时机制由RAT(Radio Timer)控制。

  • csEndTrigger:选择触发类型。常见的有:
    • TRIG_NEVER: 永不超时(慎用)。
    • TRIG_ABSTIME: 在绝对的RAT时间点触发。
    • TRIG_REL_START: 相对于命令启动时间的延时触发。
    • TRIG_NOW: 立即触发(用于测试)。
  • csEndTime:触发时间值,单位是RAT滴答。RAT时钟频率通常是4MHz(一个滴答0.25us)或更高。计算超时时间:例如,你需要最大侦听5ms,RAT时钟为4MHz,则csEndTime = 5000 us / 0.25 us = 20000

避坑指南csEndTime是一个32位整数。在高速时钟下(如4MHz),5ms对应20000个滴答,远未溢出。但如果设置很长的超时(如几秒),务必注意计算是否溢出。同时,确保RAT定时器已经正确初始化和启动。

4.3 相关寄存器详解:RFC_DBELL 与 RFC_RAT

虽然大部分配置通过命令结构体完成,但了解底层寄存器有助于深度调试。

RFC_DBELL (门铃寄存器组)

  • CMDR (0x0):这是发送命令的入口。应用处理器将构建好的命令结构体地址写入此寄存器,即触发RF Core执行。
  • CMDSTA (0x4):读取此寄存器可获得最后一个命令的执行状态(如DONE,ContextError等)。在发送即时命令(如CMD_PROP_SET_LEN)后,应检查此寄存器确认命令被接受。
  • RFCPEIFG / RFCPEIEN / RFCPEISL (0x10, 0x14, 0x18):这是RF Core命令与包引擎的中断标志、使能和向量选择寄存器。例如,当CMD_PROP_CS命令完成时,如果COMMAND_DONE中断被使能(RFCPEIEN.0=1),则RFCPEIFG.0位会被置1,并根据RFCPEISL.0的设置,向CPU的INT_RF_CPE0INT_RF_CPE1向量产生中断。合理分配中断向量(将高优先级事件分配到响应更快的CPU中断)可以优化系统实时性。

RFC_RAT (无线电定时器寄存器组)

  • RATCNT (0x4):RAT计数器的当前值。可用于高精度时间戳。
  • RATCHxVAL (0x80 - 0x9C):RAT通道x的比较/捕获寄存器。在载波侦听中,csEndTrigger通常会配置为使用某个RAT通道作为比较器,当RATCNT达到RATCHxVAL中设置的值时,触发超时事件。配置流程通常是:先设置通道为比较模式,然后向RATCHxVAL写入目标时间值,该写入操作会自动“武装”该通道,使其开始参与比较。

5. 实战应用场景与配置案例

理论最终要服务于实践。下面我结合几个典型场景,分享具体的配置思路和代码片段(基于TI Driver API风格)。

5.1 场景一:标准的CSMA/CA发送前侦听

这是最常见的应用。设备在发送前先侦听信道,空闲则立即发送,繁忙则执行退避算法。

配置要点

  1. 使用命令CMD_PROP_CS
  2. 关键参数
    • csConf.bEnaRssi = 1;csConf.bEnaCorr = 0;// 通常只用RSSI
    • csConf.rssiThr = -85;// 根据环境调整
    • csConf.numRssiIdle = 4;csConf.numRssiBusy = 2;// 保守的空闲判断
    • csConf.idleOp = 1;// 一旦空闲,立即结束CS命令,准备发送
    • csConf.busyOp = 0;// 检测到忙,我们不希望CS命令立即结束,而是等待超时或持续侦听直到变闲?这里需要根据退避策略选择。如果采用固定时长侦听,则设busyOp=0,依赖超时;如果想一检测到忙就立即结束并开始退避,则设busyOp=1
    • csEndTrigger = TRIG_REL_START;
    • csEndTime = 12800;// 假设RAT=4MHz,对应3.2ms侦听窗口
    • csFsConf.bFsOffIdle = 0;// 空闲后要发送,保持合成器开启
    • csFsConf.bFsOffBusy = 1;// 繁忙则可能进入长退避,关闭合成器省电

伪代码流程

RF_Stat_t status; rfc_CMD_PROP_CS_t csCmd = {0}; // ... 填充csCmd参数 ... RF_CmdHandle csHandle = RF_postCmd(rfHandle, (RF_Op*)&csCmd, ...); // 等待命令完成(轮询或中断) status = RF_getCmdStatus(csHandle); if (status == PROP_DONE_IDLE) { // 信道空闲,立即启动发送命令链 startTx(); } else if (status == PROP_DONE_BUSY || status == PROP_DONE_BUSYTIMEOUT) { // 信道繁忙,执行退避(如随机延时) performBackoff(); // 退避后重新尝试CSMA retryCSMA(); } else { // 处理错误或超时无效状态 handleError(status); }

5.2 场景二:低功耗星型网络终端节点的嗅探监听

电池供电的传感器节点大部分时间休眠,周期性唤醒极短时间“嗅探”信道,看是否有来自协调器的唤醒信号或数据。

配置要点

  1. 使用命令CMD_PROP_RX_SNIFF
  2. 关键参数
    • rxConf.bAutoFlushIgnored = 1;// 自动忽略不匹配的包,节省处理时间
    • rxConf.bAutoFlushCrcErr = 1;// 自动丢弃CRC错误的包
    • csConf.bEnaRssi = 1;
    • csConf.rssiThr = -90;// 嗅探阈值可以设得更敏感,因为目的是检测任何可能的唤醒
    • csConf.numRssiIdle = 2;// 快速判断空闲,以便尽快回到睡眠
    • csConf.idleOp = 1;//核心:一旦嗅探到空闲,立即结束整个接收命令!
    • csConf.busyOp = 1;// 嗅探到忙,停止载波侦听,但继续尝试接收(可能是发给我的数据)
    • csEndTrigger = TRIG_REL_START;
    • csEndTime = 4000;// 非常短的嗅探窗口,例如1ms (4MHz RAT)

工作模式

  1. 节点休眠(例如1秒)。
  2. 唤醒,快速配置射频并启动CMD_PROP_RX_SNIFF,嗅探窗口仅1ms。
  3. 两种情况:
    • 信道空闲:命令在几百微秒内因idleOp=1而结束,返回PROP_DONE_IDLE。节点立即关闭射频,重新进入深度睡眠。功耗极低。
    • 信道繁忙:载波侦听停止,节点继续接收。如果收到有效数据则处理;如果接收超时或错误,也进入睡眠。
  4. 如此循环。平均电流可以做到10微安以下

5.3 场景三:基于相关器的精准信号检测

在存在大量同频段干扰(如Wi-Fi)的环境中,仅靠RSSI容易误判。此时可以利用已知前导码,使用相关器侦听。

配置要点

  1. 使用命令CMD_PROP_CSCMD_PROP_RX_SNIFF
  2. 关键参数
    • csConf.bEnaCorr = 1;csConf.bEnaRssi = 0;// 仅使用相关器
    • corrConfig.preambleConf.pattern = 0xAA...;// 配置为你的前导码模式
    • corrConfig.numCorrBusy = 2;// 检测到2个连续相关峰才判为BUSY,提高抗噪性
    • corrConfig.corrPeriod = ...;// 根据前导码比特时长计算
    • corrConfig.corrTime = ...;// 相关峰超时时间,通常略大于corrPeriod

优势与局限

  • 优势:极强的抗干扰能力。只有包含特定前导码的信号才能触发BUSY状态。
  • 局限
    1. 必须精确知道对方的前导码。
    2. 对频率偏移和时钟容差敏感。如果发射端和接收端的晶振偏差较大,可能导致相关峰检测不到或很弱。
    3. 增加了配置复杂度和功耗(相关器电路工作)。

调试技巧:在开发阶段,可以同时使能RSSI和相关器,并配置operation=0。然后通过读取硬件状态或GPIO翻转,分别观察RSSI状态和相关器状态的变化。你会发现,在Wi-Fi突发流量时,RSSI可能频繁报告BUSY,而相关器状态稳定为IDLE,这直观地证明了相关器滤波的效果。

6. 常见问题排查与调试心得

即使理解了所有原理和配置,实际调试中依然会遇到各种问题。下面是我踩过的一些坑和解决方法。

6.1 问题:载波侦听永远返回IDLE(或BUSY)

  • 检查射频配置:确保CMD_PROP_RADIO_SETUPCMD_FS已正确执行且完成。一个常见的错误是CS命令在FS命令完成前就启动了。确保命令链顺序正确,并使用RF_EventMask等待前序命令完成
  • 检查RSSI阈值:用频谱分析仪或设备的连续接收模式测量实际环境RSSI。你可能把rssiThr设得过高或过低。在代码中添加调试输出,实时打印测量的RSSI值
  • 检查天线和匹配电路:硬件问题会导致信号极弱。确保天线已连接,且匹配网络调试正确。
  • 验证相关器配置:如果使用相关器,检查corrConfig中的前导码模式、长度是否与发射端完全一致。一个字节序或比特顺序的错误就会导致完全无法检测

6.2 问题:嗅探模式功耗没有预期中低

  • 检查idleOp和超时:确保csConf.idleOp = 1。如果它设为0,即使信道空闲,接收命令也会一直运行直到超时,功耗很高。同时,检查csEndTime是否设置得过长。
  • 检查命令结束后的射频状态:在嗅探命令(返回IDLE)结束后,你是否立即调用了RF_yieldRF_flushCmd来让射频核心进入空闲状态?或者是否执行了RF_close在低功耗设计中,必须在无线活动间隙显式地让RF Core进入最低功耗状态
  • 测量电流波形:使用电流探头和示波器观察整个工作周期的电流消耗。你会清晰地看到唤醒、射频启动、嗅探、睡眠各个阶段的电流脉冲。这能帮你定位功耗是在哪个阶段没有降下来。

6.3 问题:CSMA性能不佳,冲突依然很多

  • 调整防抖参数numRssiIdlenumRssiBusy可能不适合你的环境。在嘈杂环境中,需要增加这些值来“滤波”。但增加过多会增加信道检测延迟。
  • 考虑非对称侦听:“隐藏终端”问题是CSMA的固有难题。设备A和C都在B的范围内,但彼此听不到。A向B发送时,C检测不到,也可能向B发送,导致在B处冲突。这需要在协议层引入RTS/CTS握手或使用时分多址(TDMA)来缓解。
  • 优化退避算法:简单的固定退避在负载高时效率低下。实现二进制指数退避(BEB)能显著改善性能。TI的某些协议栈(如Z-Stack)内部已经实现了复杂的退避机制。

6.4 调试工具与技巧

  1. GPIO辅助调试:充分利用CC13x2/CC26x2的GPIO,在代码关键点(如CS命令开始/结束、状态变化时)翻转GPIO电平。用逻辑分析仪抓取,可以可视化地看到命令执行时序、侦听时长、空闲/繁忙事件,是最强大的调试手段
  2. 读取内部状态:RF Core提供了一些寄存器可以反映内部状态(虽然文档可能未完全公开)。通过JTAG或SWD连接调试器,在IDE中查看这些寄存器,有时能发现配置错误。
  3. 使用TI的RF Studio或SmartRF Studio:这些图形化工具可以方便地配置和测试射频参数,包括载波侦听。你可以先在这里验证一组参数是否工作,再移植到代码中。
  4. 分步测试:不要一开始就搭建完整的CSMA网络。先让两个设备定频连续发送,用第三个设备测试载波侦听,看能否正确报告BUSY。再让发送端停止,测试IDLE报告。最后再引入随机发送和退避逻辑。

无线通信的调试,一半是软件,一半是艺术。载波侦听作为物理层和MAC层的桥梁,其稳定性和效率直接决定了整个网络的性能。希望这篇从原理到寄存器、从命令到实战的详解,能帮你把这把“利器”磨得更快,用得更准。当你看到自己设计的节点在复杂的电磁环境中稳定、低耗地运行时,那种成就感,就是对我们这些嵌入式“手艺人”最好的回报。