1. 项目概述:基于Si4731与STM32F765ZI的收音机开发平台
最近在整理工作室的元器件库存时,翻出一块闲置的Si4731收音机芯片和STM32F765ZI开发板。这两者组合起来,正好可以搭建一个功能强大的数字收音机实验平台。Si4731作为业界知名的全波段收音芯片,支持AM/FM/SW/LW等多种调制方式;而STM32F765ZI则是STMicroelectronics推出的高性能Cortex-M7内核微控制器,内置浮点运算单元,特别适合处理音频信号。
这个组合最吸引我的地方在于:既能体验传统收音机的调谐乐趣,又能通过现代MCU实现数字信号处理。比如可以添加频谱显示、自动搜台、音频效果处理等功能。下面我就详细记录这个项目的实现过程,包括硬件连接、软件架构设计以及几个关键功能的实现细节。
2. 硬件选型与电路设计
2.1 核心器件特性分析
Si4731-D60是Silicon Labs推出的一款数字调谐收音芯片,主要特性包括:
- 工作电压范围:2.7-5.5V
- 支持频段:
- FM:64-108MHz(包括日本76-90MHz频段)
- AM:520-1710kHz
- SW:2.3-30MHz
- LW:153-279kHz
- 信噪比:FM≥50dB,AM≥40dB
- 内置数字音频处理(去加重、音量控制等)
STM32F765ZIT6的主要参数亮点:
- Cortex-M7内核@216MHz,带双精度FPU
- 2MB Flash,512KB SRAM
- 丰富的外设接口:
- 3个I2S接口(用于音频传输)
- 2个SAI(Serial Audio Interface)
- 多达6个USART/UART
- 封装:LQFP144(便于手工焊接)
2.2 硬件连接方案
整个系统的硬件连接主要分为三个部分:
Si4731基础电路:
- 天线输入:使用75Ω同轴电缆接口,FM波段需要约1.5m导线作为天线
- 晶振:32.768kHz(用于RDS解码)
- 音频输出:通过22μF电容耦合到功放
STM32与Si4731的接口:
// 典型I2C连接方式 SI4731_I2C_SCL --- PA8 (I2C3_SCL) SI4731_I2C_SDA --- PC9 (I2C3_SDA) SI4731_RESET --- PE2 (GPIO)音频处理电路:
- 一级运放缓冲:TL082构成电压跟随器
- 二阶有源低通滤波:截止频率15kHz
- 数字电位器:MCP4018控制最终输出音量
提示:Si4731的I2C地址固定为0x22(写)和0x23(读),硬件设计时注意上拉电阻取值(通常4.7kΩ)。
3. 软件开发环境搭建
3.1 工具链配置
我选择使用STM32CubeIDE作为主要开发环境,配合以下软件组件:
- STM32CubeF7 HAL库(版本1.17.0)
- FreeRTOS(用于任务调度)
- ARM CMSIS-DSP库(用于音频处理)
关键配置步骤:
- 在CubeMX中启用I2C3(标准模式,100kHz)
- 配置一个USART用于调试输出(115200bps)
- 启用CRC计算单元(Si4731的某些功能需要CRC校验)
3.2 Si4731驱动实现
Si4731通过I2C接口进行控制,其命令分为以下几种类型:
- 属性设置(SET_PROPERTY)
- 属性获取(GET_PROPERTY)
- 调谐命令(FM_TUNE_FREQ等)
- 状态查询(GET_INT_STATUS)
下面是一个典型的频率设置函数实现:
HAL_StatusTypeDef SI4731_SetFrequency(uint16_t freq) { uint8_t cmd[5] = {0x20, 0x00, 0x00, 0x00, 0x00}; // FM频点以10kHz为单位 cmd[1] = (freq >> 8) & 0xFF; cmd[2] = freq & 0xFF; return HAL_I2C_Master_Transmit(&hi2c3, SI4731_ADDR_WRITE, cmd, 5, 100); }4. 核心功能实现
4.1 自动搜台算法
传统收音机的自动搜台功能在数字芯片上实现更加精准。我设计的搜台流程如下:
- 设置起始频率(如FM 87.5MHz)
- 以100kHz为步进增加频率
- 每次调谐后读取RSSI(接收信号强度)
- 当RSSI > 20dBμV且SNR > 30dB时判定为有效电台
- 存储该频率并继续搜索
关键代码片段:
void FM_Scan(void) { uint16_t currentFreq = 8750; // 87.50MHz uint8_t validStations[50] = {0}; uint8_t stationCount = 0; while(currentFreq <= 10800 && stationCount < 50) { SI4731_SetFrequency(currentFreq); HAL_Delay(50); // 等待调谐稳定 SI4731_GetStatus(&status); if(status.RSSI > 20 && status.SNR > 30) { validStations[stationCount++] = currentFreq; currentFreq += 20; // 跳过200kHz避免重复 } else { currentFreq += 10; // 步进100kHz } } }4.2 音频频谱显示
利用STM32F765ZI的FPU加速FFT计算,可以实现实时的音频频谱显示:
- 配置SAI接口接收音频数据(16bit,32kHz采样率)
- 每256个采样点做一次1024点FFT
- 将结果映射到8段频谱显示
FFT处理关键代码:
#include "arm_math.h" void ProcessAudio(uint16_t *input, uint8_t *spectrum) { float32_t fftInput[1024]; float32_t fftOutput[1024]; arm_rfft_fast_instance_f32 fft; // 初始化FFT实例 arm_rfft_fast_init_f32(&fft, 1024); // 转换为浮点并加窗 for(int i=0; i<256; i++) { fftInput[i] = (input[i] - 32768) * 0.5f * (1 - arm_cos_f32(2*PI*i/255)); } // 执行FFT arm_rfft_fast_f32(&fft, fftInput, fftOutput, 0); // 计算幅度并分组 for(int band=0; band<8; band++) { float sum = 0; for(int bin=band*16; bin<(band+1)*16; bin++) { float re = fftOutput[2*bin]; float im = fftOutput[2*bin+1]; sum += sqrtf(re*re + im*im); } spectrum[band] = (uint8_t)(sum / 16 / 50); // 归一化 } }5. 系统优化与调试
5.1 I2C通信稳定性
在实际测试中发现,当CPU频率较高时(>180MHz),I2C通信偶尔会出现失败。通过以下措施解决:
- 在I2C初始化后增加5ms延时
- 将I2C时钟从100kHz降至50kHz
- 在关键命令发送前加入重试机制:
#define MAX_RETRY 3 HAL_StatusTypeDef SI4731_SendCommand(uint8_t *cmd, uint8_t len) { HAL_StatusTypeDef status; uint8_t retry = 0; do { status = HAL_I2C_Master_Transmit(&hi2c3, SI4731_ADDR_WRITE, cmd, len, 100); if(status == HAL_OK) break; HAL_Delay(1); } while(++retry < MAX_RETRY); return status; }5.2 音频质量提升
原始音频输出存在以下问题:
- 高频段有轻微噪声
- 音量较小时信噪比下降
改进措施:
- 在Si4731输出端增加RC低通滤波(R=1kΩ,C=100nF)
- 采用软件实现的动态范围压缩:
void ApplyCompression(int16_t *audio, uint32_t len, float threshold) { float ratio = 0.5f; // 压缩比 float gain = 1.0f; for(uint32_t i=0; i<len; i++) { float sample = audio[i]; float absSample = fabsf(sample); if(absSample > threshold) { float over = absSample - threshold; gain = 1.0f - (ratio * over / (over + threshold)); sample *= gain; } audio[i] = (int16_t)sample; } }6. 功能扩展思路
基于现有平台,还可以实现更多有趣的功能:
RDS信息解码:
- 解析电台名称(PS)
- 获取实时交通信息(RT)
- 自动时钟同步(CT)
录音功能:
- 利用STM32的QSPI接口连接外部Flash
- 实现定时录音/语音备忘录
网络同步:
- 通过ESP8266模块添加WiFi功能
- 实现网络时间同步
- 在线查询电台节目单
语音控制:
- 集成LD3320语音识别芯片
- 实现"换台"/"音量调节"等语音指令
这个项目最让我满意的是,通过合理利用STM32F765ZI的性能优势,可以在传统收音功能基础上实现许多数字化增强功能。特别是在音频处理方面,Cortex-M7的FPU使得实时音频处理变得非常高效。下一步我计划加入蓝牙音频转发功能,让这个设备可以同时作为蓝牙接收器使用。