简介
Airspy 是一款高性能软件定义无线电 (SDR) 接收器,基于 NXP LPC4370 微控制器和 Rafael Micro R820T 调谐器。本文档详细分析了 Airspy 固件的代码执行流程,并通过流程图展示了各个功能模块和使用的硬件组件之间的交互关系。
硬件架构概述
Airspy 硬件由以下主要组件组成:
- LPC4370 微控制器 - 主处理器,包含 M4、M0 和 M0+ 内核
- R820T 调谐器 - 用于 RF 接收,频率范围 24MHz-1.8GHz
- SI5351C 时钟发生器 - 为系统提供时钟信号
- W25Q80BV SPI 闪存 - 1MB 容量,用于固件存储
- USB 接口 - 高速 USB 2.0,用于与计算机通信
多核处理架构
Airspy 利用 LPC4370 的多核架构进行任务分配:
- M4 内核:负责高速 ADC 采样、数据处理和打包
- M0 内核:负责 USB 通信、命令处理和 R820T 调谐器控制
- M0+ 内核:在某些配置中使用(可选)
核间通信通过共享内存和事件触发机制实现。
系统启动流程
1. 系统初始化
系统启动时,首先执行以下初始化步骤:
graph TD
A[系统上电] --> B[M4内核启动]
B --> C[初始化GPIO引脚]
C --> D[系统时钟初始化]
D --> E[检测硬件类型]
E --> F1[Airspy NOS配置]
E --> F2[Airspy MINI配置]
F1 --> G[配置SI5351C时钟]
F2 --> G
G --> H[配置PLL1低速模式]
H --> I[初始化I2C0和I2C1]
I --> J[配置PLL0USB为480MHz]
J --> K[禁用未使用的时钟和外设]
K --> L[启动M0内核]
系统初始化过程在 airspy_core.c
中的 sys_clock_init()
函数中实现,主要完成以下任务:
- 初始化 GPIO 引脚配置
- 检测硬件类型(Airspy NOS 或 Airspy MINI)
- 配置 SI5351C 时钟发生器
- 配置 PLL1 为低速模式
- 初始化 I2C0(用于 SI5351C)和 I2C1(用于 R820T)
- 配置 PLL0USB 为 480MHz(用于 USB 接口)
- 禁用未使用的时钟和外设以降低功耗
- 启动 M0 内核
2. M4 内核主循环
M4 内核在 airspy_m4.c
中的 main()
函数中执行以下任务:
graph TD
A[M4内核主循环] --> B[初始化ADCHS]
B --> C[配置DMA]
C --> D[等待M0内核命令]
D --> E{命令类型?}
E -->|采样率设置| F[设置采样率]
E -->|启动ADCHS| G[启动ADCHS采样]
E -->|停止ADCHS| H[停止ADCHS采样]
E -->|数据打包设置| I[设置数据打包模式]
F --> D
G --> J[DMA传输数据到缓冲区]
J --> K[数据打包处理]
K --> L[通知M0传输数据]
L --> D
H --> D
I --> D
M4 内核主要负责:
- 初始化高速 ADC (ADCHS)
- 配置 DMA 传输
- 等待来自 M0 内核的命令
- 根据命令执行相应操作(设置采样率、启动/停止 ADCHS、设置数据打包模式)
- 当 ADCHS 启动时,通过 DMA 将数据传输到共享缓冲区
- 如果启用了数据打包,对数据进行打包处理
- 通知 M0 内核传输数据到 USB
3. M0 内核主循环
M0 内核在 airspy_m0.c
中的 main()
函数中执行以下任务:
graph TD
A[M0内核主循环] --> B[初始化R820T]
B --> C[初始化USB设备]
C --> D[等待USB命令]
D --> E{命令类型?}
E -->|设置频率| F[设置R820T频率]
E -->|设置增益| G[设置R820T增益]
E -->|设置采样率| H[通知M4设置采样率]
E -->|启动接收| I[启动接收模式]
E -->|停止接收| J[停止接收模式]
E -->|其他命令| K[处理其他命令]
F --> D
G --> D
H --> D
I --> L[通知M4启动ADCHS]
L --> M[监控数据缓冲区]
M --> N[通过USB传输数据]
N --> M
J --> O[通知M4停止ADCHS]
O --> D
K --> D
M0 内核主要负责:
- 初始化 R820T 调谐器
- 初始化 USB 设备
- 等待来自 USB 主机的命令
- 根据命令执行相应操作(设置频率、设置增益、设置采样率、启动/停止接收)
- 当接收模式启动时,通知 M4 内核启动 ADCHS
- 监控数据缓冲区,将数据通过 USB 传输到主机
- 当接收模式停止时,通知 M4 内核停止 ADCHS
信号处理流程
Airspy 的信号处理流程如下:
graph LR
A[天线] --> B[R820T调谐器]
B -->|IF信号| C[LPC4370 ADCHS]
C -->|DMA| D[内存缓冲区]
D -->|可选数据打包| E[USB传输]
E --> F[计算机]
- 天线接收 RF 信号
- R820T 调谐器将 RF 信号转换为 IF 信号(通常为 4.5MHz 或 5MHz)
- LPC4370 的高速 ADC (ADCHS) 对 IF 信号进行采样
- 通过 DMA 将采样数据传输到内存缓冲区
- 可选的数据打包处理(提高 USB 传输效率)
- 通过 USB 将数据传输到计算机
时钟系统
Airspy 使用复杂的时钟系统,主要包括:
graph TD
XTAL[12MHz晶振] --> |启动时| CGU[时钟生成单元]
SI5351C[SI5351C] --> |CLK7| GPCLKIN[GP_CLKIN
PF_4] GPCLKIN --> CGU CGU --> PLL0USB[PLL0USB
480MHz] CGU --> PLL0AUDIO[PLL0AUDIO
可变频率] CGU --> PLL1[PLL1
可变频率] PLL0USB --> USBCLK[USB时钟] PLL0AUDIO --> ADCCLK[ADCHS时钟] PLL1 --> M4CLK[M4内核时钟] PLL1 --> PERIPHCLK[外设时钟] PLL1 --> APB1[APB1总线
I2C0] PLL1 --> APB3[APB3总线
I2C1]
PF_4] GPCLKIN --> CGU CGU --> PLL0USB[PLL0USB
480MHz] CGU --> PLL0AUDIO[PLL0AUDIO
可变频率] CGU --> PLL1[PLL1
可变频率] PLL0USB --> USBCLK[USB时钟] PLL0AUDIO --> ADCCLK[ADCHS时钟] PLL1 --> M4CLK[M4内核时钟] PLL1 --> PERIPHCLK[外设时钟] PLL1 --> APB1[APB1总线
I2C0] PLL1 --> APB3[APB3总线
I2C1]
- PLL0USB:配置为 480MHz,用于 USB 接口
- PLL0AUDIO:用于 ADCHS 时钟,根据采样率动态配置
- PLL1:用于 M4/M0 内核、外设、APB1 和 APB3 总线时钟
- 低速模式:用于降低功耗
- 高速模式:用于高性能处理
采样率配置流程
Airspy 支持多种采样率配置,配置流程如下:
graph TD
A[接收USB采样率命令] --> B[M0内核处理命令]
B --> C[通知M4内核设置采样率]
C --> D[M4内核配置PLL0AUDIO]
D --> E[配置ADCHS时钟]
E --> F[重新初始化R820T]
F --> G[设置R820T IF带宽]
- M0 内核接收来自 USB 主机的采样率设置命令
- M0 内核通过共享内存通知 M4 内核设置采样率
- M4 内核配置 PLL0AUDIO 以生成所需的 ADCHS 时钟频率
- 重新初始化 R820T 调谐器,设置适当的 IF 频率和带宽
频率设置流程
Airspy 的频率设置流程如下:
graph TD
A[接收USB频率命令] --> B[M0内核处理命令]
B --> C[计算LO频率]
C --> D[设置R820T跟踪滤波器]
D --> E[设置R820T PLL]
- M0 内核接收来自 USB 主机的频率设置命令
- 计算本地振荡器 (LO) 频率 = 目标频率 + IF 频率
- 根据频率范围设置 R820T 的跟踪滤波器
- 设置 R820T 的 PLL 以生成所需的 LO 频率
增益控制流程
Airspy 支持多级增益控制,包括:
graph TD
A[接收USB增益命令] --> B[M0内核处理命令]
B --> C{增益类型?}
C -->|LNA增益| D[设置R820T LNA增益]
C -->|混频器增益| E[设置R820T混频器增益]
C -->|VGA增益| F[设置R820T VGA增益]
C -->|LNA AGC| G[设置R820T LNA AGC]
C -->|混频器AGC| H[设置R820T混频器AGC]
- M0 内核接收来自 USB 主机的增益设置命令
- 根据增益类型设置 R820T 的相应增益参数:
- LNA 增益:低噪声放大器增益
- 混频器增益:混频器增益
- VGA 增益:可变增益放大器增益
- LNA AGC:低噪声放大器自动增益控制
- 混频器 AGC:混频器自动增益控制
数据传输流程
Airspy 的数据传输流程如下:
graph TD
A[ADCHS采样] --> B[DMA传输到缓冲区]
B --> C{数据打包?}
C -->|是| D[M4内核打包数据]
C -->|否| E[直接传输]
D --> F[M0内核监控缓冲区]
E --> F
F --> G[USB批量传输]
G --> H[计算机接收数据]
- ADCHS 对 IF 信号进行采样
- 通过 DMA 将采样数据传输到共享缓冲区
- 如果启用了数据打包,M4 内核对数据进行打包处理
- M0 内核监控缓冲区,当有新数据时通过 USB 批量传输到主机
- 计算机接收并处理数据
电源控制系统
Airspy 的电源控制系统如下:
graph TD
USB[USB电源] --> MAIN[主电源]
MAIN --> MCU[LPC4370]
MAIN --> CLKGEN[SI5351C]
MCU --> |P1_14| R820T_PWR[R820T电源控制]
R820T_PWR --> |高电平开启| R820T[R820T调谐器]
MCU --> |P2_13| BIAS_PWR[天线偏置电源控制]
BIAS_PWR --> |高电平开启| BIAS[天线偏置]
MCU --> |P1_17| LED_CTRL[LED控制]
LED_CTRL --> |高电平点亮| LED[状态LED]
- R820T 电源:由 P1_14 控制,高电平开启
- 天线偏置电源:由 P2_13 控制,高电平开启
- 状态 LED:由 P1_17 控制,高电平点亮
核间通信机制
Airspy 使用以下机制实现 M4 和 M0 内核之间的通信:
graph TD
A[共享内存] --> B[M4内核]
A --> C[M0内核]
B -->|事件触发| C
C -->|事件触发| B
A --> D[命令结构体]
D --> E[启动/停止ADCHS命令]
D --> F[设置采样率命令]
D --> G[设置数据打包命令]
A --> H[数据缓冲区]
H --> I[缓冲区偏移量]
H --> J[缓冲区长度]
- 共享内存:M4 和 M0 内核通过共享内存区域交换数据和命令
- 事件触发:使用 SEV(发送事件)和 WFE(等待事件)指令进行核间同步
- 命令结构体:定义了各种命令的格式和参数
- 数据缓冲区:用于存储采样数据的共享缓冲区
- 缓冲区管理:通过缓冲区偏移量和长度实现数据的生产者-消费者模型
固件更新机制
Airspy 支持通过 USB 进行固件更新,使用以下机制:
graph TD
A[USB命令] --> B[M0内核处理命令]
B --> C[擦除SPI闪存扇区]
C --> D[写入新固件]
D --> E[重启设备]
- W25Q80BV SPI 闪存用于存储固件
- 支持扇区擦除和页编程
- 支持从 ROM 到 RAM 的代码执行
总结
Airspy 固件采用多核架构,通过 M4 和 M0 内核的协作实现高效的信号处理和数据传输。系统使用复杂的时钟配置和电源管理机制,支持多种采样率和频率范围。通过深入理解代码执行流程,可以更好地利用 Airspy 进行软件定义无线电应用开发。
参考资料
- Airspy 官方文档:https://airspy.com/
- GitHub 仓库:https://github.com/airspy/firmware
- LPC4370 数据手册:https://www.nxp.com/
- R820T 数据手册:http://superkuh.com/rtlsdr.html