ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AC108多麦克风阵列采集芯片:硬件设计要点与Linux驱动解析

AC108多麦克风阵列采集芯片:硬件设计要点与Linux驱动解析 简介面向智能音箱、物联网等音频产品开发者的AC108多麦克风阵列驱动芯片资料合集涵盖从芯片选型到驱动适配的完整环节。资源共23个文件以PDF规格书datasheet、硬件设计指南、用户手册、原理图工程文件DSN/SCH/OPJ以及驱动源码H/C文件为主压缩包约11.97MB结构按brief、datasheet、硬件指南、参考原理图、驱动说明等模块组织。已有969人学习下载。通过这套文档可系统掌握AC108的电气特性、引脚定义、I2C/SPI控制接口配置、多路ADC采样与噪声抑制功能并参照EVB参考原理图完成麦克风阵列电路设计驱动说明中的API接口与示例代码也能帮助开发者快速完成Linux或其他嵌入式平台下的驱动集成与调试。适合正在做多麦克风阵列、语音识别前端硬件设计的工程师参考。1. 项目背景这颗“多mic矩阵驱动芯片”到底是什么来头第一次拿到“AC108多mic矩阵 驱动芯片设计相关文档”这个需求的时候我第一反应是这又是哪个方案商把“麦克风阵列采集芯片”和“驱动芯片”这两个概念揉在一起了。实际看下来AC108并不是传统意义上那种“驱动芯片”——它不驱动喇叭、不驱动电机、不点灯它的本质是一颗4通道的音频ADC模拟前端专门用来把多路数字麦克风主要是PDM接口的MEMS麦的信号转成I2S/TDM数据流送给主控芯片去做语音处理。我在实际项目里接触这颗芯片是因为当时在做一套6麦环形阵列的语音交互模组。主控是瑞芯微的RK3568跑Linux系统需要采集6路麦克风做波束成形和回声消除。市面上做4通道ADC的芯片不少但AC108在这个场景里比较有代表性单颗支持4通道PDM输入输出走I2S/TDM最多可以级联两片实现8通道。对做智能音箱、会议麦克风、机器人语音交互的人来说这套“多mic矩阵采集方案”几乎是绕不开的硬件基准。这篇文档我尽量把话说透AC108在麦克风矩阵里的定位、硬件电路设计要点、Linux下驱动如何对接、以及我在调试中踩过的坑。不管你是刚接触麦克风阵列的硬件工程师还是被分配去调音频驱动的软件同事都能从中找到可以直接抄作业的内容。同时我注意到最新网络热词里有“led闪灯驱动芯片”“带数码管的风扇驱动芯片”。老实说这两类芯片和AC108完全是两个物种——“驱动芯片”这个词放在LED灯和风扇场景里指的是功率驱动、恒流源、PWM控制那一套而AC108承担的是信号采集和格式转换。如果在选型阶段混为一谈很容易买错物料。这篇文档也会顺手帮你梳理清楚这个边界。2. 多mic矩阵的设计思路为什么选AC108而不是其他方案2.1 麦克风阵列对采集芯片的核心需求麦克风阵列和单颗麦克风最大的区别在于后续的波束成形、声源定位、去混响算法全都依赖“多通道信号在时间上严格同步”。如果两路信号之间出现哪怕一两个采样周期的偏差相位差就是错的beamforming的效果会大打折扣。所以选阵列采集芯片第一看通道数第二看同步机制第三看接口是否方便和主控对接。AC108这类芯片之所以在矩阵方案里吃香是因为它把4路PDM麦克风的时钟和数据的同步在芯片内部解决掉了对外只输出一路TDM数据流。主控侧不需要同时处理4路I2S只需要按TDM时隙解包就行。这种架构对Linux alsa驱动和DMA传输都非常友好。另外PDM麦克风本身只有两根线CLK和DATA走线少、成本低适合做密集型阵列。模拟麦克风方案不但每路都要放大电路和ADC通道而且模拟走线对PCB布局要求极高——在6麦环形阵这种空间紧凑的场景里很容易翻车。AC108这类数字前端芯片的价值就是把“模拟前端ADCTDM串行化”打包成一颗物料硬件设计的工作量直接少了一半。2.2 和LED、风扇驱动芯片的本质区别既然热词把“驱动芯片”带到了这个项目里我还是想多说一句。LED闪灯驱动芯片的核心是恒流驱动、PWM调光、灰度刷新输出的是功率信号风扇驱动芯片的核心是电机换相、堵转保护、转速反馈输出的是三相驱动波形。它们的共同点是“驱动外部执行器”属于功率链路的末端。AC108的工作链路刚好相反它从麦克风采集微弱的数字脉冲流做抽取滤波后将音频PCM数据通过I2S/TDM传给主控。它属于信号链路的源头不是功率链路。说它“驱动”麦克风其实只是提供PDM时钟功耗极其有限。如果你在搜“驱动芯片设计相关文档”时带着LED驱动或风扇驱动的资料预期建议先调整方向——声学前端芯片和功率驱动芯片的参数维度完全不同后面设计电路时的参考系也不一样。2.3 方案选型对比与取舍我在确定方案的时候其实对比过几个常见选项双I2S接口的MCU直采方案、四通道模拟ADC方案、以及AC108级联方案。前两种要么通道数不够要么模拟前端设计太重。AC108的优势在于它本身就是为“多mic”设计的级联能力让它可以平滑扩展到8通道甚至更多。具体到通道分配我当时用的是两片AC108级联一片负责麦克风03另一片负责麦克风47最后输出TDM8格式的数据流。这样主控侧只需要一个I2S控制器、一条TDM总线就能吃下8个通道非常干净。3. AC108核心细节解析与硬件实操要点3.1 芯片关键配置与引脚功能AC108的引脚不算复杂但有几个关键点需要提前盯住I2C地址芯片上电后通过I2C配置默认地址是0x4C7位地址。如果板子上挂多片可以通过ADDR引脚调整地址避免I2C总线冲突。PDM时钟与数据每颗芯片有两组PDM输入每组支持两路数据线PDM_IN0/PDM_IN1时钟由芯片内部产生也可以由外部主控提供。多数情况下让AC108自己当主设备输出BCLK和WCLK这样省事。TDM输出引脚I2S_OUT输出TDM格式数据BCLK和WCLK既可以由AC108产生也可以由主控作为master提供。两种模式我都试过实际更推荐让主控做master这样级联时时钟相位更容易对齐。参考电压与电源模拟部分建议用低纹波的LDO供电数字部分和IO可以共用3.3V。参考电压引脚上的去耦电容不要省我见过有板子因为这里少放了一颗0.1uF的电容导致THDN指标明显变差。3.2 典型电路设计要点一个典型的AC108多mic矩阵电路大致可以拆成几个模块。我直接给一份我在项目中验证过的连接关系方便你对照画图电源模块3.3V LDO分别给AVDD和DVDD供电磁珠隔离退耦电容每引脚至少放0.1uF和10uF各一颗PDM麦克风连接每个麦克风的CLK并联到AC108的PDM_CLKDATA分别接到PDM_IN0/PDM_IN1注意麦克风的L/R选择引脚决定它在这个时钟沿还是另一个时钟沿输出数据主控接口I2C用于配置寄存器TDM数据线连接到主控的I2S RX引脚BCLK/WCLK由主控输出级联通路如果两片级联第二片的TDM输出通过一个简单的电阻网络合并到第一条TDM总线或者在软件上配置第二片使用不同的时隙组。这里我之前踩过一个坑PDM麦克风的DATA引脚在PCB上不要走太长也不要跨分割。这类数字信号虽然频率不高但上升沿很陡一旦走线过长信号反射会造成采样数据偶发错误表现就是语音里有“咔哒”声。初期打样可以把PDM走线控制在5cm以内并且做好包地。3.3 硬件设计中的常见细节坑TDM时隙冲突级联时如果两片芯片的TDM时隙配置重叠主控收到的数据会混在一起。解决方法是先读回寄存器确认配置再用逻辑分析仪或者音频数据分析工具看每个时隙的内容。I2C地址冲突如果板子上已经有其他I2C设备占用0x4C地址记得通过ADDR引脚修改AC108的地址否则上电枚举时会跳设备或者配置写失败。参考电压的电容值不能随意换有同事为了节省BOM把参考电压的退耦电容从10uF改成1uF结果底噪抬高了大概3dB。这类模拟性能相关的物料严格按照规格书来是最稳妥的。4. Linux下驱动设计与采集链路搭建4.1 从ASoC框架理解AC108的驱动角色在Linux音频框架里AC108通常被实现为一个“codec driver”注册进ASoC子系统尽管严格来说它是ADC前端并没有DAC功能。对主控而言这一侧的软件逻辑非常简单通过I2C配置芯片使其输出指定格式的TDM数据主控侧dai_link配置为“CPU侧I2S控制器 ↔ codec侧AC108”底层用dmaengine接收数据。关键的dai_link配置大致长这样static struct snd_soc_dai_link my_board_dai_link { .name AC108-MIC, .stream_name AC108-Capture, .cpu_dai_name i2s0, .codec_dai_name ac108-hifi, .codec_name ac108.0-004c, .platform_name rk3568-i2s0, .ops my_board_ops, };这里最容易搞混的是.codec_name的格式要和设备树里i2c设备的label保持一致否则probe阶段就会失败。很多人一开始写成AC108系统根本找不到设备直接报ASoC: failed to instantiate card。4.2 设备树与TDM时隙映射设备树里除了i2c节点更重要的是设置I2S控制器的TDM模式和时隙数。AC108支持TDM4/TDM8如果单颗芯片接4路麦克风可以配置为TDM4模式每个时隙对应一路麦克风两片级联则配置为TDM8前4个时隙给第一片后4个给第二片。设备树片段参考i2s0 { status okay; pinctrl-names default; pinctrl-0 i2s0_lrck, i2s0_bclk, i2s0_sdo; rockchip,tdm-mode 1; /* 1表示TDM模式 */ rockchip,i2s-tdm-slots 8; /* 8个时隙 */ };时钟配置方面声卡的mclk一般取22.5792MHz或24.576MHz44.1k和48k系列采样率可以分别对齐。AC108的主时钟优先级不高实际项目中我更多是让它跟随I2S的BCLK来工作减少一个时钟源的管理成本。4.3 采样率与通道数配置应用层通过ALSA录制时需要让格式和芯片配置保持一致。比如8通道采样时arecord的命令行参数要设置成arecord -D hw:0,0 -f S32_LE -r 48000 -c 8 -t wav capture.wavAC108内部会做PDM抽取滤波输出的PCM格式是24bit还是32bit取决于寄存器配置。我习惯统一输出为32bit宽度但实际有效数据靠左对齐这样DMA搬运和内存对齐都省心。需要注意的是如果应用层用16bit格式录音音量会偏低因为数据的高位部分被截掉了听起来就是“声音小外加底噪明显”。5. 实操过程从板子到手到稳定采集的完整记录5.1 首次上电与I2C寄存器验证板子打样回来之后第一步不是跑系统而是先用I2C工具确认芯片在线。先把设备树里的音频节点都关掉只保留I2C控制器和AC108节点然后在系统里执行i2cdetect -y 2正常情况下能扫描到0x4c这个地址。如果扫描不到优先检查I2C上拉电阻和电源。接着用i2ctransfer读写一次寄存器确认通信正常。AC108有个chip id寄存器默认值应该是0x2860之类具体可以参考规格书最好读一次并记录下来作为后续排查硬件的依据。5.2 配置采集链路并验证数据正确性I2C通信正常后打开音频设备节点。先不要马上就跑算法先用一条直白的录音命令抓一段环境声保存成wav文件然后在电脑上用Audacity或者Python的soundfile库看波形。更直接的方法是对着某个方向的麦克风说话看对应通道的波形是否明显大于其他通道以此验证通道映射是否正确。实际操作中我遇到过左声道和右声道对调的情况。原因是在PDM麦克风的L/R选择引脚上我把左右两颗麦克风的设置接反了。解决方法是调换PCB上L/R的电平设置或者在驱动层面重映射TDM时隙——不建议软件改时隙映射因为会掩盖硬件问题后续维护很痛苦。5.3 级联模式下通道时隙的确认两片AC108级联时最容易出现的现象是录下来8个通道但只有4个通道有数据另外4个通道全是静音或者重复数据。排查时直接读两片芯片的TDM slot配置寄存器确认第一片输出slot0~3第二片输出slot4~7。如果时隙配置没问题再看两片芯片的BCLK/WCLK是否来自同一时钟源。我在一个项目里遇到过两片芯片分别挂在两个I2S控制器上各自产生时钟结果采样率轻微偏差导致通道数据周期性错位。最后把级联模式改成“主从同步”让第二片跟随第一片的时钟问题立刻消失。6. 常见问题与调试心得实录6.1 典型问题速查表问题现象可能原因排查方向I2C扫描不到设备电源/上拉电阻/地址冲突用万用表量AVDD/DVDD检查上拉到VDD的电阻是否焊好ADDR引脚电平是否被拉偏录音全为静音PDM时钟没起来/时隙配置错示波器量PDM_CLK确认I2S的BCLK/WCLK波形查TDM slot配置部分通道无数据麦克风L/R接反/时隙映射错单独测试每颗麦克风的DATA引脚修改L/R设置或时隙映射语音有“咔哒”声PDM走线过长/电源纹波大缩短PDM走线在麦克风供电处加RC滤波检查参考电压退耦电容音量偏小应用层采样格式位宽比实际小录音格式改为S32_LE检查AC108输出位宽寄存器配置TDM数据错位两片数据混叠时钟不同步/时隙重叠统一时钟源配置主从级联逐片验证时隙内容6.2 一次真实的“爆音”排查经历有次测试时发现设备运行十几分钟后录音会突然出现持续“咔哒”声重启又正常。一开始我怀疑是DMA丢数据查了半天dmaengine的配置结果发现是AC108芯片温度升高后内部锁相环失锁导致PDM时钟抖动。解决办法居然很简单把芯片附近的散热铜皮加大同时在I2S的mclk上加了一颗22Ω电阻抑制过冲问题就没再出现。这类问题在文档里很难找到现成答案更像是一个“经验毅力”的排查过程。我的体会是模拟/混合信号芯片的很多诡异现象优先怀疑电源和时钟不要一上来就怀疑驱动代码。6.3 几个少有人提的细节PDM麦克风的DATA引脚要避免浮空不用的数据通道最好通过电阻拉到GND否则芯片内部可能检测到随机脉冲导致本应静音的通道出现噪声。TDM模式的槽位宽度和采样率有关系如果采样率提高到96kHz槽位宽度和BCLK频率要重新算直接沿用48kHz配置可能导致数据错位。不要忽略主控I2S控制器的FIFO水位如果DMA中断延迟过大I2S FIFO会溢出现象就是每过一段时间就掉几个采样点。这种问题可以通过提高DMA优先级或者调整FIFO阈值来缓解。7. 应用场景扩展与个人体会AC108这套方案我实际用下来感觉最适合的项目类型是6到8通道以内的麦克风阵列语音产品尤其是对成本敏感、PCB面积受限的设备。它的上限比较明确——8通道、TDM输出、I2C配置——做不了更高通道数的场合。如果你要上16通道甚至更多不如直接看带多路TDM输入的DSP或者更高阶的音频采集芯片组。但话说回来8通道已经能应付绝大多数智能音箱、会议全向麦、车载语音交互的场景了。我自己的体会是选这类“小封装、多功能”的芯片最忌讳只看规格书参数不看驱动生态和调试便利性。AC108的Linux驱动在社区里很常见很多主流主控平台的BSP里都直接带了适配这一点比一些冷门芯片省心太多。遇到问题时搜索AC108或它的兼容型号能找到不少现成的解决方案。最后分享一个我个人的选型习惯评估任何一颗“类似AC108”的芯片前先画一张“芯片做了什么主控做了什么软件要做什么”的职责划分图。如果芯片能把模拟采集、滤波、串行化都打包好而且能用标准I2S直接接入主控这类芯片在集成阶段通常都比较顺利。反之如果把太多工作丢给主控和驱动开发者即使芯片本身性能再好落地成本也会让你怀疑人生。做麦克风阵列也好做音频前端也罢芯片只是整个链路的一部分。真正决定产品体验的还是你对信号链路的理解深度和对细节的把握程度。希望这篇围绕AC108的拆解和复盘能帮你少走几步弯路。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进