接手的半成品项目,前期试验已经完成,可以收到AIS命令,但SI4463芯片的晶振不够准确导致频率不准,导致明明在WDS里分别设定为161.975和162.025的AB芯片只有一个芯片能收到信号。
另外这本来也是个Demo,为了提高鲁棒性也需要大改代码,so开始搭积木,删删减减挑出有用的模块拼凑一下,顺便也解决上面提到的频率问题。
先随便写写吧,下面从项目概述开始介绍。
一、项目目标
AIS 工作在 VHF 海事频段,主要使用两个信道:
| 信道 | 频率 |
|---|---|
| AIS1 (A) | 161.975 MHz |
| AIS2 (B) | 162.025 MHz |
为了同时接收两个 AIS 信道,项目采用:
- STM32F103 作为主控
- 两颗 SI4463 射频芯片分别接收AB信道
- USB与上位机通信
- Qt/QML 开发上位机扫频软件
实现:
- 双通道同时接收
- QT 实时显示接收数据
- QT RSSI 频谱显示
- 可修改工作频率实现扫频功能(主要是为了解决晶振不准确导致的频率不准)
- 掉电保存已配置的频率
通讯和工作流程如下图:
以上就是项目大致的架构,我的任务就是接手烂尾的STM32程序以及开发扫频功能的上位机。
PS:这里也考虑过直接设置芯片AFC来解决硬件导致的频率偏移问题,但实际结果是偏移过大(最后扫频发现A芯片的接收范围设为161.840-161.910MHz才能获得161.975MHz频率的信号,B通道设为161.940-162.010MHz能获得162.025MHz频率的信号,频率整体往下偏移,也不知道是不是硬件的锅),这么大的偏差用AFC根本不现实,很容易被别的频率带偏,甚至这两个频率都会互相干扰。
二、开发过程
Ⅰ.WDS
SI4463官方提供的便于配置芯片的小工具,可以直接生成初始化芯片的头文件。我接手时基础的配置已经配置好了,但需要根据文档找到调整频率的命令来实现扫频功能。
这里附上官网文档地址:
https://www.silabs.com/wireless/proprietary/ezradiopro-sub-ghz-ics/device.si4463?utm_source=chatgpt.com&tab=techdocs
里面非常详细,我只看了部分用到的文档,完整配置挺复杂的或许有空可以单独出一篇解释一下各个参数的功能。
Ⅱ.STM32
用一个F103来控制两个SI4463芯片接收AB信道,选择SI4463的原因是市面上有用该芯片做好的成品,这个项目相当于仿制研究AIS发送接收流程,后期应该会换成更便宜的国产芯片。
1.SI4463 硬件复位
拉高再拉低芯片的 SDN 引脚,重启芯片复位,延时一段时间等待芯片重启成功。
2.EEPROM初始化
把保存在Flash的参数加载到 EEPROM 缓存区,这里主要是为了重启时加载已经修改过的频率配置。
3.芯片初始化
SPI初始化SI4463↓
POWER_UP(这里把上电命令单独拎出来了,芯片接收到上电命令后会有很长一段时间的延迟,截获命令后可以看到CTS一直在询问但芯片在忙,所以单独给它一个长等待)↓
配置GPIO↓
配置调制器↓
配置频率(配置两个芯片的频率,有两种可能:1.从初始化文件正常配置2.如果Flash里存有数据则优先按照Flash进行配置)↓
配置中断(接收到AIS信号则进入中断进行解码)↓
进入RX模式
最开始接手的原程序为了省事直接多发了几遍初始化,没有按照正确的“发一条配置发一遍CTS”的方式进行初始化,我增加了CTS(Clear To Send)确保芯片能稳定的初始化成功。
4.主循环流程
① USB命令处理
USB发送命令↓
SI4463修改频率↓
存储到Flash(如果是保存命令的话)
上位机发送的修改频率的命令被分为两种,一种是直接修改频率,重启后会由于重新初始化而丢失,因此为了保存修改内容,增加另一种保存可以把频率保存到到Flash,保证断电不丢失配置。扫频时使用第一种修改方式,等扫频得到正确频率后使用第二种保存。
② AIS解码
NRZI解码↓
去填充0↓
CRC校验↓
Bit翻转↓
6bit转ASCII↓
USB发送给上位机
这个解码过程很麻烦,详细步骤可以参考我上一篇写的解码小程序。
Ⅲ.上位机
QML开发的上位机,显示获得的AIS信息以及实现扫频功能。
1.串口管理
常用功能直接ai生成了,刷新扫描串口,连接断开等基础功能。
2.日志管理
滚动日志,一键清空等功能,给我自己调试时看的。
3.频率配置
拖动Slider发送配置频率的命令,最开始的版本是手动拖动Slider实现扫频,发现手动不太方便所以又写了个自动扫频,输入起始位置、终止位置、步距、每步延时就能自动发送频率配置实现扫频。
最上方可以选择要进行扫频的AB通道,当选择A通道时,扫频、修改、RSSI图都属于A通道,选择B通道时同理,切换通道时RSSI图清空。
另一种保存方式则是输入并点击Set按钮,这里是保存到Flash,断电重启后初始化会优先按照Flash中的数值设定频率。
4.RSSI显示
获得包的时候也同时获得RSSI,可以更直观的看到哪个频率时接收信息最强。
