4. 第一个无线工程:从零创建Packet TX工程

好,咱们正式开始动手了。这一章的目标很明确——从零创建一个Packet TX工程,配置载波频率868MHz,设置发射功率14dBm。听起来简单,但这里面有不少细节,我当年第一次做的时候也踩过坑。

你可能会问:为什么第一个工程选Packet TX,而不是Continuous Wave(CW)?我个人习惯是先跑通数据包收发,再回头做射频指标测试。Packet TX能让你看到完整的协议栈流程,从MCU到射频前端,每个环节都能验证到。

4.1 工程创建:IDE与SDK准备

我以TI的SimpleLink CC13xx系列为例,但思路适用于任何Sub-1GHz MCU。你需要准备:

  • IDE:Code Composer Studio(CCS)或IAR Embedded Workbench
  • SDK:SimpleLink CC13xx SDK(建议v4.40以上)
  • 硬件:LaunchPad开发板 + 频谱仪(至少有个RTL-SDR也能看个大概)

打开CCS,点击File → New → CCS Project。这里有个小技巧:

我的习惯:不要从空工程开始。选择SDK自带的rfPacketTx示例作为模板,然后重命名。这样能保证所有链接脚本、中断向量表都是对的。我曾经手写工程配置,结果漏了射频内核的启动代码,折腾了两天才发现。

工程创建完成后,你会看到这样的文件结构:

project_root/
├── application/
│   ├── main.c
│   └── rf_packet_tx.c
├── config/
│   ├── rf_settings.c
│   └── rf_settings.h
├── startup/
│   ├── startup_cc13xx.c
│   └── cc13xx.lds
└── driverlib/
    └── rf_prop_cmd.c

嗯,这里要注意:rf_settings.c是射频参数配置的核心文件,我们接下来要改的就是它。

4.2 载波频率配置:868MHz的设定方法

Sub-1GHz频段在不同地区有不同规定。欧洲的868MHz频段(863-870MHz)是SRD(Short Range Device)的典型频段。配置频率时,你需要理解射频内核的频率合成器工作原理。

频率配置的核心参数是中心频率(center frequency)和频偏(frequency deviation)。对于2-FSK调制,载波频率就是中心频率。

在rf_settings.c中,找到频率配置结构体:

// 频率配置参数
RF_Mode rfMode =
{
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpeRfFreq = 868000000,  // 868 MHz
    .cpeRfFreqOffset = 0,
    .cpeRfFreqRes = 0,
    .cpeRfFrac = 0
};

等等,这里有个坑——cpeRfFreq的单位是Hz,不是MHz。我见过有人写成868,结果射频工作在868Hz,频谱仪上啥也看不到。正确写法是868000000。

如果你用的是SmartRF Studio生成的配置,它会自动帮你算好。但我建议你手动确认一下:

参数 寄存器/字段 值 说明
中心频率 FREQ2:FREQ1:FREQ0 0x1B7740 868MHz的十六进制表示
频偏 DEVIATION_M 0x0014 20kHz(典型值)
数据速率 MDMCFG1:MDMCFG0 0x0A:0x1A 50kbps
注意:868MHz频段在欧洲有占空比限制(通常1%或10%)。如果你做产品,记得加占空比限制逻辑。我有个客户没注意这个,CE认证时被打了回来。

4.3 发射功率设置:14dBm的配置路径

14dBm大约是25mW,属于Sub-1GHz的典型发射功率。在CC13xx上,功率配置通过TX Power寄存器和PA(功率放大器)配置共同决定。

功率配置代码通常在rf_packet_tx.c的初始化部分:

// 设置发射功率为14dBm
RF_TxPower_t txPower =
{
    .txPower = 0x0F,  // 对应14dBm
    .txPowerRamp = 0x00,
    .txPowerBoost = 0x00
};

RF_postCmd(rfHandle, (RF_Op*)&RF_cmdTxPower, RF_PriorityNormal, NULL, 0);

这里txPower的值不是线性映射的。不同芯片、不同频段,映射表不一样。我建议你查芯片数据手册的TX Power Table。以CC1310为例:

txPower值 输出功率(dBm) 电流消耗(mA)
0x0F 14 24.5
0x0E 13 22.0
0x0D 12 19.8
0x00 -10 5.2

你想想看,如果设置成14dBm但实际电流只有5mA,那肯定不对。我调试时习惯先看电流,再测功率。电流对了,功率基本不会差太多。

4.4 核心流程:从初始化到发射

整个Packet TX的流程可以用下面这张图概括:

Packet TX工程核心流程 系统初始化 射频初始化 配置频率868MHz 配置功率14dBm 配置调制参数 准备数据包 发射数据包 注意:频率、功率、调制三个配置可以并行完成,但必须在射频初始化之后

流程看起来简单,但每个步骤都有陷阱。我挑几个重点说说:

4.5 避坑指南:我踩过的三个坑

坑一:射频内核启动顺序

射频初始化必须在配置频率之前。如果你先设频率再开射频,寄存器写不进去。我刚开始做时,代码顺序写反了,结果频率始终是默认的915MHz(美国频段),在868MHz频段上啥也收不到。

坑二:功率设置的有效范围

14dBm不是所有频段都支持。在868MHz频段,CC1310最大支持14dBm,但如果你工作在433MHz频段,最大只有10dBm。设置超限值,芯片不会报错,但实际输出功率会限幅。我建议你设置完后读一下TX_POWER寄存器确认。

坑三:数据包格式

Packet TX的数据包不是随便填的。你需要配置前导码(preamble)、同步字(sync word)、长度字段和CRC。我见过有人把同步字设成全0,结果接收端一直搜不到同步头。标准做法是用0x930B或0xD391这种自相关性好的序列。

调试小技巧:第一次发射时,用频谱仪看载波频率对不对。如果看到中心频率在868MHz,说明频率配置对了。然后看发射带宽,2-FSK的带宽大约是2×(频偏+数据速率/2)。如果带宽不对,检查调制参数。

4.6 验证方法:怎么确认工程跑对了?

工程写完后,别急着写接收端。先做三个验证:

  1. 频谱仪验证:看868MHz处有没有载波,功率是不是14dBm左右(考虑线损,实际可能12-13dBm)
  2. 电流验证:发射时电流应该在20-25mA(取决于芯片型号),如果电流只有几mA,说明PA没打开
  3. 逻辑分析仪验证:抓GPIO翻转,确认射频状态机是否进入了TX状态

我个人习惯先做电流验证,因为最简单。拿万用表串在电源上,按一下发射按钮,看电流跳变。如果电流没变化,那肯定有问题,不用上频谱仪了。