1. 为什么是 CC1120:从“项目要覆盖 3 公里”说起
1.1 一个真实项目背后的需求拆解
去年接了一个能源管控方向的改造项目,厂区里有十来个数据采集点,分布在半径大约 3 公里的范围内。最远的两个点位中间还隔着两排钢结构厂房和一片堆料区。采集内容说白了就是 RS485 仪表数据,单包不到 300 字节,每 5 分钟上传一次,对带宽几乎没有要求。但这个项目有三条硬指标:误码率低于 1%,设备用电池供电至少跑两年,以及尽可能减少现场维护。
刚开始我也跟大多数人一样,脑子里第一个蹦出来的是 LoRa。毕竟“LoRa 远距离”这个概念已经深入人心。但真正对着需求做选型对比时,我发现问题没那么简单。LoRa 调制的优势是灵敏度高,但它的带宽占用通常更宽,在免许可频段里一旦遇到有其他系统占用邻近信道,窄带接收机的抗邻道阻塞能力就变得格外重要。再加上 LoRa 的私有调制和解调 IP 绕不开授权,项目方希望底层协议完全自主可控,所以最终把方案定在了 TI 的 CC1120 上,配合参考设计 BOM 里那颗 R7KA8D2KFLCAC 前端器件,做一套窄带 Sub-1G 私有协议。
1.2 CC1120 的技术底子:低速率窄带方案的天花板
CC1120 是 TI 旗下非常经典的一颗 Sub-1G 射频收发器,覆盖 169/315/433/868/915MHz 等 ISM 频段,支持 2-FSK、4-FSK、MSK、ASK/OOK 等调制方式。它最吸引我的地方是三个数字叠在一起:最大发射功率 +16dBm,低速率接收灵敏度可以做到 -129dBm 左右,同时接收滤波器带宽能配置到很窄。
这三个数字意味着什么?发射功率决定了你能“喊”多响,接收灵敏度决定了你能“听”多轻,而窄带接收带宽则决定了你在嘈杂的电磁环境里能不能听清。CC1120 恰好把这三件事都做到了。相比之下,很多通用 Sub-1G 收发器要么发射功率不够,要么灵敏度在窄带配置下没那么突出。
另外一个容易被忽略的点是 CC1120 支持双频段配置,同一颗料可以在多个频段之间切换。有些项目会用 868MHz 做主链路,用 169MHz 做备用链路,甚至有些参考设计直接给出双频段接收方案。虽然我这次用不到,但这给后续产品迭代留了空间。
1.3 链路预算手工推演:比十篇评测都管用
选型阶段我做了一张链路预算表,这一步强烈建议所有做无线项目的人认真做一遍。公式其实很简单:
链路预算 = 发射功率 + 发射天线增益 - 发射端馈线损耗 - 空间传播损耗 - 接收端馈线损耗 + 接收天线增益 - 接收灵敏度 - 设计余量
以 868MHz 为例,发射功率 +16dBm,两端各用 3dBi 天线,收发端接插件和馈线损耗合计约 1dB,接收灵敏度 -129dBm。这样毛估可用的链路预算是:
可用预算 = 16 + 3 - 0.5 - 空间损耗 - 0.5 + 3 - (-129) ≈ 150dB - 空间损耗
自由空间传播损耗在 868MHz 下,1 公里大约 91.2dB,3 公里大约 100.7dB,10 公里大约 111.2dB。也就是说,在完全无遮挡的视距环境下,这颗芯片的极限能力远远超过 10 公里。但现实世界从来不是自由空间。厂房、树木、地面反射、雨衰、多径衰落,这些都会在标称的自由空间损耗之上再叠加二十到四十多 dB 的损失。所以对长距离稳定连接来说,芯片本身的收发能力是基础,但真正的瓶颈往往在天线高度、前端插损和现场遮挡上。
这也是为什么我在方案评审时,反复强调 R7KA8D2KFLCAC 这类前端器件的插损不能随便妥协。每一 dB 的插损都会直接吃进链路预算,最终表现为距离缩短或者重传率上升。
2. 那颗前端器件(R7KA8D2KFLCAC)在链路里的地位
2.1 它的角色:滤波、匹配、抑镜像,一个都不能少
CC1120 的射频端口 RF_N 和 RF_P 是差分口,而天线是单端 50Ω。从芯片到天线之间这段电路,必须完成三件事:第一,把差分信号转成单端信号;第二,做阻抗匹配,让芯片看到最优源阻抗;第三,带通滤波,把镜像频率、谐波和带外干扰尽可能压下去。
R7KA8D2KFLCAC 在参考设计的 BOM 里,承担的就是这第二和第三件事,具体到某颗料上可能是带通滤波器,也可能是巴伦加匹配网络的组合器件,需要以实际数据手册为准。但不管它具体是哪种,我们都可以用同一套方法来验证它是否合格。
很多人画原理图时,看到这种小封装器件,习惯性地当成普通电容电阻一样处理。实际上前端无源器件的插入损耗和带外抑制,直接决定了整条链路的“听力”和“嗓门”。插入损耗每增加 1dB,接收灵敏度就实际恶化 1dB,发射端的有效辐射功率也降 1dB。换句话说,前端插损每多 1dB,你的覆盖距离就要按对数关系缩水一截,重传率也会肉眼可见地上升。
带外抑制的重要性在接收端体现得更明显。当附近有一个强干扰源落在镜像频点上,混频器会把它搬移到中频,轻则抬高底噪、降低灵敏度,重则直接让解调器锁死,永远收不到有效报文。发射端也一样,868MHz 的二次谐波落在 1.7GHz 附近,三次谐波落在 2.6GHz 附近,前端滤波器指标不够,这些谐波会顺着天线辐射出去,影响其他设备。
| 前端器件关键指标 | 推荐范围 | 影响 |
|---|---|---|
| 插入损耗 | ≤ 1.0dB | 直接进入链路预算 |
| 回波损耗 | ≤ -10dB(VSWR < 2) | 反射功率过高影响发射效率 |
| 带外抑制 | ≥ 30dB(目标频段外) | 决定镜像和谐波抑制能力 |
| 平均输入功率 | ≥ +27dBm | 防止发射功率反射烧毁器件 |
| 工作温度 | -40℃ ~ +85℃ | 工业现场基本要求 |
2.2 拿到料号我做的第一件事:不是直接贴板,是上网络分析仪
射频前端器件最怕“看起来一样,实际上差很多”。所以我的习惯是,料号到手先做一轮独立验证,尤其是滤波器这种无源器件,不能只信数据手册。
验证流程不太复杂,但每个步骤都要做扎实:
- 先准备一块 50Ω 微带线测试板,两端接 SMA 接头,板子材质和厚度最好和自己实际产品接近。
- 用矢量网络分析仪做 SOLT 校准,校准平面要推到测试板的 SMA 端口。
- 焊上待测器件后,测 S21(插入损耗)和 S11(回波损耗)。
- 重点看目标频段 868~928MHz 内 S21 是否平坦,插损是否小于 1dB;S11 是否低于 -10dB。
- 有条件的话,放进高低温箱从 -40℃ 到 +85℃ 拉一遍,记录中心频率漂移量。
我吃过一次亏。有一批替代料在常温下测试曲线非常漂亮,S21 几乎是一条平线,但在低温测试时中心频率偏了接近四十多兆赫兹,整条链路的灵敏度直接掉了十几个 dB。当时现象就是“低温环境下通信时断时续”,排查了很久才发现是前端器件温漂导致的。从那以后,前端物料上板前的高低温实测就写进了我的必做清单。
2.3 换料可以,但必须守住三条铁律
量产阶段难免遇到器件缺货、交期拉长的情况,替代料是常态。但射频前端换料,真的不是“脚位一样就能上”的事。我给自己定了三条原则:
第一,必须是同封装、同脚位、同类型的器件,否则参考设计里的匹配网络数值全部作废,需要重新调匹配。第二,插损和带外抑制指标不能低于原器件,插损哪怕只差 0.3dB,也要老老实实把这 0.3dB 从链路预算里扣掉,再判断覆盖距离是否还在规格内。第三,温度特性必须经过实测确认,不能只看 25℃ 的数据手册值。
换料后的验证也不能省。最稳妥的做法是做一块 A/B 对比板,把原器件和替代料分别焊在两块完全相同的板上,放到同一位置,用相同的发射功率和接收配置打流,对比 RSSI 和丢包率。如果你手头有网络分析仪,先测 S 参数,再上环境测试,这样能排除绝大部分问题。
3. 从参考设计到自己的板子:硬件细节与寄存器配置
3.1 最小系统里容易翻车的几个引脚
CC1120 的外围电路不算复杂,但有几个引脚处理不好,会让后面所有调试都变得痛苦。
电源方面,芯片工作电压范围是 2V 到 3.6V,射频部分对电源噪声比较敏感。我的做法是给射频供电单独走一颗 LDO,数字部分叠在一起供电,并且在 VDD 引脚附近就近摆放 10nF、100nF、1uF 三颗退耦电容,让高、中、低频纹波都有去处。实测下来,这样做对接收灵敏度的稳定很有帮助,尤其是在电池电压被 DC-DC 拉出一堆纹波的系统里。
复位引脚 RESET_N 不能悬空,必须上拉到 VDD,否则上电时序稍微不对,芯片就可能进入未知状态。时钟方面,常用 26MHz 晶振,晶振的负载电容要按晶振厂商标称的 CL 值计算,不能随手从参考设计里抄一个值。CL 偏了,频偏会直接超过接收端自动频率校正的容忍范围。RBIAS 引脚需要一颗高精度电阻接到地,常见取值 20kΩ/1%,这颗电阻的精度会影响芯片内部电流基准,进而影响发射功率和接收性能,不要用普通 5% 电阻随便顶。
GPIO2 和 GPIO3 我习惯配成 TX FIFO 阈值中断和 RX FIFO 阈值中断,配合 SPI 中断方式,MCU 不用频繁轮询,处理实时性也好很多。
3.2 用 SmartRF Studio 生成配置,但别当“无脑抄写员”
TI 的 SmartRF Studio 7 是配置 CC1120 的最快捷途径。界面里选择 CC1120,输入中心频率、调制方式、符号率、频偏、接收滤波器带宽、同步字、包格式,软件会直接生成完整的寄存器数组和 C 代码示例。工具用起来很简单,但有几个关键参数我建议你亲手理解,而不是无脑抄。
2FSK 信号占用的带宽大致可以用“两倍频偏加两倍数据率”来估算。比如数据率 1.2kbps、频偏 2.4kHz,理论带宽至少 7.2kHz,实际接收滤波器带宽还要再留余量,一般设置成 10kHz 或更大一些。这个参数如果设得太小,信号频谱会被切掉,灵敏度反而下降;设得太大,噪声进来太多,同样拉低灵敏度。
中心频率由 FREQ0、FREQ1、FREQ2 和频率分频配置共同决定,SmartRF Studio 会帮你算好写入值,但你要确认最终写入的寄存器数值和你设定的频点一致,尤其是改过晶振频率以后。同步字、前导码和 CRC 我也建议固定下来,比如前导码 4 字节、同步字用自定义的 32 位值、CRC16,这样可以在接收端直接过滤掉大部分噪声帧。
生成完配置后,写进产品固件时建议加一个回读校验步骤,因为 SPI 线上的毛刺偶尔会导致寄存器写入失败,读回比对一下能避免“看起来配置了,实际没生效”的尴尬。
void cc1120_apply_config(const uint8_t config[][2], uint16_t len) { for (uint16_t i = 0; i < len; i++) { cc1120_write_reg(config[i][0], config[i][1]); } // 回读校验,防止 SPI 异常导致寄存器未写入 for (uint16_t i = 0; i < len; i++) { uint8_t val = cc1120_read_reg(config[i][0]); if (val != config[i][1]) { // 记录错误,重新写入或触发软件复位 } } }3.3 PCB 布局:天线净空和射频走线是重点
长距离无线系统的 PCB 布局,直接影响最终能不能跑出手册里的性能。天线区域对应位置的每一层都要做净空处理,不能在天线正下方铺完整地平面,否则天线的谐振频率会被拉偏,效率下降。实际产品里,如果外壳是金属件,还要格外关注天线附近有没有金属结构形成遮挡。
从 CC1120 差分口到前端器件,走线尽量短,并且两根差分线等长、等距、镜像对称。差分转单端之后,用 50Ω 微带线走到天线座。微带线的宽度要按板厚和叠层计算,不能靠“拍脑袋”定数值。射频走线周围包地,包地间距建议大于或等于线宽,并且沿两侧打满地过孔。特别要提醒的是,不要在射频走线的正下方层穿高速数字信号线或电源线,这种耦合会在射频信号上叠加噪声,让接收底噪抬升好几个 dB。
我在改板时吃过一次亏:为了省空间,把一根 SPI 时钟线从天线走线下方穿过,结果天线阻抗特性明显恶化,RSSI 被拖低了差不多 5dB。后来把走线挪走,地包好、过孔打满,问题立刻消失。这个案例后来被我写进了团队的设计规范。
4. 实测、排错、稳定性调优:把“稳定长距离”从口号变成数据
4.1 现场实测记录:视距与非视距的真实差距
板子调通以后,我们做了一轮比较完整的现场实测。两个测试点之间没有遮挡时,4.8 公里外接收,RSSI 大约在 -92dBm,连续打流一小时,丢包率接近零。同样的板子挪到厂区环境,中间隔着仓库和钢结构建筑,距离只有 2 公里左右,RSSI 却掉到了 -105dBm,偶尔出现个别丢包。
后来把天线从 1.5 米的铁杆提到 6 米屋顶,同样的路径和环境,RSSI 回升了约 8~10dB,通信立刻恢复了稳定。这个对比很直观:对长距离稳定连接来说,天线架设高度和视野开阔度的影响,远大于我们花大力气去抠的那 1dB 插损或 1dB 功率差异。所以在项目里,只要有条件,优先把天线架高,其次才是调射频参数。
RSSI 是最便宜的无线网络仪表。现场测试时,每到一个固定点位,让设备进入接收模式,读一次 RSSI 值,记录成表格,就能画出一张真实覆盖热力图。我建议所有做无线项目的同事都养成这个习惯,比任何经验公式都准。
4.2 三个典型故障的完整排查链路
故障一:两端都能初始化,但收不到任何报文。
这种问题首查收发配置是否完全对称。FSK 还是 MSK、符号率、频偏、同步字、前导码长度、包长格式、数据白化开关,任何一位没有配对,接收端就无法锁住报文。再用频谱仪看发射端频谱,确认载波频率是否落在目标频点。如果中心频率偏了,优先查晶振负载电容和 FREQ 寄存器的写入值。
故障二:距离比链路预算估算的结果近太多。
按顺序排查天线馈点焊接是否可靠、天线 VSWR 是否正常、前端滤波器插损是否过大、射频走线周围有没有干扰源、天线下方净空是否足够、电源噪声有没有拉低灵敏度。有一个经常被忽略的坑:很多“天线效率差”其实是天线没有参考地平面。吸盘天线需要金属底座做地,橡皮天线需要板载地平面,如果把这类天线装在塑料壳子里,性能下降会非常明显。
故障三:工业现场频繁丢包、延迟大。
这种多半是共信道干扰引起的。CC1120 支持 CCA(信道空闲评估),读取当前 RSSI,超过阈值就认为信道忙,自动退避。把这种机制用起来,再配合简单的重传和随机退避,实测对降低冲突非常有效。还有一种情况是多个设备同时抢信道,可以在规约层面规划好信道列表,各设备固定占用不同窄带信道,或者做轻量跳频,都能显著改善稳定性。
提示:排查问题时,不要把“怀疑对象”局限在射频部分。MCU 端 SPI 速率太高、中断被长时间屏蔽、FIFO 溢出处理不及时,都可能造成通信失败,而且表现和射频问题非常像。我会习惯在固件里打印关键寄存器状态和 FIFO 计数,先排除软件问题,再动射频前端。
4.3 固件细节:那些容易在最后关头翻车的地方
写寄存器之前,先做软件复位,确保芯片从上电开始就处于确定的寄存器状态。进入 TX 或 RX 要用命令 strobe,比如 STX、SRX,不能通过直接写寄存器来切换。上电后第一次进入某个频段工作时,芯片会做自动校准,校准完成前如果强行发数据很容易失败,所以要等待状态寄存器确认校准结束。
FIFO 管理也是重点。发送前把 payload 写入 TX FIFO,然后根据 TX FIFO 阈值中断判断是否已经发完;接收时如果 RX FIFO 溢出,务必要把 FIFO 清掉,否则后续报文会被错误的分帧逻辑搞乱。低功耗唤醒后的流程也要提前规划好:CC1120 进入 SLEEP 后配置寄存器内容保持不变,但重新唤醒进入 RX/TX 前还要再做校准。配合外部 RTC 定时唤醒 MCU,再唤醒 CC1120,实测休眠电流可以做到微安级,电池撑两年以上完全可行。
5. 关于这套方案,我想再给你几条实在的建议
第一,不要把芯片宣传页上的参数当作产品指标。CC1120 在低速率下能做到 -129dBm 的灵敏度,但那是理想测试条件下的结果。实际产品里,前端插损、天线效率、电源噪声、结构遮挡每一项都会把它拉低。设计目标最好留出 10dB 以上的余量,否则量产一致性稍微波动,表现就会忽好忽坏。
第二,窄带信道值得好好利用。CC1120 擅长的事情就是窄带、低速率、高灵敏度、强抗干扰。如果项目本身没有高带宽需求,就别为了追求“看起来快”而把速率提上去。我这次最终选用 1.2kbps、2.4kHz 频偏的组合,单包 300 字节打满也只要几秒,完全够用,换来的是更多 dB 的灵敏度和更强的抗干扰能力。
第三,前端物料在量产前一定要做 A/B 验证和温度测试。我在前面提到的那颗 R7KA8D2KFLCAC,虽然只是参考设计里一颗不起眼的前端器件,但它直接关系到整条链路能不能在恶劣环境里稳定工作。缺货换料时,宁可多花两天做验证,也不要省这一道工序。后期返工的成本,远不止是那几毛钱的物料价差。
做完整套项目,我最深的体会是:稳定长距离连接不是某一颗芯片单独决定的,而是链路预算、前端器件、PCB 布局、天线架设和固件策略一起合力的结果。CC1120 这颗料上限很高,但能不能发挥出来,取决于你把每一个细节做到什么程度。希望这篇文章的思路,能帮你少走几步弯路。