0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于MM32F5270控制器的I2S音頻播放

靈動MM32MCU ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2022-09-16 10:39 ? 次閱讀

MM32F5270 系列控制器支持 I2S 總線接口,本章節(jié)在接下來會對 MM32F5270 I2S進行介紹,并使用 MM32F5270 和 CS4344 芯片進行 I2S 通信來演示播放一段聲音。

I2S 簡介

I2S ( Inter—IC Sound ) 總線是飛利浦公司為數(shù)字音頻設備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標準,該總線專責于音頻設備之間的數(shù)據(jù)傳輸,廣泛應用于各種多媒體系統(tǒng)。它采用了沿獨立的導線傳輸時鐘與數(shù)據(jù)信號的設計,通過將數(shù)據(jù)和時鐘信號分離,避免了因時差誘發(fā)的失真,為用戶節(jié)省了購買抵抗音頻抖動的專業(yè)設備的費用。在飛利浦公司的 I2S 標準中,既規(guī)定了硬件接口規(guī)范,也規(guī)定了數(shù)字音頻數(shù)據(jù)的格式。

在 MM32F5270 中,SPI 與 I2S 共用引腳。在 I2S 的描述中,支持半雙工通信,也支持全雙工模式。I2S 與 SPI 區(qū)別在于,I2S 主模式的控制邏輯使用獨立的時鐘分頻處理單元。在半雙工模式下,可使用 MCK 引腳輸出驅(qū)動時鐘,用于驅(qū)動外部音頻組件。在全雙工模式下,為了能同時進行數(shù)據(jù)的收發(fā),MCK 驅(qū)動時鐘只能從專用的 MCK 功能引腳輸出。I2S 的功能框圖如圖 1 所示,包括時鐘單元,寄存器控制單元,主從模式控制單元等。

433d0104-34d9-11ed-ba43-dac502259ad0.png

圖1. I2S 功能框圖

MM32F5270 中 I2S 主要特征

支持半雙工通信(僅發(fā)射機或接收機)和全雙工通信(SD,extSD 的數(shù)據(jù)方向根據(jù)主/從模式配置決定)兩種通信方式

9 位可編程線性預分頻器,以達到精確的音頻采樣頻率( 8KHz 到 192KHz)

數(shù)據(jù)幀格式可以是 16 位、 24 位或 32 位

數(shù)據(jù)包幀固定為 16 位(16 位有效數(shù)據(jù))或 32 位(16 位、 24 位、 32 位有效數(shù)據(jù))

可編程時鐘極性(穩(wěn)定狀態(tài))

發(fā)射模式下的下溢標志(僅從機),接收模式下的上溢標志(主和從機)和接收/發(fā)射模式下的幀錯誤標志(僅從機)

用于傳輸和接收的 32 位寄存器為兩個聲道分時復用

支持 I2S 協(xié)議

飛利浦標準

MSB 對齊標準(左對齊)

LSB 對齊標準(右對齊)

PCM 標準(在 16 位信道幀上具有短幀和長幀同步或擴展到 32 位信道幀的 16 位數(shù)據(jù)幀)

數(shù)據(jù)方向始終是 MSB 優(yōu)先

DMA 傳輸能力

可配置輸出 MCLK 來驅(qū)動外部音頻組件,比率固定在 256× FS(其中 FS 為音頻采樣頻率)

I2S 信號接口

I2S 和 SPI 共用三個公共管腳:

串行時鐘 CK

映射在 SCK 引腳上,也叫位時鐘 BCLK,是主模式下的串行時鐘輸出以及從機模式下的串行時鐘輸入。SCLK 頻率 = 2 x 采樣頻率 x 采樣位數(shù)

幀時鐘 WS

映射在 NSS 引腳上,是主模式下的串行時鐘輸出以及從機模式下的串行時鐘輸入。用于切換左右聲道,LRCK 頻率 = 采樣頻率

串行數(shù)據(jù) SD

映射在 MOSI 管腳上,二進制補碼表示的音頻數(shù)據(jù),用于發(fā)送或接收兩次多路數(shù)據(jù)通道(僅在半雙工模式下)。

當某些外部設備需要主時鐘輸入時,可以使用一個附加的管腳輸出時鐘到音頻設備

主時鐘 MCLK

映射在 MISO 引腳或?qū)S?MCK 引腳上,當 I2S 配置為主模式時使用此時鐘。MCLK 頻率 = 256 x 采樣頻率 Fs

I2S 引腳信號如圖 2 所示。

4366d7e0-34d9-11ed-ba43-dac502259ad0.png

圖2. I2S 引腳信號

數(shù)據(jù)格式

三線總線處理音頻數(shù)據(jù),必須經(jīng)過分時復用兩個聲道:右聲道和左聲道。因為只有一個 32 位寄存器用于傳輸或接收,所以軟件應依次配置寄存器 TXREG 為各聲道的數(shù)據(jù),或依次讀取寄存器 RXREG 為各聲道的數(shù)據(jù)。按照 I2S 協(xié)議,總是先發(fā)送左聲道,然后發(fā)送右聲道。

數(shù)據(jù)格式可以采用以下格式進行發(fā)送:

16 位數(shù)據(jù)打包在 16 位幀中

16 位數(shù)據(jù)打包在 32 位幀中

24 位數(shù)據(jù)打包在 32 位幀中

32 位數(shù)據(jù)打包在 32 位幀中

當使用 32 位幀上發(fā)送 16 位數(shù)據(jù)時,前 16 位(MSB)是有效的位,16 位 LSB 制為 0,無需任何軟件操作,通過硬件實現(xiàn),其他格式相似。

通信標準

I2S 接口支持四種音頻標準,通過配置寄存器 SPI_I2S_I2SCFGR 中的 I2SSTD[1:0]、PCMSYNC 位進行切換;數(shù)據(jù)格式則通過配置 DATLEN[1:0]、CHLEN 來進行選擇。對于所有通信標準及數(shù)據(jù)格式,總是先發(fā)送最高位(MSB 優(yōu)先)。

飛利浦標準

對于飛利浦標準,WS 信號用于指示正在傳輸?shù)穆暤?。發(fā)射器在 CK 的下降沿鎖存數(shù)據(jù),接收器并在 CK 的上升讀取數(shù)據(jù)。WS 信號也在 CK 的下降沿被鎖定。對于這種標準 I2S 格式的信號,無論有多少位有效數(shù)據(jù),數(shù)據(jù)的最高位總是出現(xiàn)在 WS 變化(也就是一幀開始)后的第 2 個 CK 脈沖處,如圖 3 所示。

43cfdccc-34d9-11ed-ba43-dac502259ad0.png

圖3. 飛利浦標準示意圖

MSB 對齊標準

對于 MSB 對齊標準,第一個數(shù)據(jù)在 WS 變化后的第一個沿有效,如圖 4 所示。

43f916dc-34d9-11ed-ba43-dac502259ad0.png

圖4. MSB 對齊標準示意圖

LSB 對齊標準

對于 LSB 對齊標準,每個數(shù)據(jù)包幀的最低有效位總(LSB 位)是出現(xiàn)在 WS 變化前的 1 個 CK 脈沖周期處,如圖 5 所示。

44314782-34d9-11ed-ba43-dac502259ad0.png

圖5. LSB 對齊標準示意圖

PCM 標準

對于 PCM 標準,不需要使用聲道信息。PCM 有兩個模式:短幀模式和長幀模式,通過配置SPI\_I2S\_I2SCFGR 寄存器的 PCMSYNC 位進行切換。在 PCM 模式下,輸出信號(WS, SD)在 CK 信號的上升沿進行采樣。輸入信號(WS, SD)在 CK 下降沿被捕獲。注意在主模式下, CK 和 WS 被配置為輸出,如圖 6 所示。

44662542-34d9-11ed-ba43-dac502259ad0.png

圖6. PCM 對齊標準示意圖

I2S 配置

I2S 的配置主要包括主從模式選擇,時鐘極性,全雙工半雙工模式選擇,采樣頻率和通信標準的配置,從而進行數(shù)據(jù)傳輸。

主模式

I2S 功能的主模式下,選擇全雙工工作時,SD 引腳作為主機發(fā)送接口,extSD 作為主機接收接口,SCK 和 WS作為主機的輸出信號,同時 MCK 向外部提供可選的驅(qū)動時鐘(配置 SPI_I2S_I2SCFGR.MCKOE 位為 ‘1’ 使能 MCK 輸出),如圖 7 所示。

448b44bc-34d9-11ed-ba43-dac502259ad0.png

圖7. I2S 主模式全雙工通信

基于 MM32F5270 的聲音播放實驗

CS4344 芯片是實現(xiàn)本次實驗功能的重要器件之一。CS4344 是一種立體聲音頻數(shù)模轉(zhuǎn)換器 (DAC) ,可使用單個 +3.3 V 或 +5 V 電源,僅需要最小的支持電路。該系列線性模擬低通濾波器和自動速度模式檢測,當自動選擇 2 kHz 和 200 kHz 之間的采樣率,使用采樣率和主時鐘速率方法。

本實驗的基本原理是 MM32F3270 讀取正弦波采樣計算出的左右聲道的數(shù)組數(shù)據(jù),通過 I2S 接口將 PCM 信號傳輸給 CS4344,再經(jīng)過 TS4871(音頻功率放大器)連接到耳機接口,可以接入耳機等音頻播放裝置。

硬件設計

如圖 8-9 是 PLUS-F5270 的 I2S 電路部分,完整原理圖可以通過官網(wǎng)下載。其中,引腳信號對應分別為:

I2S2_SD 對應于引腳 E6

I2S2_CK 對應于引腳 D3

I2S2_WS 對應于引腳 E4

I2S2_MCK 對應于引腳 E5

44b2c636-34d9-11ed-ba43-dac502259ad0.png

圖8. I2S 電路圖(1)

44f2229a-34d9-11ed-ba43-dac502259ad0.png

圖9. I2S 電路圖(2)

GPIO 初始化 BOARD_InitPins()

配置 I2S 引腳,I2S_CK 為 PD3 引腳,I2S_SD 為 PE6 引腳,I2S_WS 為 PE4 引腳,I2S_MCK 為 PE5 引腳,復用通道為 AF5 。

voidBOARD_InitPins(void)
{
/*PB7-UART1_TX.*/
GPIO_Init_Typegpio_init;
gpio_init.Pins=GPIO_PIN_6;
gpio_init.PinMode=GPIO_PinMode_AF_PushPull;//GPIO_PinMode_AF_PushPull
gpio_init.Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&gpio_init);
GPIO_PinAFConf(GPIOB,gpio_init.Pins,GPIO_AF_7);

/*PB6-UART1_RX.*/
gpio_init.Pins=GPIO_PIN_7;
gpio_init.PinMode=GPIO_PinMode_In_Floating;//GPIO_PinMode_In_Floating
gpio_init.Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&gpio_init);
GPIO_PinAFConf(GPIOB,gpio_init.Pins,GPIO_AF_7);

/*PD3-I2S_CK.*/
gpio_init.Pins=GPIO_PIN_3;
gpio_init.PinMode=GPIO_PinMode_AF_PushPull;//GPIO_PinMode_In_PushPull
gpio_init.Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOD,&gpio_init);
GPIO_PinAFConf(GPIOD,gpio_init.Pins,GPIO_AF_5);

/*PE6-I2S_SD.*/
gpio_init.Pins=GPIO_PIN_6;
gpio_init.PinMode=GPIO_PinMode_AF_PushPull;//GPIO_PinMode_In_PushPull
gpio_init.Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE,&gpio_init);
GPIO_PinAFConf(GPIOE,gpio_init.Pins,GPIO_AF_5);

/*PE4-I2S_WS.*/
gpio_init.Pins=GPIO_PIN_4;
gpio_init.PinMode=GPIO_PinMode_AF_PushPull;//GPIO_PinMode_In_PushPull
gpio_init.Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE,&gpio_init);
GPIO_PinAFConf(GPIOE,gpio_init.Pins,GPIO_AF_5);

/*PE5-I2S_MCK.*/
gpio_init.Pins=GPIO_PIN_5;
gpio_init.PinMode=GPIO_PinMode_AF_PushPull;//GPIO_PinMode_In_PushPull
gpio_init.Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE,&gpio_init);
GPIO_PinAFConf(GPIOE,gpio_init.Pins,GPIO_AF_5);
}

I2S 配置初始化 app_i2s_master_init()

初始化 I2S,配置時鐘頻率、采樣率、數(shù)據(jù)長度、通信協(xié)議、傳輸模式及是否使能 MCLK 。

voidapp_i2s_master_init(void)
{
/*setupI2Smastermodule.*/
I2S_Master_Init_Typei2s_master_init;

i2s_master_init.ClockFreqHz=BOARD_I2S_FREQ;
i2s_master_init.SampleRate=BOARD_I2S_SAMPLE_RATE;
i2s_master_init.DataWidth=BOARD_I2S_DATA_WIDTH;
i2s_master_init.Protocol=BOARD_I2S_PROTOCOL;
i2s_master_init.EnableMCLK=true;
i2s_master_init.Polarity=BOARD_I2S_CPOL;
i2s_master_init.XferMode=I2S_XferMode_TxOnly;

I2S_InitMaster(BOARD_I2S_PORT,&i2s_master_init);

/*enableI2S.*/
I2S_Enable(BOARD_I2S_PORT,true);
}

Protocol

通信標準格式選擇,可選 I2S Philips 標準、左對齊標準、右對齊標準、 PCM 短幀標準或 PCM 長幀標準,它設定 SPI\_I2S\_I2SCFGR 寄存器 I2SSTD位和 PCMSYNC位的值。一般設置為 I2S Philips 標準即可。

DataWidth

數(shù)據(jù)格式選擇,設定有效數(shù)據(jù)長度和幀長度,可選標準 16bit 格式、擴展 16bit( 32bit 幀長度) 格式、 24bit 格式和 32bit 格式,它設定 SPI\_I2SCFGR 寄存器 DATLEN 位和CHLEN 位的值。對應 16bit 數(shù)據(jù)長度可選 16bit 或 32bit 幀長度,其他都是 32bit 幀長度。

EnableMCLK

主時鐘輸出使能控制,可選使能輸出或禁止輸出,它設定 SPI_I2SPR 寄存器 MCKOE 位的值。為提高系統(tǒng)性能一般使能主時鐘輸出。

SampleRate

采樣頻率設置,標準庫提供采樣采樣頻率選擇,分別為 4KHz、8kHz、 11kHz、12KHz、16kHz、22kHz、32kHz、44kHz、48kHz、96kHz、192kHz 以及默認 2Hz,它設定 SPI\_I2S\_SPBRG 寄存器的值。

Polarity

空閑狀態(tài)的 CK 線電平,可選高電平或低電平,它設定 SPI\_I2S\_CCTL 寄存器 CPOL位的值。一般設置為低電平即可。

左右聲道數(shù)據(jù)

采樣函數(shù) f (t) = A *sin( B*t ) , t 為采樣時間,單位: s。采樣位寬為 16bit,采樣頻率為 8 khz,系數(shù) A 為10000,B 為2000π。

/*i2sleftchannelxferdata.*/
constint16_tsound_buf_left[SOUND_BUF_SIZE]=
{
0,3535,5000,3535,0,-3535,-5000,-3535,
0,3535,5000,3535,0,-3535,-5000,-3535,
};

/*i2srightchannelxferdata.*/
constint16_tsound_buf_right[SOUND_BUF_SIZE]=
{
0,3827,7071,9238,10000,9238,7071,3827,
0,-3827,-7071,-9238,-10000,-9238,-7071,-3827
};

左右聲道數(shù)據(jù)傳輸

/*putdataintoleftchannel.*/
voidapp_i2s_put_data_left(void)
{
I2S_PutData(BOARD_I2S_PORT,(uint32_t)sound_buf_left[sound_buf_index_left]);
sound_buf_index_left++;
if(sound_buf_index_left>=SOUND_BUF_SIZE)
{
sound_buf_index_left=0;
}
}

/*putdataintorightchannel.*/
voidapp_i2s_put_data_right(void)
{
I2S_PutData(BOARD_I2S_PORT,(uint32_t)sound_buf_right[sound_buf_index_right]);
sound_buf_index_right++;
if(sound_buf_index_right>=SOUND_BUF_SIZE)
{
sound_buf_index_right=0;
}
}

main() 函數(shù)

main() 函數(shù)結(jié)合上述操作,串口打印 "i2s_master_basic" ,初始化 I2S 后,將發(fā)送數(shù)組數(shù)據(jù)到左右聲道緩沖區(qū),進行聲音播放。
intmain(void)
{
BOARD_Init();

printf("i2s_master_basic.
");

app_i2s_master_init();

while(1)
{
while(0u!=(I2S_GetStatus(BOARD_I2S_PORT)&SPI_I2S_CSTAT_TXFULL_MASK))
{}

app_i2s_put_data_left();/*sendingleftchanneldata.*/

while(0u!=(I2S_GetStatus(BOARD_I2S_PORT)&SPI_I2S_CSTAT_TXFULL_MASK))
{}
app_i2s_put_data_right();/*sendingrightchanneldata.*/
}
}

實驗演示

本實驗以搭載 MM32F5277E9PV 的 PLUS-F5270 開發(fā)板為平臺,其揚聲器將會播放左聲道數(shù)據(jù),演示視頻如下:

演示1. 播放左聲道數(shù)據(jù)

音響數(shù)據(jù)的采集、處理和傳輸是多媒體技術的重要組成部分。眾多的數(shù)字音頻系統(tǒng)已經(jīng)進入消費市場,例如數(shù)字音頻錄音帶、數(shù)字聲音處理器。對于設備和生產(chǎn)廠家來說,標準化的信息傳輸結(jié)構(gòu)可以提高系統(tǒng)的適應性。

本文介紹了 MM32F5270 中通過 I2S 和 CS4344 芯片進行通信來演示播放一段聲音,后續(xù)將進行 MP3 的播放,未完待續(xù)!

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16101

    瀏覽量

    177064
  • 總線接口
    +關注

    關注

    0

    文章

    82

    瀏覽量

    30705
  • I2S
    I2S
    +關注

    關注

    1

    文章

    62

    瀏覽量

    41803
  • MM32
    +關注

    關注

    1

    文章

    106

    瀏覽量

    735

原文標題:靈動微課堂 (第230講) | 基于MM32F5270的I2S音頻播放

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于MM32F5270開發(fā)板獲取雨滴傳感的數(shù)據(jù)相關資料介紹

    MM32F5270控制器厲害了,曾經(jīng)獲得2022中國IC設計成就獎之年度最佳MCU,讓我們一起目睹該開發(fā)板的真容吧?! ≡撻_發(fā)板的集成的了:  4KB L1 I-Cache,4KB L1 D-Cache
    發(fā)表于 08-24 15:20

    聊聊 MM32F5270是如何通過高并行度的總線設計實現(xiàn)系統(tǒng)吞吐率的最大化的

    總線訪問為提高系統(tǒng)并行度,MM32F5270配備了兩路獨立的 RAM,包括 112KB 的 SRAM1 和 16KB 的 SRAM2,每個 RAM有獨立的 RAM 控制器和 Slave端口。此外
    發(fā)表于 09-06 15:06

    MM32F5270開發(fā)板上播放TF卡WAV格式音樂

    ?! ≡?b class='flag-5'>MM32F5270中,SPI與I2S共用引腳。在I2S的描述中,支持半雙工通信,也支持全雙工模式(通過配置SPI_I2S_I2SCFGR.HDSEL 位來決定)。原作者:kin
    發(fā)表于 09-20 15:26

    103xx通過外部I2S音頻解碼播放音頻文件

    103xx通過外部I2S音頻解碼播放音頻文件。
    發(fā)表于 01-12 18:26 ?56次下載

    MM32F5270總線架構(gòu)設計

    本文介紹了MM32F5270 中所采用的多并發(fā)總線架構(gòu),并通過帶顯示的音頻播放器的實例說明了該架構(gòu)在實際應用中所能達到的吞吐率提升效果。
    的頭像 發(fā)表于 05-11 11:15 ?2128次閱讀
    <b class='flag-5'>MM32F5270</b>總線架構(gòu)設計

    MM32F5270】Keil開發(fā)環(huán)境搭建

    本文是對MM32F5270相關的靈動官網(wǎng)資料和社區(qū)現(xiàn)有幾篇環(huán)境搭建帖的整理和總結(jié)。詳細且完整的記錄了——如何從零搭建MM32F5270 Keil開發(fā)環(huán)境以及如何編譯運行MM32F5270 SDK中
    的頭像 發(fā)表于 11-06 16:14 ?2464次閱讀
    【<b class='flag-5'>MM32F5270</b>】Keil開發(fā)環(huán)境搭建

    MM32F5270 產(chǎn)品手冊(中文版)

    MM32F5270 產(chǎn)品手冊(中文版)
    發(fā)表于 02-23 18:45 ?0次下載
    <b class='flag-5'>MM32F5270</b> 產(chǎn)品手冊(中文版)

    MM32F5270 產(chǎn)品手冊(英文版)

    MM32F5270 產(chǎn)品手冊(英文版)
    發(fā)表于 02-23 18:45 ?0次下載
    <b class='flag-5'>MM32F5270</b> 產(chǎn)品手冊(英文版)

    MM32F5270 用戶手冊(中文版)

    MM32F5270 用戶手冊(中文版)
    發(fā)表于 02-23 18:46 ?0次下載
    <b class='flag-5'>MM32F5270</b> 用戶手冊(中文版)

    MM32F5270 用戶手冊(英文版)

    MM32F5270 用戶手冊(英文版)
    發(fā)表于 02-23 18:46 ?0次下載
    <b class='flag-5'>MM32F5270</b> 用戶手冊(英文版)

    MM32F5270 勘誤表(中文版)

    MM32F5270 勘誤表(中文版)
    發(fā)表于 02-23 18:47 ?0次下載
    <b class='flag-5'>MM32F5270</b> 勘誤表(中文版)

    MM32F5270 勘誤表(英文版)

    MM32F5270 勘誤表(英文版)
    發(fā)表于 02-23 18:48 ?0次下載
    <b class='flag-5'>MM32F5270</b> 勘誤表(英文版)

    基于MM32F5270I2S音頻播放

    基于MM32F5270I2S音頻播放
    的頭像 發(fā)表于 10-30 17:13 ?1078次閱讀
    基于<b class='flag-5'>MM32F5270</b>的<b class='flag-5'>I2S</b><b class='flag-5'>音頻</b><b class='flag-5'>播放</b>

    基于MM32F3270 I2S使用

    基于MM32F3270 I2S使用
    的頭像 發(fā)表于 09-27 15:50 ?740次閱讀
    基于<b class='flag-5'>MM32F</b>3270 <b class='flag-5'>I2S</b>使用

    使用STM32L1xx微控制器與外部I2S音頻編解碼播放音頻文件

    電子發(fā)燒友網(wǎng)站提供《使用STM32L1xx微控制器與外部I2S音頻編解碼播放音頻文件.pdf》資料免費下載
    發(fā)表于 09-21 11:30 ?3次下載
    使用STM32L1xx微<b class='flag-5'>控制器</b>與外部<b class='flag-5'>I2S</b><b class='flag-5'>音頻</b>編解碼<b class='flag-5'>器</b><b class='flag-5'>播放音頻</b>文件