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。这里有个小技巧:
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 |
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的流程可以用下面这张图概括:
流程看起来简单,但每个步骤都有陷阱。我挑几个重点说说:
4.5 避坑指南:我踩过的三个坑
坑一:射频内核启动顺序
射频初始化必须在配置频率之前。如果你先设频率再开射频,寄存器写不进去。我刚开始做时,代码顺序写反了,结果频率始终是默认的915MHz(美国频段),在868MHz频段上啥也收不到。
坑二:功率设置的有效范围
14dBm不是所有频段都支持。在868MHz频段,CC1310最大支持14dBm,但如果你工作在433MHz频段,最大只有10dBm。设置超限值,芯片不会报错,但实际输出功率会限幅。我建议你设置完后读一下TX_POWER寄存器确认。
坑三:数据包格式
Packet TX的数据包不是随便填的。你需要配置前导码(preamble)、同步字(sync word)、长度字段和CRC。我见过有人把同步字设成全0,结果接收端一直搜不到同步头。标准做法是用0x930B或0xD391这种自相关性好的序列。
4.6 验证方法:怎么确认工程跑对了?
工程写完后,别急着写接收端。先做三个验证:
- 频谱仪验证:看868MHz处有没有载波,功率是不是14dBm左右(考虑线损,实际可能12-13dBm)
- 电流验证:发射时电流应该在20-25mA(取决于芯片型号),如果电流只有几mA,说明PA没打开
- 逻辑分析仪验证:抓GPIO翻转,确认射频状态机是否进入了TX状态
我个人习惯先做电流验证,因为最简单。拿万用表串在电源上,按一下发射按钮,看电流跳变。如果电流没变化,那肯定有问题,不用上频谱仪了。