资讯详情

基于SI4835与STM32的多波段收音机DIY:硬件设计、I2C通信与调谐优化

📅 2026/9/24 15:38:27 | 华诺云谱 👁 阅读
基于SI4835与STM32的多波段收音机DIY:硬件设计、I2C通信与调谐优化
1. 项目缘起与整体设计思路1.1 为什么选择SI4835这颗芯片做收音机DIY这件事圈子里一直有两派一派玩老式模拟电路追求那种空气联调谐的手感和蓬蓬声另一派走数字路线用DSP芯片做锁相环调谐追求稳定和便携。我这次选的是后者核心就是SI4835这颗芯片。SI4835是Silicon Labs推出的一款集成度非常高的AM/FM/SW/LW多波段接收芯片。它把从射频前端到音频输出的整条链路都塞进了一个小小的QFN封装里外面只需要配几个电感电容和一颗主控MCU就能跑起来。相比传统的超外差电路它的优势非常明显不需要中周变压器、不需要手工绕制本振线圈、不需要统调装好了通电就能收到台。对于我这种既想折腾硬件又不想在调试上耗掉半条命的人来说这几乎是唯一合理的选择。这颗芯片支持的波段覆盖了FM 64–108 MHz、AM 520–1710 kHz、SW 2.3–26.1 MHz以及LW 153–279 kHz。注意FM频段的下限是64 MHz这意味着它能覆盖一些地区的校园广播和部分特殊频段比普通收音机芯片的87–108 MHz要宽不少。短波覆盖到26 MHz基本上把常用的国际短波广播波段都包进去了。1.2 系统架构的取舍整个项目的架构可以拆成四块射频接收、主控控制、人机交互、音频输出。射频接收部分由SI4835独立完成它内部集成了LNA、混频器、中频滤波、ADC和DAC。外部只需要接天线、波段切换的电感网络和一颗32.768 kHz的参考晶振。这里有个细节值得展开SI4835的波段切换不是靠软件改寄存器实现的而是靠外部电感值的不同组合来切换。芯片内部有一个多路复用器会根据你给到特定引脚上的电感值来选择对应的接收频段。所以你在电路上会看到一组电感和电容组成的网络通过波段开关来切换不同的LC组合。主控我选的是STM32F103C8T6也就是大家常说的“蓝板”或“最小系统板”。选它的理由很直接便宜、资料多、GPIO够用、I2C和SPI都齐全。SI4835通过I2C总线和主控通信主控负责初始化芯片、设置频率、读取RSSI信号强度、控制音量。STM32F103的I2C外设虽然有一些已知的勘误但在100 kHz的标准模式下跑SI4835完全够用不需要上DMA。人机交互部分我用了一个旋转编码器加一个0.96寸OLED屏幕。编码器用来调频率和音量OLED显示当前波段、频率和信号强度。这里没有用传统的电位器和波段开关旋钮原因是我希望频率调节能做到精确到1 kHz步进机械电位器做不到这个精度。OLED用SSD1306驱动I2C接口和SI4835共用一条总线通过不同的从机地址区分。音频输出部分SI4835的音频输出是单端信号幅度大约在几百毫伏级别直接接耳机能听到但推力不够。我加了一颗PAM8403功放芯片3W双声道输出推小喇叭绰绰有余。如果你只想接耳机可以省掉功放但建议加一个RC低通滤波网络把DAC输出端的高频噪声滤掉听感会干净很多。1.3 为什么不用现成的收音机模块市面上有很多现成的收音机模块比如TEA5767、RDA5807这些价格便宜、接口简单。但它们的频段覆盖有限通常只有FM而且灵敏度在弱信号环境下表现一般。SI4835的优势在于多波段覆盖和更好的灵敏度尤其是在短波波段它的内部AGC和自动增益控制做得相当不错。另外SI4835支持RDS解码在FM波段虽然这个项目里我没有用到RDS功能但硬件上留了扩展空间。从DIY的角度看用SI4835的另一个好处是它的寄存器配置相对简单不需要复杂的初始化序列。上电后通过I2C写入几个关键寄存器设置好波段和频率芯片就能开始工作。相比之下一些DSP收音机芯片需要加载固件补丁对主控的存储空间有要求STM32F103C8T6的64KB Flash虽然够用但会占用不少空间。2. 核心细节解析与实操要点2.1 SI4835的引脚功能与外围电路设计SI4835采用24引脚QFN封装引脚间距0.5mm手工焊接难度不小。我建议要么用热风枪要么直接买已经焊好的转接板。芯片的关键引脚包括电源引脚VDD、AVDD、地引脚GND、AGND、I2C通信引脚SDA、SCL、音频输出引脚AOUT、以及波段切换引脚BAND1、BAND2。波段切换的逻辑是这样的BAND1和BAND2两个引脚的不同电平组合对应四个波段。具体来说BAND10、BAND20对应FMBAND11、BAND20对应AMBAND10、BAND21对应SWBAND11、BAND21对应LW。但这里有个坑芯片内部并不是直接根据这两个引脚的电平来切换波段的而是根据连接到这两个引脚上的电感值。数据手册里给出了每个波段对应的推荐电感值FM波段用0.22μHAM波段用1.2mHSW波段用22μHLW波段用2.2mH。如果你直接给高低电平而不接电感芯片可能无法正确识别波段。外围电路里最关键的几个元件参考晶振用32.768 kHz的圆柱体晶振负载电容建议用12pF电源部分需要加LC滤波尤其是AVDD引脚建议用10μH电感和100nF电容组成π型滤波天线输入部分FM波段可以用一根75cm左右的导线AM和SW波段建议用磁棒天线或环形天线。注意SI4835的电源电压范围是2.7V到5.5V但音频输出的动态范围会随电压变化。如果你用3.3V供电音频输出幅度大约在1Vpp左右用5V供电可以到1.8Vpp。我建议用5V供电后级功放的推力会更足。2.2 STM32主控的I2C通信配置STM32F103C8T6的I2C1外设挂在PB6SCL和PB7SDA上。配置步骤大致如下使能GPIOB和I2C1的时钟配置PB6和PB7为复用开漏输出模式设置I2C的时钟频率为100 kHz使能I2C外设。这里有一个常见的坑STM32F103的I2C外设在某些情况下会出现总线锁死的问题尤其是在从机没有及时响应的时候。解决方法是在初始化时加上总线恢复逻辑或者在I2C读写函数里加超时机制。SI4835的I2C从机地址是0x227位地址写操作时地址字节是0x44读操作时是0x45。芯片的寄存器是8位地址、8位数据支持单字节读写和连续读写。初始化流程是这样的上电后等待至少100ms然后依次写入几个关键寄存器。首先是0x01寄存器设置波段和调谐模式然后是0x02寄存器设置音量最后是0x03寄存器设置频率。频率的设置需要计算分频值公式在数据手册里有详细说明。以FM波段为例假设你要调谐到98.5 MHz计算过程是这样的首先确定参考频率SI4835在FM波段的参考频率是32.768 kHz除以一个固定的分频系数具体值取决于你选择的调谐步进。如果步进是100 kHz那么分频系数是32768/100327.68取整后是328。然后计算分频值98.5 MHz除以100 kHz等于985再乘以328等于323080。这个值需要拆成高字节和低字节分别写入寄存器。实际写代码的时候我会把这个计算封装成一个函数输入频率值输出两个字节的配置数据。2.3 旋转编码器的消抖与步进控制旋转编码器我用的是EC11带按键功能的那种。它的A、B两相输出是正交信号通过检测相位差来判断旋转方向。STM32这边我用外部中断来捕获A相的边沿然后在中断里读取B相的电平如果B相和A相电平相同就是顺时针不同就是逆时针。这里有一个非常关键的细节机械编码器的触点抖动非常严重如果不做消抖处理转一格可能会触发好几次中断。我的做法是在中断里加一个时间戳如果两次中断的时间间隔小于5ms就忽略后一次。这个方法简单有效实测下来转动手感很跟手不会出现跳频或者反向的问题。步进控制方面我设置了两种模式快速模式和精细模式。快速模式下每转一格频率变化100 kHz精细模式下每转一格变化1 kHz。切换方式是按一下编码器的按键。这个逻辑在代码里用一个状态变量来管理按键中断里翻转这个变量调谐函数里根据变量值选择不同的步进。实操心得编码器的A、B相最好接上拉电阻STM32的内部上拉电阻阻值偏大在长导线连接时可能导致信号边沿变缓。我一开始用内部上拉转快了会丢步后来换成4.7kΩ的外部上拉问题就解决了。2.4 OLED显示驱动的优化OLED我用的是SSD1306驱动的0.96寸屏128x64分辨率I2C接口。这个屏的驱动库网上很多我直接用了Adafruit的SSD1306库移植到STM32的HAL库上。显示内容分三行第一行显示当前波段FM/AM/SW/LW第二行显示频率比如98.50 MHz第三行显示信号强度用RSSI值转成0-100的百分比。刷新策略上我没有用全屏刷新而是只刷新变化的部分。全屏刷新在I2C总线上要传1024字节的数据在100 kHz的时钟下需要大约100ms会导致调谐时有明显的卡顿感。改成局部刷新后每次只更新频率那一行的十几个字符刷新时间降到10ms以内手感就顺滑多了。信号强度的显示我加了一个简单的滑动平均滤波每200ms采样一次RSSI取最近5次的平均值。这样显示出来的信号强度不会因为瞬间的干扰而剧烈跳动看起来更稳定。3. 实操过程与核心环节实现3.1 硬件焊接与调试步骤整个项目的硬件部分我分成三块板子来做主板、控制板和功放板。主板放SI4835和它的外围电路控制板放STM32和OLED功放板放PAM8403。三块板之间用排针和杜邦线连接方便调试和更换。焊接顺序上我建议先焊电源部分确认3.3V和5V都正常之后再焊SI4835。SI4835的QFN封装焊接是个难点我的做法是先在焊盘上涂一层薄薄的锡膏把芯片放上去对准然后用热风枪在芯片上方2cm处来回移动温度设在280°C看到锡膏融化后轻轻用镊子碰一下芯片它会自动归位。焊完之后用放大镜检查引脚有没有连锡特别是相邻的引脚。上电之前一定要做的一件事用万用表测一下VDD和GND之间的电阻正常应该在几百欧姆以上。如果接近0欧姆说明有短路必须先排除再上电。我有个朋友就是没测直接上电结果SI4835冒烟了一颗芯片几十块钱就这么没了。上电后的第一步是测晶振有没有起振。用示波器探头10x档碰一下晶振引脚应该能看到32.768 kHz的正弦波幅度大约1Vpp。如果没有起振检查负载电容是否焊错或者晶振本身是不是坏的。晶振起振之后用逻辑分析仪抓一下I2C总线看看STM32有没有正确发出初始化命令。如果没有检查I2C的上拉电阻和地址配置。3.2 软件框架与关键代码解析软件部分我用的是STM32CubeMX生成初始化代码然后手写应用逻辑。主循环的结构很简单初始化外设然后进入一个while(1)循环在循环里轮询编码器状态、更新OLED显示、处理按键事件。I2C读写和频率计算都封装成了独立的函数。频率设置函数的核心逻辑是这样的void SI4835_SetFrequency(uint32_t freq_khz, uint8_t band) { uint32_t divider; uint16_t reg_val; switch(band) { case BAND_FM: divider 328; // 32.768kHz / 100kHz reg_val (freq_khz / 100) * divider; break; case BAND_AM: divider 32; // 32.768kHz / 1kHz reg_val freq_khz * divider; break; case BAND_SW: divider 32; reg_val freq_khz * divider; break; default: return; } uint8_t data[2]; data[0] (reg_val 8) 0xFF; data[1] reg_val 0xFF; SI4835_WriteReg(0x03, data, 2); }这段代码里有个细节需要注意AM和SW波段的频率单位是kHz而FM波段我习惯用kHz来表示比如98.5 MHz写成98500 kHz。在计算分频值的时候FM波段要先除以100得到以100kHz为单位的数值再乘以分频系数。AM和SW波段直接乘以分频系数就行。RSSI读取函数也很简单读0x04寄存器返回一个0-255的值。这个值越大表示信号越强但不同波段的RSSI范围不一样。FM波段在强信号下能到200以上AM波段通常只有几十。所以我在显示的时候做了一个归一化处理把RSSI值映射到0-100的百分比。3.3 波段切换的硬件实现波段切换我用了一个4档的旋转开关每一档对应一个波段。开关的公共端接SI4835的BAND1和BAND2引脚每一档通过不同的电感值连接到这两个引脚。具体接法是这样的FM档BAND1和BAND2都通过0.22μH电感接地AM档BAND1通过1.2mH电感接VDDBAND2通过1.2mH电感接地SW档BAND1通过22μH电感接地BAND2通过22μH电感接VDDLW档两个引脚都通过2.2mH电感接VDD。这里有个容易搞错的地方电感的值不是随便选的必须按照数据手册推荐的来。我一开始手头没有1.2mH的电感用1mH的代替结果AM波段能收到台但灵敏度明显下降。后来换了精确值的电感灵敏度就上来了。所以这个电感值不能凑合该买什么就买什么。波段开关的机械结构也要注意旋转开关的触点如果氧化了会导致接触不良表现为某个波段收不到台或者声音断续。我建议用密封型的旋转开关或者在触点上涂一点电子接点复活剂。3.4 音频通道的调试与优化音频通道的调试我花了比较多时间。最初的设计是SI4835的AOUT引脚直接接PAM8403的输入结果发现底噪比较大尤其是调谐到没有电台的频率时能听到明显的沙沙声。分析下来有两个原因一是SI4835的DAC输出本身有一定的量化噪声二是PAM8403的输入阻抗和SI4835的输出阻抗不匹配。解决方法是在AOUT和PAM8403之间加一个RC低通滤波网络截止频率设在15 kHz左右。具体参数是1kΩ电阻串联100nF电容对地。这样可以把DAC输出端的高频噪声滤掉同时不影响音频信号的带宽。加了这个滤波网络之后底噪明显降低听感干净了很多。另外PAM8403的增益设置也很重要。它默认的增益是20dB对于SI4835的输出电平来说有点高容易导致大音量时削波失真。我把增益电阻换成10kΩ增益降到10dB左右失真就消失了。如果你用的是耳机可以省掉PAM8403但建议加一个100Ω的串联电阻和10μF的隔直电容保护耳机的同时也滤掉直流分量。4. 常见问题与排查技巧实录4.1 收不到台或灵敏度低这是最常见的问题排查思路可以按照信号链路从后往前查。首先确认音频通道是否正常用手碰一下AOUT引脚如果喇叭里有嗡嗡声说明功放和喇叭没问题。然后确认I2C通信是否正常用逻辑分析仪抓一下SDA和SCL看看STM32有没有发出正确的初始化命令。如果I2C没有波形检查上拉电阻和地址配置。如果I2C正常但收不到台重点检查天线和波段切换电路。天线方面FM波段用一根75cm的导线就够了但AM和SW波段必须用磁棒天线或环形天线随便接一根导线是收不到台的。波段切换方面用万用表测一下BAND1和BAND2引脚对地的电感值确认和当前波段匹配。如果电感值不对检查旋转开关的接线和电感本身是否损坏。还有一个容易被忽略的点SI4835的参考晶振频率必须准确。如果晶振偏差太大比如实际频率是32.700 kHz而不是32.768 kHz会导致调谐频率偏移表现为明明显示98.5 MHz但实际收到的台在98.3 MHz。用频率计测一下晶振频率偏差超过100ppm就换一颗。4.2 I2C通信失败STM32F103的I2C外设有一个著名的硬件缺陷在某些时序条件下会出现总线锁死表现为SCL被从机拉低不放主机无法继续通信。解决方法有两个一是用软件I2C代替硬件I2C用GPIO模拟时序虽然速度慢一点但稳定性好很多二是在硬件I2C的基础上加总线恢复逻辑检测到SCL持续为低超过10ms就手动切换SCL为推挽输出发送9个时钟脉冲把从机状态机复位。我一开始用的是硬件I2C调试的时候偶尔会遇到锁死后来改成软件I2C就再也没出现过。软件I2C的代码很简单就是手动控制GPIO的高低电平延时用__NOP()或者简单的循环实现。在100 kHz的速率下STM32F103跑72MHz主频每个时钟周期大约需要720个NOP实际写的时候用循环延时就行。避坑技巧软件I2C的延时不要用HAL_Delay那个是毫秒级的太慢了。用for循环做微秒级延时循环次数根据主频调整。我实测下来72MHz主频下for(i0;i10;i)大约延时1μsI2C的半个时钟周期用5μs延时对应100 kHz的速率。4.3 调谐时有杂音或跳频这个问题通常和编码器有关。机械编码器的触点抖动会导致一次旋转触发多次中断表现为频率跳变或者反向。解决方法前面提到了在中断里加时间戳消抖。但还有一个隐藏问题如果编码器的A、B相接线太长或者没有屏蔽会引入外部干扰导致误触发。我的做法是把编码器的连线绞在一起并且尽量短超过10cm就加屏蔽层。另外调谐时的杂音可能来自电源。SI4835对电源噪声比较敏感尤其是AVDD引脚。如果电源纹波比较大调谐时会有咔咔声。解决方法是在AVDD引脚附近加一个10μF的钽电容和一个100nF的陶瓷电容组成两级滤波。如果还不行考虑用独立的LDO给SI4835供电和STM32的电源分开。4.4 常见问题速查表问题现象可能原因排查方法解决方法完全无声电源未接通或功放损坏测VDD电压碰AOUT听嗡嗡声检查电源更换功放收不到台天线未接或波段错误检查天线测BAND引脚电感接天线换正确电感频率偏移晶振频率不准用频率计测晶振更换晶振I2C锁死硬件I2C缺陷测SCL是否持续为低改软件I2C或加恢复逻辑调谐跳频编码器抖动示波器看A相波形加消抖或换编码器底噪大电源纹波或滤波不足示波器看AVDD纹波加LC滤波换LDO声音失真功放增益过高测AOUT幅度降低功放增益某波段无声波段开关接触不良测开关通断清洁或更换开关4.5 进阶优化与扩展思路如果你已经完成了基本功能想让这个收音机更好用有几个方向可以折腾。第一个是加RDS解码SI4835在FM波段支持RDS可以读出电台名称和节目类型。RDS数据是通过I2C读取的需要解析特定的数据包格式代码量不大但需要仔细对照数据手册。第二个是加频率存储功能用STM32内部的Flash模拟EEPROM把常用的频率存下来开机自动恢复。STM32F103C8T6有64KB Flash划出1KB来做存储绰绰有余。存储格式可以很简单每个频率占4个字节前两个字节是频率值第三个字节是波段第四个字节是音量。第三个是加自动搜台功能通过扫描整个波段记录RSSI超过阈值的频率点然后依次存储。这个功能的难点在于扫描速度如果每个频点都等RSSI稳定再判断扫完整个FM波段需要好几秒。我的做法是快速扫描每个频点只读一次RSSI然后对RSSI序列做峰值检测找出所有的电台频率。实测下来扫完FM波段大约需要2秒可以接受。第四个是改天线原装的拉杆天线在短波波段效果一般可以换成环形天线或者长线天线。短波波段对天线的要求比较高一根十几米的长线天线加上天调接收效果会有质的提升。不过这个就属于另一个坑了有兴趣的可以单独折腾。最后分享一个我在调试过程中总结的小技巧如果你不确定问题出在硬件还是软件可以先用一个已知良好的SI4835模块替换你的自制板如果问题消失说明是硬件问题如果问题依旧说明是软件问题。这个方法可以快速定位问题范围省去很多瞎猜的时间。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。