字麥克風(fēng)從零跑通:AD2428主從配置與SigmaStudio實(shí)戰(zhàn))
1. 為什么我要折騰A2B數(shù)字麥克風(fēng)這套方案車載音頻和工業(yè)音頻采集這兩年在快速往“全數(shù)字鏈路”方向走模擬麥克風(fēng)加長(zhǎng)線纜的方案在抗干擾、布線重量、通道擴(kuò)展性上越來(lái)越吃力。A2BAutomotive Audio Bus就是在這個(gè)背景下被大量采用的一根非屏蔽雙絞線同時(shí)跑音頻數(shù)據(jù)、控制信號(hào)和供電主機(jī)端掛一顆AD2428WD做主控遠(yuǎn)端掛AD2428WC做從板從板上再接數(shù)字MEMS麥克風(fēng)整條鏈路從麥克風(fēng)到SoC全程數(shù)字中間沒(méi)有ADC也沒(méi)有模擬走線。這套架構(gòu)在車載麥克風(fēng)陣列、主動(dòng)降噪、車內(nèi)語(yǔ)音交互里非常常見(jiàn)。但問(wèn)題也很現(xiàn)實(shí)A2B的配置不像I2S那樣接幾根線就能出聲。它需要在SigmaStudio里把主從節(jié)點(diǎn)、總線拓?fù)洹r(shí)鐘、麥克風(fēng)PDM接口、TDM輸出槽位全部配對(duì)任何一處對(duì)不上現(xiàn)象就是“數(shù)字麥克風(fēng)陣列沒(méi)聲音”——這也是我在論壇和群里被問(wèn)得最多的一句話。這篇內(nèi)容就是把我用AD2428WD-EVB做主控、AD2428WC-EVB做從板從零把一顆數(shù)字MEMS麥克風(fēng)跑通的完整過(guò)程寫下來(lái)包括SigmaStudio里每一步為什么這么配、參數(shù)怎么算、沒(méi)聲音時(shí)怎么一層層排查。適合誰(shuí)看剛接觸A2B、手里有這兩塊EVB或者類似板子的嵌入式/音頻工程師做過(guò)I2S麥克風(fēng)但沒(méi)碰過(guò)A2B的以及被“陣列沒(méi)聲音”卡住想找排查思路的人。我會(huì)盡量把SigmaStudio里那些看起來(lái)像黑盒的選項(xiàng)講清楚讓你配完之后知道自己在配什么而不是照抄截圖。2. A2B鏈路整體設(shè)計(jì)與方案選型思路2.1 為什么是主控AD2428WD加從板AD2428WC這套組合先理清楚這兩塊板子的角色。AD2428WD-EVB是主節(jié)點(diǎn)Master/Node 0它通常通過(guò)USBi或者板載的SPI/I2C接口跟PC上的SigmaStudio通信同時(shí)它負(fù)責(zé)給整條A2B總線提供主時(shí)鐘superframe的同步源并把從總線上收上來(lái)的音頻通過(guò)TDM/I2S吐給后端的SoC或DSP。AD2428WC-EVB是從節(jié)點(diǎn)Slave它掛在總線的下游負(fù)責(zé)給本地掛的麥克風(fēng)提供PDM時(shí)鐘、把PDM數(shù)據(jù)轉(zhuǎn)成A2B總線上的音頻流往上送。選這套組合的核心原因是AD2428本身支持PDM麥克風(fēng)直連從板的PDM接口可以直接接數(shù)字MEMS麥克風(fēng)不需要額外的codec。相比“從板接一顆ADC再轉(zhuǎn)I2S”的方案PDM直連省掉了一級(jí)轉(zhuǎn)換時(shí)鐘由A2B從節(jié)點(diǎn)統(tǒng)一派生相位一致性更好——這對(duì)麥克風(fēng)陣列做波束成形非常關(guān)鍵因?yàn)殛嚵兴惴ǔ缘木褪峭ǖ篱g嚴(yán)格的采樣同步。提示AD2428WD和AD2428WC在芯片功能上高度一致主要差別在EVB的接口配置和出廠默認(rèn)的節(jié)點(diǎn)角色。別想當(dāng)然認(rèn)為“WD一定是主、WC一定是從”角色是SigmaStudio里配出來(lái)的板子只是提供了對(duì)應(yīng)的接口。2.2 總線拓?fù)渑c供電方式的選擇A2B支持多種拓?fù)潼c(diǎn)對(duì)點(diǎn)、菊花鏈daisy-chain、分支。我這次用的是最基礎(chǔ)的點(diǎn)對(duì)點(diǎn)主控直接連從板一根雙絞線搞定。為什么先用點(diǎn)對(duì)點(diǎn)因?yàn)榕挪殡A段變量越少越好。菊花鏈一旦中間某個(gè)節(jié)點(diǎn)配置錯(cuò)了后面所有節(jié)點(diǎn)全啞定位成本翻倍。等點(diǎn)對(duì)點(diǎn)跑通、麥克風(fēng)出聲了再往菊花鏈擴(kuò)展心里有底。供電上A2B總線是“總線供電”bus power的主節(jié)點(diǎn)通過(guò)雙絞線給從節(jié)點(diǎn)供電從節(jié)點(diǎn)再給本地麥克風(fēng)供電。這里有個(gè)容易忽略的點(diǎn)總線供電能力有限如果你在從板上掛多顆麥克風(fēng)或者麥克風(fēng)功耗偏大要算一下總電流別超過(guò)主節(jié)點(diǎn)的供電上限否則現(xiàn)象是“配置全對(duì)但就是不出聲”或者時(shí)好時(shí)壞。我實(shí)測(cè)單顆MEMS麥克風(fēng)典型幾百微安完全沒(méi)壓力但如果你掛4顆以上建議單獨(dú)給從板輔助供電別硬扛。2.3 時(shí)鐘與采樣率的規(guī)劃A2B的音頻是裝在superframe里傳輸?shù)膕uperframe的速率和采樣率、通道數(shù)直接掛鉤。規(guī)劃順序應(yīng)該是先定麥克風(fēng)的PDM時(shí)鐘再定A2B的采樣率最后核對(duì)superframe能不能裝下你要的通道數(shù)。數(shù)字MEMS麥克風(fēng)的PDM時(shí)鐘通常在1MHz到3.2MHz之間輸出的是1bit PDM流經(jīng)過(guò)從節(jié)點(diǎn)內(nèi)部的抽取濾波器decimation filter變成PCM。抽取比決定了最終PCM采樣率。比如PDM時(shí)鐘2.048MHz抽取比64得到32kHz PCM抽取比32得到64kHz。這個(gè)關(guān)系一定要在配之前算清楚因?yàn)镾igmaStudio里填錯(cuò)一個(gè)數(shù)出來(lái)的采樣率就不是你想要的后端SoC按48kHz去讀32kHz的數(shù)據(jù)聲音會(huì)變調(diào)或者直接判為無(wú)效幀。我這次的目標(biāo)是48kHz、單通道先跑通所以PDM時(shí)鐘和抽取比按能整除到48kHz的組合來(lái)選。具體數(shù)值在下一章展開。3. SigmaStudio里A2B工程的核心配置細(xì)節(jié)3.1 新建工程與器件庫(kù)的正確選擇打開SigmaStudio新建一個(gè)A2B工程。這里第一個(gè)坑就是器件選擇SigmaStudio的A2B支持列表里有AD2428、AD2427、AD2426等多個(gè)型號(hào)還有不同封裝的變體。選錯(cuò)型號(hào)后面生成的寄存器配置會(huì)跟實(shí)際芯片對(duì)不上表現(xiàn)就是“下載成功但總線起不來(lái)”。正確做法是主控側(cè)選AD2428Master從板側(cè)選AD2428Slave然后在節(jié)點(diǎn)屬性里指定EVB對(duì)應(yīng)的硬件配置。AD2428WD-EVB和AD2428WC-EVB在SigmaStudio的板級(jí)支持里通常有對(duì)應(yīng)的預(yù)設(shè)如果沒(méi)有就手動(dòng)按EVB原理圖配I2C地址和GPIO。注意SigmaStudio版本很關(guān)鍵。A2B插件在不同版本里界面和選項(xiàng)位置會(huì)變建議用官方推薦的、與你的EVB文檔匹配的版本。我踩過(guò)的坑是用了一個(gè)較新的版本結(jié)果PDM配置頁(yè)的選項(xiàng)名跟舊教程完全對(duì)不上白白找了半天。3.2 主從節(jié)點(diǎn)的地址與角色分配A2B總線上每個(gè)節(jié)點(diǎn)都有一個(gè)唯一的節(jié)點(diǎn)ID和I2C地址。主節(jié)點(diǎn)默認(rèn)是Node 0從節(jié)點(diǎn)依次是Node 1、Node 2……在SigmaStudio的拓?fù)湟晥D里你要把從板拖到主節(jié)點(diǎn)的下游并給它分配節(jié)點(diǎn)ID。這里的關(guān)鍵是從節(jié)點(diǎn)的I2C地址不能跟主節(jié)點(diǎn)沖突也不能跟從板上掛的其他I2C器件沖突。AD2428WC-EVB上除了A2B芯片可能還有EEPROM之類的器件配之前掃一遍I2C總線把地址列出來(lái)避免撞車。我一般會(huì)在紙上畫一張地址表主節(jié)點(diǎn)、從節(jié)點(diǎn)、麥克風(fēng)如果麥克風(fēng)有I2C控制接口、EEPROM各占什么地址一目了然。角色分配上主節(jié)點(diǎn)要勾選“提供總線時(shí)鐘”和“總線供電”從節(jié)點(diǎn)勾選“從總線取電”。如果從節(jié)點(diǎn)也要往外供電比如給下游菊花鏈的下一級(jí)還要配對(duì)應(yīng)的供電模式。這些選項(xiàng)在SigmaStudio的節(jié)點(diǎn)屬性面板里別漏。3.3 PDM麥克風(fēng)接口的配置要點(diǎn)這是整個(gè)工程里最容易出錯(cuò)的地方。從節(jié)點(diǎn)AD2428WC的PDM接口要配幾個(gè)東西PDM時(shí)鐘輸出使能、時(shí)鐘頻率、采樣沿上升沿還是下降沿采樣、抽取比、以及PDM數(shù)據(jù)映射到哪個(gè)A2B上行槽位。PDM時(shí)鐘頻率的選擇要同時(shí)滿足麥克風(fēng)的要求和抽取濾波器的要求。以常見(jiàn)的數(shù)字MEMS麥克風(fēng)為例它支持的PDM時(shí)鐘范圍通常是1.0MHz到3.2MHz。我選2.048MHz因?yàn)?.048MHz除以抽取比64正好是32kHz除以抽取比……等等我要48kHz那就得重新算48kHz乘以抽取比64等于3.072MHz這個(gè)在麥克風(fēng)支持范圍內(nèi)所以PDM時(shí)鐘設(shè)3.072MHz抽取比64得到48kHz PCM。這個(gè)計(jì)算過(guò)程一定要自己走一遍別抄別人的數(shù)。采樣沿要和麥克風(fēng)的規(guī)格書對(duì)齊。大部分MEMS麥克風(fēng)在PDM時(shí)鐘的上升沿輸出數(shù)據(jù)、下降沿穩(wěn)定從節(jié)點(diǎn)在下降沿采樣。配反了的現(xiàn)象是數(shù)據(jù)全是噪聲或者全零。數(shù)據(jù)映射到A2B上行槽位時(shí)要記住A2B的槽位是按時(shí)分復(fù)用排的一個(gè)48kHz的superframe里能裝多少個(gè)槽位是固定的。單通道麥克風(fēng)占一個(gè)上行槽位配好之后在SigmaStudio的“Upstream”視圖里能看到這個(gè)槽位被占用。3.4 音頻路由與TDM輸出配置從節(jié)點(diǎn)把麥克風(fēng)數(shù)據(jù)送上總線后主節(jié)點(diǎn)要把它從總線上取下來(lái)通過(guò)TDM/I2S輸出給后端。這一步在SigmaStudio里是配主節(jié)點(diǎn)的“Downstream to TDM”路由。要配的參數(shù)包括TDM模式I2S、左對(duì)齊、右對(duì)齊、DSP模式、位深16/24/32bit、幀同步寬度、以及麥克風(fēng)數(shù)據(jù)放在TDM的哪個(gè)slot。后端SoC讀的是哪個(gè)slot這里就得配到哪個(gè)slot兩邊必須一致。我這次后端用的是標(biāo)準(zhǔn)I2S48kHz、32bit slot、麥克風(fēng)數(shù)據(jù)放slot 0。配完之后用邏輯分析儀抓主節(jié)點(diǎn)的TDM輸出能看到BCLK、LRCLK和數(shù)據(jù)線數(shù)據(jù)線上應(yīng)該有隨聲音變化的波形。如果TDM線上什么都沒(méi)有說(shuō)明主節(jié)點(diǎn)沒(méi)把總線數(shù)據(jù)取下來(lái)回去檢查路由配置。4. 從零跑通的完整實(shí)操過(guò)程4.1 硬件連接與上電檢查先把硬件接好。主控AD2428WD-EVB通過(guò)USBi連PCA2B總線口用雙絞線連到從板AD2428WC-EVB的A2B口。從板的PDM接口接數(shù)字MEMS麥克風(fēng)注意麥克風(fēng)的VDD、GND、CLK、DATA四根線別接反尤其是CLK和DATA接反了要么沒(méi)數(shù)據(jù)要么芯片發(fā)熱。上電順序先給主控板上電再給從板上電如果從板是獨(dú)立供電的話。如果從板走總線供電那就只給主控上電用萬(wàn)用表量一下從板A2B口的電壓確認(rèn)總線供電正常。我遇到過(guò)從板A2B口電壓只有零點(diǎn)幾伏的情況查下來(lái)是雙絞線接觸不良換根線就好了。上電后先別急著開SigmaStudio用示波器量從板PDM接口的CLK腳正常應(yīng)該有PDM時(shí)鐘輸出前提是從節(jié)點(diǎn)已經(jīng)配置并啟動(dòng)。如果CLK腳一直是低電平說(shuō)明從節(jié)點(diǎn)沒(méi)起來(lái)先解決總線通信問(wèn)題別往下走。4.2 SigmaStudio工程下載與總線枚舉打開配好的工程點(diǎn)下載。SigmaStudio會(huì)通過(guò)USBi把配置寫進(jìn)主節(jié)點(diǎn)然后主節(jié)點(diǎn)去枚舉總線上的從節(jié)點(diǎn)。枚舉成功的標(biāo)志是在拓?fù)湟晥D里從節(jié)點(diǎn)變成“已連接”狀態(tài)并且能看到從節(jié)點(diǎn)的寄存器讀值。如果枚舉失敗按這個(gè)順序查主從之間的雙絞線是否接好、從節(jié)點(diǎn)供電是否正常、從節(jié)點(diǎn)I2C地址是否沖突、主節(jié)點(diǎn)的總線供電是否使能。我一般會(huì)先用SigmaStudio自帶的寄存器讀寫工具直接讀從節(jié)點(diǎn)的一個(gè)已知寄存器比如器件ID寄存器能讀到正確值說(shuō)明I2C通了讀不到就是物理層或地址問(wèn)題。4.3 PDM數(shù)據(jù)抓取與驗(yàn)證總線枚舉通過(guò)、PDM配置下載完成后從節(jié)點(diǎn)應(yīng)該開始輸出PDM時(shí)鐘并采集數(shù)據(jù)。這時(shí)候用示波器或邏輯分析儀抓從節(jié)點(diǎn)PDM接口的DATA腳對(duì)著麥克風(fēng)說(shuō)話應(yīng)該能看到數(shù)據(jù)線的占空比隨聲音變化PDM是1bit流聲音表現(xiàn)為1的密度變化。如果DATA腳一直不動(dòng)先確認(rèn)PDM時(shí)鐘有沒(méi)有輸出再確認(rèn)麥克風(fēng)有沒(méi)有供電最后確認(rèn)采樣沿配置對(duì)不對(duì)。我踩過(guò)一次坑麥克風(fēng)規(guī)格書說(shuō)在時(shí)鐘下降沿輸出數(shù)據(jù)我在SigmaStudio里配成了上升沿采樣結(jié)果抓到的數(shù)據(jù)全是亂的改成下降沿就正常了。4.4 TDM輸出與后端對(duì)接從節(jié)點(diǎn)數(shù)據(jù)上總線后主節(jié)點(diǎn)把它路由到TDM輸出。用邏輯分析儀抓主節(jié)點(diǎn)的TDM三根線BCLK、LRCLK、DATA確認(rèn)BCLK頻率等于采樣率乘以位深乘以通道數(shù)。比如48kHz、32bit、2通道立體聲幀BCLK就是48k×32×23.072MHz。LRCLK應(yīng)該是48kHz。DATA線上對(duì)著麥克風(fēng)說(shuō)話應(yīng)該有波形。如果BCLK和LRCLK都對(duì)但DATA沒(méi)波形回去檢查主節(jié)點(diǎn)的下行路由有沒(méi)有把麥克風(fēng)所在的槽位映射到TDM slot。如果DATA有波形但后端SoC讀出來(lái)是噪聲檢查位深和slot對(duì)齊方式I2S和左對(duì)齊差一個(gè)BCLK周期配錯(cuò)了數(shù)據(jù)就整體移位。4.5 參數(shù)計(jì)算速查把這次用到的關(guān)鍵參數(shù)整理成表方便你對(duì)照自己的方案改參數(shù)本次取值計(jì)算依據(jù)PDM時(shí)鐘3.072MHz48kHz × 抽取比64抽取比64與PDM時(shí)鐘配合得到48kHzPCM采樣率48kHz目標(biāo)采樣率TDM位深32bit后端I2S要求BCLK3.072MHz48k × 32 × 2LRCLK48kHz等于采樣率麥克風(fēng)slotSlot 0后端讀取位置這張表里的每個(gè)數(shù)都是可以按你的實(shí)際需求替換的替換的時(shí)候記住PDM時(shí)鐘、抽取比、采樣率三者是綁定的改一個(gè)要重算另外兩個(gè)。5. 數(shù)字麥克風(fēng)陣列沒(méi)聲音的排查實(shí)錄5.1 分層排查法從物理層到應(yīng)用層“沒(méi)聲音”是個(gè)太籠統(tǒng)的現(xiàn)象必須分層定位。我的排查順序是物理層供電、連線、時(shí)鐘→ 總線層枚舉、I2C通信→ 數(shù)據(jù)層PDM數(shù)據(jù)、A2B槽位→ 輸出層TDM、后端讀取。每一層都有明確的觀測(cè)點(diǎn)用示波器或SigmaStudio的寄存器工具去測(cè)不要靠猜。物理層量從板A2B口電壓、量PDM時(shí)鐘腳、量麥克風(fēng)供電??偩€層讀從節(jié)點(diǎn)器件ID寄存器。數(shù)據(jù)層抓PDM DATA腳、看A2B上行槽位有沒(méi)有被占用。輸出層抓TDM三根線、看后端SoC的I2S接收寄存器。5.2 常見(jiàn)問(wèn)題速查表現(xiàn)象可能原因排查動(dòng)作總線枚舉失敗雙絞線接觸不良、從節(jié)點(diǎn)沒(méi)供電、I2C地址沖突量電壓、掃I2C地址PDM時(shí)鐘無(wú)輸出從節(jié)點(diǎn)未啟動(dòng)、PDM使能未勾選讀從節(jié)點(diǎn)狀態(tài)寄存器PDM有數(shù)據(jù)但全是噪聲采樣沿配反、抽取比錯(cuò)對(duì)照麥克風(fēng)規(guī)格書改配置A2B上行槽位為空PDM數(shù)據(jù)未映射到槽位檢查SigmaStudio上行路由TDM無(wú)輸出主節(jié)點(diǎn)下行路由未配檢查Downstream to TDMTDM有波形但后端是噪聲位深/slot對(duì)齊錯(cuò)核對(duì)I2S模式與slot聲音斷續(xù)總線供電不足、superframe超載算總電流、減通道數(shù)5.3 幾個(gè)我踩過(guò)的坑和獨(dú)家技巧第一個(gè)坑SigmaStudio里改了配置但沒(méi)重新下載。A2B的配置是存在芯片寄存器里的你在SigmaStudio界面上改完必須點(diǎn)下載才生效光改不下載等于沒(méi)改。我有一次調(diào)了半天采樣沿最后發(fā)現(xiàn)根本沒(méi)下載。第二個(gè)坑麥克風(fēng)規(guī)格書里的“時(shí)鐘頻率范圍”和“抽取比”是兩回事。有的麥克風(fēng)支持很寬的時(shí)鐘范圍但內(nèi)部固定抽取比這時(shí)候你的PCM采樣率就被麥克風(fēng)鎖死了不能隨便選。配之前一定把規(guī)格書看全。第三個(gè)技巧用SigmaStudio的實(shí)時(shí)寄存器監(jiān)控功能把從節(jié)點(diǎn)的PDM狀態(tài)寄存器和A2B槽位狀態(tài)寄存器加到監(jiān)控列表里一邊說(shuō)話一邊看寄存器值變化比抓波形更直觀。這個(gè)方法幫我快速定位過(guò)一次“槽位映射錯(cuò)位”的問(wèn)題。第四個(gè)技巧如果后端SoC讀出來(lái)是噪聲先別懷疑A2B用邏輯分析儀把TDM數(shù)據(jù)解出來(lái)存成文件用音頻軟件播放。如果解出來(lái)的音頻是正常的問(wèn)題在后端SoC的I2S配置如果解出來(lái)就是噪聲問(wèn)題在A2B鏈路。這一步能省掉大量扯皮時(shí)間。6. 從單通道到麥克風(fēng)陣列的擴(kuò)展思路單通道跑通之后往陣列擴(kuò)展是自然的下一步。陣列的核心訴求是通道間嚴(yán)格同步A2B在這點(diǎn)上天然有優(yōu)勢(shì)因?yàn)樗袕墓?jié)點(diǎn)的時(shí)鐘都派生自主節(jié)點(diǎn)的同一個(gè)superframe。擴(kuò)展時(shí)要注意幾點(diǎn)一是每個(gè)從節(jié)點(diǎn)的PDM時(shí)鐘要同源同相二是各通道在A2B上行槽位里要連續(xù)排列三是主節(jié)點(diǎn)到后端的TDM輸出要能容納所有通道。如果通道數(shù)多到一根A2B總線的superframe裝不下就要考慮菊花鏈多節(jié)點(diǎn)或者提高總線速率。這時(shí)候前面說(shuō)的“先點(diǎn)對(duì)點(diǎn)跑通再擴(kuò)展”的價(jià)值就體現(xiàn)出來(lái)了——你有一個(gè)已知能工作的基準(zhǔn)擴(kuò)展出問(wèn)題時(shí)可以回退對(duì)比。我在實(shí)際做陣列的時(shí)候習(xí)慣先把每個(gè)通道單獨(dú)跑通、單獨(dú)驗(yàn)證再合并。合并后如果某個(gè)通道沒(méi)聲音直接定位到那個(gè)從節(jié)點(diǎn)不用全鏈路重查。這個(gè)習(xí)慣幫我省了很多時(shí)間。最后分享一個(gè)我在調(diào)試A2B時(shí)的小習(xí)慣每改一次配置就在工程里存一個(gè)版本文件名帶上日期和改動(dòng)點(diǎn)。A2B的配置項(xiàng)太多改著改著就忘了哪版是能工作的有版本記錄能隨時(shí)回退。這個(gè)習(xí)慣看起來(lái)笨但比事后憑記憶復(fù)原配置靠譜得多。