簡(jiǎn)介
在這個(gè)系列的上一篇文章中,我們介紹了ESP32 I2S音頻總線的相關(guān)知識(shí),簡(jiǎn)要了解了什么是I2S總線、它的通信格式,以及相關(guān)的底層API函數(shù)。沒有看過上篇文章的可以點(diǎn)擊文章進(jìn)行回顧:
[ESP32 I2S音頻總線學(xué)習(xí)筆記(一):初識(shí)I2S通信與配置基礎(chǔ)]
這篇文章將介紹一個(gè)小案例——ESP32驅(qū)動(dòng)INMP441讀取音頻數(shù)據(jù),它是關(guān)于如何使用I2S讀取數(shù)據(jù)的一個(gè)應(yīng)用,主要是將ESP32讀取到的音頻數(shù)據(jù)發(fā)送到串口上并實(shí)時(shí)顯示波形,這個(gè)我們可以通過串口繪圖儀來(lái)實(shí)現(xiàn)。在這之前先來(lái)看一下INMP441這個(gè)模塊吧
INMP441全向麥克風(fēng)模塊

NMP441是一款高性能、低功耗、數(shù)字輸出,帶底部端口的全向MEMS麥克風(fēng)。該完整的INMP441解決方案由一個(gè)MEMS傳感器、信號(hào)調(diào)節(jié)模塊、數(shù)字混合濾波器、電源管理和行業(yè)標(biāo)準(zhǔn)的24位I2S接口組成。I2S接口允許INMP441直接連接到數(shù)字處理器,如DSP和微控制器,無(wú)需額外的音頻解碼器。NMP441具有高信噪比,是一種適用于近場(chǎng)應(yīng)用的理想選擇。
產(chǎn)品特性:
具有高精度24位數(shù)據(jù)的數(shù)字I2S接口
高信噪比為61 dBA
高靈敏度-26 dBFS
從60 Hz到15 kHz的穩(wěn)定頻率響應(yīng)
低功耗:低電流消耗1.4 mA
高PSR:-75 dBFS
功能框圖
INMP441模塊使用到的芯片內(nèi)置ADC,用于將采集到的模擬信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),上面還有濾波器和硬件控制、電源相關(guān)的引腳。
引腳定義
| VDD | 輸入電源,1.8V至3.3V |
|---|---|
| GND | 電源地 |
| SCK | I2S接口的串行數(shù)據(jù)時(shí)鐘 |
| WS | 用于I2S接口的串行數(shù)據(jù)字選擇 |
| SD | I2S接口的串行數(shù)據(jù)輸出 |
| L/R | 左/右聲道選擇 |
其中L/R是 左/右聲道選擇。設(shè)置為低電平時(shí),麥克風(fēng)在I2S幀的左聲道輸出信號(hào)。設(shè)置為高電平時(shí),麥克風(fēng)在右聲道輸出信號(hào)。
安裝I2S驅(qū)動(dòng)
上篇文章我們?cè)诮榻BI2S底層API函數(shù)提到,在使用I2S通信時(shí)需要加載I2S驅(qū)動(dòng),不知道小伙伴們還記不記得。這個(gè)加載I2S驅(qū)動(dòng)的函數(shù)就是:esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, int queue_size, void *i2s_queue),里面有4個(gè)參數(shù)需要配置,在上次都有提到每個(gè)參數(shù)的意義。 其中比較復(fù)雜的是i2s_config這個(gè)結(jié)構(gòu)體變量,我們需要對(duì)結(jié)構(gòu)體的每個(gè)參數(shù)進(jìn)行配置,如下:
除了后面幾個(gè)整型變量,每個(gè)結(jié)構(gòu)體成員其實(shí)是一個(gè)枚舉類型
I2S工作模式mode
音頻采樣率bits_per_sample
通道格式channel_format
通信傳輸格式communication_format
知道了每個(gè)參數(shù)的含義以及知道它可以配置哪些參數(shù),就可以調(diào)用i2s_driver_install這個(gè)函數(shù)了。 這里我們舉一個(gè)安裝I2S驅(qū)動(dòng)的例子,就比較容易理解了。同時(shí)配置的時(shí)候,我們把它放在一個(gè)函數(shù)里面,起名為i2s_install( )。
配置I2S引腳
I2S通信最重要的三個(gè)信號(hào)是位時(shí)鐘BCK、字時(shí)鐘WS、數(shù)據(jù)引腳SD,因此我們需要對(duì)其引腳進(jìn)行配置,設(shè)置I2S引腳的函數(shù)是esp_err_t i2s_set_pin(i2s_port_t i2s_num, const i2s_pin_config_t *pin),第一個(gè)參數(shù)傳入I2S端口,填I(lǐng)2S_NUM_0或I2S_NUM_1, 第二個(gè)參數(shù)是結(jié)構(gòu)體如下:
其中mck_io_num; bck_io_num,ws_io_num等都是整型變量,data_out_num如果我們沒有用到就傳入-1,在driver/i2s.h頭文件定義了
假設(shè)我們要配置的引腳位時(shí)鐘BCK、字時(shí)鐘WS、數(shù)據(jù)引腳SD分別是D13, D12, D14,同樣把要配置的參數(shù)寫入一個(gè)函數(shù)i2s_setpin()里面,配置I2S引腳示例如下:
安裝完I2S驅(qū)動(dòng)和配置好I2S引腳后,我們只要在setup()函數(shù)里面調(diào)用這兩個(gè)函數(shù)就可以了。
讀取I2S數(shù)據(jù)
上面只是對(duì)I2S進(jìn)行了一下初始化,要通過INMP441讀取i2s數(shù)據(jù),我們只需要調(diào)用esp_err_t i2s_read(i2s_port_t i2s_num, void *dest, size_t size, size_t *bytes_read, TickType_t ticks_to_wait);這個(gè)函數(shù)。因?yàn)榍懊嬖诔跏蓟疘2S時(shí)的量化位數(shù)是16位,所以每個(gè)采樣點(diǎn)的數(shù)據(jù)大小為2字節(jié),我們將讀取到的數(shù)據(jù)放入一個(gè)緩存區(qū)數(shù)組sBuffer,將數(shù)組長(zhǎng)度bufferLen定義為64,確保每次從I2S接口讀取時(shí)能獲得足夠的音頻數(shù)據(jù)。 如果讀取成功2s_read這個(gè)函數(shù)會(huì)返回一個(gè)ESP_OK,成功后就進(jìn)入數(shù)據(jù)處理部分。這里我們將讀取到的音頻數(shù)據(jù)求均值然后可以用串口繪圖儀觀察它的數(shù)據(jù)波形,代碼如下:
完整代碼
接線圖
寫完代碼后就可以開始接線了,接線圖如下圖所示:供電這里接3.3V,L/R接地。
實(shí)驗(yàn)效果
一開始接收到的是外界的聲音,波形是雜亂無(wú)章的。后面用嘴吹氣,波形會(huì)跟著吹氣變化,不吹氣波形是平緩不變的,后面大概吹了幾次,可以看到波形變化,如下圖:
總結(jié)
本篇文章介紹了通過ESP32的I2S通信實(shí)時(shí)讀取INMP441麥克風(fēng)模塊的音頻數(shù)據(jù),并通過串口繪圖儀顯示音頻數(shù)據(jù)波形。后面我們還會(huì)介紹使用INMP441采集音頻并實(shí)時(shí)播放音頻,感興趣的可以先關(guān)注收藏一下!
審核編輯 黃宇
-
I2S
+關(guān)注
關(guān)注
1文章
78瀏覽量
43772 -
ESP32
+關(guān)注
關(guān)注
21文章
1052瀏覽量
20540 -
音頻總線
+關(guān)注
關(guān)注
0文章
3瀏覽量
224
發(fā)布評(píng)論請(qǐng)先 登錄
音頻總線I2S協(xié)議:I2S收發(fā)模塊FPGA的仿真設(shè)計(jì)
全面解析I2S、TDM、PCM音頻總線
請(qǐng)問ESP-WROOM-32 I2S音頻信號(hào)幅度讀取異常怎么解決?
如何從INMP441 I2S麥克風(fēng)向ESP32輸入音頻?
音頻接口I2S實(shí)驗(yàn)
基于FPGA和AD1836的I2S接口設(shè)計(jì)
i2s音頻總線學(xué)習(xí)
i2s和i2c的區(qū)別
I2S接口工作原理_I2S接口介紹
幾種常見的I2S數(shù)據(jù)格式
I2S、TDM、PCM音頻總線
基于I2S接口的Linux內(nèi)核音頻技術(shù)

ESP32 I2S音頻總線學(xué)習(xí)筆記(二):I2S讀取INMP441音頻數(shù)據(jù)
評(píng)論