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

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