第三十五章 I2S——音頻傳輸接口

第三十五章 I2S——音頻傳輸接口

目錄

第三十五章 I2S——音頻傳輸接口

1 I2S概述

1.1 簡介

1.2 功能特點

1.3 工作原理

1.4 利用DMA通信的I2S

1.4.1 I2S配合DMA通信工作原理

1.4.2 配置要點

2 應用場景

2.1 消費類音頻設備

2.2 專業音頻設備

2.3 通信設備

2.4 汽車電子

2.5 嵌入式系統

3 注意事項

4 程序設計

4.1 IIS_CS4344例程

4.1.1 I2S初始化

4.1.2 DMA初始化

4.1.3 中斷配置函數

4.1.4 中斷服務函數

4.1.5 數據處理函數

4.1.6 主程序

4.1.7 下載驗證

4.2 IIS_Dma例程

4.2.1 發送數據

4.2.2 中斷服務函數

4.2.3?主程序

4.2.4?下載驗證

4.3 IIS_Int例程

4.3.1?I2S初始化

4.3.2 中斷服務函數

4.3.3 主程序

4.4.4?下載驗證

5 總結


I2S(Inter-Integrated Circuit Sound)W55MH32中用于數字音頻傳輸的重要接口,廣泛應用于各種音頻設備與嵌入式系統。本文將從工作原理、注意事項、應用場景以及程序設計來講解I2S接口,和大家一起學習和使用這一技術。

1 I2S概述

1.1 簡介

I2S(Inter-Integrated Circuit Sound)是飛利浦公司為數字音頻設備之間的音頻數據傳輸而制定的一種總線標準,專門用于音頻設備之間的高質量數字音頻傳輸。在W55MH32中,I2S功能與SPI模塊共享相同的硬件資源,通過將寄存器SPI_I2SCFGRI2SMOD位置為'1'即可使能I2S功能,將SPI模塊轉換為I2S音頻接口。

I2S接口與SPI接口使用大致相同的引腳、標志和中斷,但專為音頻數據傳輸優化。它采用獨立的導線傳輸時鐘與數據信號,通過將數據和時鐘信號分離,避免了因時差誘發的失真,為用戶節省了購買抵抗音頻抖動的專業設備的費用。I2S已成為數字音頻領域的事實標準接口,廣泛應用于各種消費電子和專業音頻設備中。

1.2 功能特點

W55MH32I2S接口有以下特點:

  • 單工通信(僅發送或接收)
  • 主或者從操作
  • 8位線性可編程預分頻器,獲得精確的音頻采樣頻率(8KHz96kHz)
  • 數據格式可以是16位,24位或者32
  • 音頻信道固定數據包幀為16(16位數據幀)32(162432位數據幀)
  • 可編程的時鐘極性(穩定態)
  • 從發送模式下的下溢標志位和主/從接收模式下的溢出標志位
  • 16位數據寄存器用來發送和接收,在通道兩端各有一個寄存器
  • 支持的I2S協議:
    • I2S飛利浦標準
    • MSB對齊標準(左對齊)
    • LSB對齊標準(右對齊)
  • PCM標準(16位通道幀上帶長或短幀同步或者16位數據幀擴展為32位通道幀)
  • 數據方向總是MSB在先
  • 發送和接收都具有DMA能力
  • 主時鐘可以輸出到外部音頻設備,比率固定為256xFs(Fs為音頻采樣頻率)

1.3 工作原理

I2S接口的核心工作原理基于三個主要信號線的協同工作:

  • 串行時鐘(SCK/CK):也稱為位時鐘(BCLK),由主設備產生,用于同步數據傳輸。每個時鐘周期對應音頻數據的一位。SCK的頻率計算公式為:SCK頻率 = 2 × 采樣頻率 × 采樣位數。例如,對于44.1kHz采樣率、16位精度的立體聲音頻,SCK頻率應為44.1kHz×16bits×2(左右聲道)=1.4112MHz
  • 字選擇(WS):也稱為幀時鐘(LRCK),用于指示當前傳輸的音頻數據所屬聲道。在I2S飛利浦標準下,WS'0'表示左聲道數據,為'1'表示右聲道數據。WS信號在發送第一位數據(MSB)1個時鐘周期即變為有效。
  • 串行數據(SD):承載實際的音頻數據,采用二進制補碼表示。數據總是從最高位(MSB)開始傳輸,與SPI接口的MSB優先模式類似。

在某些需要更高精度時鐘同步的系統中,還可以使用第四個信號線:

  • 主時鐘(MCK)為外部音頻編解碼器提供系統時鐘參考,通常設置為采樣頻率的256(256xFs)。當寄存器SPI_I2SPRMCKOE位為'1'時,W55MH32可輸出此額外時鐘信號。

I2S的數據傳輸遵循嚴格的時序關系。在I2S飛利浦標準下,發送方在時鐘信號(CK)的下降沿改變數據,接收方在上升沿讀取數據。WS信號也在時鐘信號的下降沿變化。這種同步機制確保了數據傳輸的可靠性,即使在高速率下也能保持較低的誤碼率。

對于不同數據格式的處理,I2S硬件提供了自動的數據對齊和填充功能。例如,當16位數據擴展到32位幀時,高16(MSB)為有效數據,低16位被硬件強制為0x0000,無需軟件干預。24位數據擴展到32位幀時,高24位為有效數據,低8位由硬件置0。這種自動處理大大簡化了軟件開發,特別是在使用DMA傳輸時。

I2S的功能框圖如下:

1.4 利用DMA通信的I2S

1.4.1 I2S配合DMA通信工作原理

I2S接口與DMA控制器協同工作時,形成高效的數據傳輸通道。通過將寄存器SPI_CR2TXDMAEN/RXDMAEN位置1,可使能DMA傳輸請求。I2S模式下DMA的工作方式與SPI模式基本相同,只是沒有CRC功能。當I2S接口需要發送或接收數據時,會自動觸發DMA請求:

  • 發送過程TXE標志置1時觸發DMA請求,DMA控制器將數據從內存搬運至SPI_DR寄存器。
  • 接收過程RXNE標志置1時觸發DMA請求,DMA控制器將數據從SPI_DR寄存器搬運至內。

使用DMA發送和接收的時序圖如下:

1.4.2 配置要點

數據格式處理

I2S支持多種數據格式,DMA需要相應配置:

數據格式

DMA傳輸次數

備注

16位→16位幀

1

直接傳輸

16位→32位幀

1

硬件自動補0

24位→32位幀

2

硬件補低80

32位→32位幀

2

完整32位處理

聲道管理

  • 左聲道數據總是先傳輸
  • 通過CHSIDE標志識別當前聲道
  • 從模式需提前準備好第一個數據

發送流程

  1. 配置DMA:內存→SPI_DR,設置數據寬度
  2. 啟動傳輸:TXE=1時自動觸發
  3. 聲道切換:根據CHSIDE處理左右聲道
  4. 完成處理:等待TXE=1BSY=0后關閉

接收流程

  1. 配置DMASPI_DR→內存,設置數據寬度
  2. 啟動傳輸:RXNE=1時自動觸發
  3. 數據解析:根據標準處理數據對齊
  4. 關閉時序:按數據格式選擇正確時序

2 應用場景

W55MH32I2S接口憑借其高質量數字音頻傳輸能力,在眾多領域得到廣泛應用:

2.1 消費類音頻設備

便攜式音樂播放器:連接音頻DAC實現高質量音樂播放,支持從MP3解碼器到功率放大器的數字音頻傳輸。

智能音箱:用于主控芯片與數字音頻處理器之間的連接,實現語音助手和音樂播放功能。

數字電視和機頂盒:傳輸數字音頻信號到音頻處理芯片或直接驅動數字功放。

2.2 專業音頻設備

錄音設備:連接高性能ADC實現多通道音頻采集,支持24位高分辨率錄音。

音頻混音器:在數字域混合多個音頻源,保持信號完整性。

效果處理器:傳輸音頻數據到DSP芯片進行實時效果處理。

2.3 通信設備

VoIP電話:實現雙向語音通信,同時支持回聲消除等高級功能。

會議系統:連接數字麥克風陣列和音頻處理單元。

無線耳機:在藍牙模塊與編解碼器之間傳輸音頻數據。

2.4 汽車電子

車載娛樂系統:連接多個音頻源和功放,支持環繞聲處理。

主動降噪系統:實時采集車內噪聲并生成反相聲波。

語音識別系統:傳輸高清晰度語音數據到語音處理單元。

2.5 嵌入式系統

工業控制人機界面:實現語音提示和報警功能。

醫療監護設備:傳輸心音、呼吸音等生物音頻信號。

智能家居:用于門鈴、對講系統等需要音頻功能的設備。

3 注意事項

  1. 時鐘同步:從模式需確保在外部時鐘有效前完成初始化。
  2. 數據對齊:注意不同標準(Philips/MSB/LSB)的數據對齊差異。
  3. 電源管理:模擬部分供電需加強濾波處理。
  4. PCB布局:時鐘信號線應盡量短并考慮端接匹配。
  5. 關閉順序:嚴格按照規范流程關閉接口,避免數據損壞。

4 程序設計

4.1 IIS_CS4344例程

IIS_CS4344例程主要實現了基于W55MH32芯片的I2S音頻傳輸功能。以下是實現過程和結果驗證:

4.1.1 I2S初始化

I2S的初始化函數為IIS_Configuration()函數:

void IIS_Configuration(void)
{
? ? I2S_InitTypeDef ?I2S_InitStructure;
? ? GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);? ? GPIO_InitStructure.GPIO_Pin ? = GPIO_Pin_15;
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_InitStructure.GPIO_Mode ?= GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);? ? GPIO_InitStructure.GPIO_Pin ? = GPIO_Pin_3 | GPIO_Pin_5;
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_InitStructure.GPIO_Mode ?= GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);SPI_I2S_DeInit(SPI3);
? ? I2S_InitStructure.I2S_Mode ? ? ? = I2S_Mode_MasterTx;
? ? I2S_InitStructure.I2S_Standard ? = I2S_Standard_Phillips;
? ? I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
? ? I2S_InitStructure.I2S_AudioFreq ?= I2S_AudioFreq_8k;
? ? I2S_InitStructure.I2S_CPOL ? ? ? = I2S_CPOL_Low;
? ? I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;I2S_Init(SPI3, &I2S_InitStructure);SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE);I2S_Cmd(SPI3, ENABLE);
}

該函數首先使能了相關時鐘并釋放GPIOA15資源(PA15默認為調試接口,必須先釋放其默認的調試功能,否則,調試接口會持續占用該引腳,導致I2S無法正常工作。),然后配置GPIOA15GPIOB3GPIOB5GPIOC7為復用推挽輸出模式以連接I2SSCKSDWSMCLK信號,接著將SPI3初始化為I2S模式并設置為主機發送模式,采用飛利浦標準、16位數據格式、8kHz采樣率,啟用MCLK輸出和低時鐘極性,最后使能DMA傳輸以提高數據效率并激活I2S外設。

4.1.2 DMA初始化

DMA_Configuration()DMA初始化函數:

void DMA_Configuration(void)
{
? ? DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);DMA_DeInit(DMA2_Channel2);? ? DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI3->DR;
? ? DMA_InitStructure.DMA_MemoryBaseAddr ? ? = (uint32_t)I2S3_Buffer_Tx;
? ? DMA_InitStructure.DMA_DIR ? ? ? ? ? ? ? ?= DMA_DIR_PeripheralDST;
? ? DMA_InitStructure.DMA_BufferSize ? ? ? ? = BufferSize;
? ? DMA_InitStructure.DMA_PeripheralInc ? ? ?= DMA_PeripheralInc_Disable;
? ? DMA_InitStructure.DMA_MemoryInc ? ? ? ? ?= DMA_MemoryInc_Enable;
? ? DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
? ? DMA_InitStructure.DMA_MemoryDataSize ? ? = DMA_MemoryDataSize_HalfWord;
? ? DMA_InitStructure.DMA_Mode ? ? ? ? ? ? ? = DMA_Mode_Circular;
? ? DMA_InitStructure.DMA_Priority ? ? ? ? ? = DMA_Priority_VeryHigh;
? ? DMA_InitStructure.DMA_M2M ? ? ? ? ? ? ? ?= DMA_M2M_Disable;DMA_Init(DMA2_Channel2, &DMA_InitStructure);DMA_ITConfig(DMA2_Channel2, DMA_IT_TC, ENABLE);/* Enable SPI1 DMA TX request */DMA_Cmd(DMA2_Channel2, DISABLE);
}

該函數首先使能了DMA2時鐘,然后將DMA2通道2初始化為從內存到外設的傳輸模式,設置外設基址為SPI3的數據寄存器(用于I2S通信),內存基址為音頻數據緩沖區I2S3_Buffer_Tx,配置傳輸方向為內存到外設、緩沖區大小為BufferSize,禁用外設地址自增、啟用內存地址自增,設置數據寬度為半字(16位,與I2S數據格式匹配),采用循環模式確保連續傳輸,設置優先級為非常高,禁用內存到內存模式,最后使能傳輸完成中斷并暫時禁用DMA通道。

4.1.3 中斷配置函數

NVIC_Configuration()NVIC(嵌套向量中斷控制器)的配置函數:

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel                   = DMA2_Channel2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

該函數首先定義NVIC了初始化結構體,然后將中斷通道設置為DMA2通道2(對應I2S3TX DMA傳輸),配置搶占優先級和子優先級均為0(最高優先級),使能該中斷通道,最后調用初始化函數完成配置,整體實現了對DMA2通道2傳輸完成事件的高優先級中斷響應設置,確保音頻數據傳輸中斷能被及時處理。

4.1.4 中斷服務函數

DMA2_Channel2_IRQHandler()DMA2通道2的中斷服務函數:

void DMA2_Channel2_IRQHandler(void)
{if (DMA_GetITStatus(DMA2_IT_TC2) == SET){DMA_ClearITPendingBit(DMA2_IT_TC2);DMA_ClearFlag(DMA2_FLAG_TC2);DMA_Cmd(DMA2_Channel2, DISABLE);
        Flag = 1;}
}

程序首先檢查是否為DMA傳輸完成中斷(TC2),若是則清除中斷掛起位和完成標志位,禁用DMA2通道2以暫停傳輸,最后將標志位Flag1以通知主程序數據已傳輸完畢,整體實現了對I2S音頻數據DMA傳輸完成的響應處理,確保在數據發送完成后能進行必要的狀態更新和后續操作。

4.1.5 數據處理函數

DATA_Processing()是數據處理函數,通過以下步驟實現將8位數據轉換為16位格式:

void DATA_Processing(void)
{
    uint32_t i;    for (i = 0; i < DATA_LEN / 2; i++){
        I2S3_Buffer_Tx[i] = DATA[2 * i] << 8 | DATA[2 * i + 1];}
}

程序首先定義循環計數器,然后對長度為DATA_LEN8位數據源數組DATA進行遍歷,每次取連續的兩個8位數據,將前一個左移8位后與后一個按位或運算,組合成一個16位數據存入目標數組I2S3_Buffer_Tx中,整體實現了將8位原始數據轉換為適合I2S傳輸的16位數據格式,確保音頻數據能夠正確地通過I2S接口發送。

4.1.6 主程序

主程序main()通過以下步驟實現I2S音頻數據的持續傳輸:

int main(void)
{
    RCC_ClocksTypeDef clocks;delay_init();UART_Configuration(115200);RCC_GetClocksFreq(&clocks);printf("\n");printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);printf("IIS CS4344 Test.\n");IIS_Configuration();DMA_Configuration();NVIC_Configuration();DATA_Processing();DMA_Cmd(DMA2_Channel2, ENABLE);    while (1){if (Flag == 1){printf("IIS DMA Data Send Success\n");
            Flag = 0;DMA_Configuration();DMA_Cmd(DMA2_Channel2, ENABLE);}}
}

程序首先初始化系統時鐘和延時函數,配置115200波特率的UART用于調試信息輸出,獲取并打印系統各時鐘頻率;接著依次配置I2S接口、DMA通道、NVIC中斷控制器,并將8位原始數據處理為16位格式以適配I2S傳輸;然后啟用DMA通道開始數據傳輸;最后在主循環中檢測傳輸完成標志Flag,若置1則打印成功信息、重置標志,重新配置并啟用DMA通道以實現循環傳輸,整體實現了通過I2S接口持續發送音頻數據的功能。

4.1.7 下載驗證

程序下載運行后,首先打印了系統各時鐘的頻率和示例名稱,然后每發送成功一次I2S數據就會打印數據發送成功的信息:

此時我們接上DAC音頻轉換器、戴上耳機就能持續聽到“微信到賬100萬元”的音頻內容。

4.2 IIS_Dma例程

IIS_Dma例程通過I2S接口和DMA傳輸機制,發送預設的音頻數據。該例程的I2S初始化、DMA初始化、中斷配置函數與IIS_CS4344例程保持一致,這里不再贅述。其他程序設計如下:

4.2.1 發送數據

I2S3_Buffer_Tx為需要發送的測試數據:

uint16_t I2S3_Buffer_Tx[BufferSize] = {0x0102, 0x0304, 0x0506, 0x0708, 0x090A, 0x0B0C,
                                       0x0D0E, 0x0F10, 0x1112, 0x1314, 0x1516, 0x1718,
                                       0x191A, 0x1B1C, 0x1D1E, 0x1F20, 0x2122, 0x2324,
                                       0x2526, 0x2728, 0x292A, 0x2B2C, 0x2D2E, 0x2F30,
                                       0x3132, 0x3334, 0x3536, 0x3738, 0x393A, 0x3B3C,
                                       0x3D3E, 0x3F40};

4.2.2 中斷服務函數

DMA2_Channel2_IRQHandlerW55MH32DMA2通道2的中斷處理函數:

void DMA2_Channel2_IRQHandler(void)
{if (DMA_GetITStatus(DMA2_IT_TC2) == SET){DMA_ClearITPendingBit(DMA2_IT_TC2);DMA_ClearFlag(DMA2_FLAG_TC2);DMA_Cmd(DMA2_Channel2, DISABLE);
        Flag = 1;}
}

DMA完成預設的3216位數據傳輸后觸發。函數首先檢查傳輸完成中斷狀態,若中斷已觸發則清除中斷掛起位和傳輸完成標志,避免重復響應;接著禁用DMA2通道2,停止數據傳輸;最后將全局標志位Flag1,通知主程序DMA傳輸已完成,主循環檢測到該標志后會輸出成功信息并重置標志。此函數實現了DMA傳輸的中斷響應與狀態反饋,是I2S音頻數據傳輸流程中的關鍵環節。

4.2.3?主程序

主程序main()通過以下步驟實現I2S音頻數據的傳輸:

int main(void)
{
    RCC_ClocksTypeDef clocks;delay_init();UART_Configuration(115200);RCC_GetClocksFreq(&clocks);printf("\n");printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);printf("IIS DMA Test.\n");IIS_Configuration();DMA_Configuration();NVIC_Configuration();DMA_Cmd(DMA2_Channel2, ENABLE);    while (1){if (Flag == 1){printf("IIS DMA Data Send Success\n");
            Flag = 0;}}
}

程序首先初始化系統時鐘、UART調試接口并打印時鐘信息,接著配置I2S接口(復用SPI3)、DMA2通道2(循環模式)和NVIC中斷控制器,隨后啟用DMA開始將預設的3216位音頻數據循環傳輸到I2S接口,主循環持續檢測DMA傳輸完成標志位Flag,當Flag被中斷處理函數置1時,打印傳輸成功信息并重置標志,不過因中斷處理函數中禁用了DMA通道,實際數據僅能傳輸一次,此代碼常用于音頻設備初始化測試。

4.2.4?下載驗證

程序下載運行后,首先打印了系統各時鐘的頻率和示例名稱,然后I2S數據發送成功后打印數據發送成功的信息:

通過邏輯分析儀就可以解析出發送的數據:

首幀和尾幀的數據實際已經可以看到有數據脈沖信號,未解析屬于硬件初始化特性(FIFO填充)或解析器同步延遲原因,不影響實際音頻功能。

4.3 IIS_Int例程

IIS_Int例程通過I2S接口和中斷控制器實現音頻數據的中斷驅動傳輸。其他程序設計如下:

4.3.1?I2S初始化

IIS_Configuration()函數用于初始化W55MH32I2S接口(復用SPI3外設)及中斷配置,其內容如下:

void IIS_Configuration(void)
{
    I2S_InitTypeDef  I2S_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);    NVIC_InitStructure.NVIC_IRQChannel                   = SPI3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;NVIC_Init(&NVIC_InitStructure);SPI_I2S_DeInit(SPI3);
    I2S_InitStructure.I2S_Mode       = I2S_Mode_MasterTx;
    I2S_InitStructure.I2S_Standard   = I2S_Standard_Phillips;
    I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b;
    I2S_InitStructure.I2S_AudioFreq  = I2S_AudioFreq_8k;
    I2S_InitStructure.I2S_CPOL       = I2S_CPOL_Low;
    I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Enable;I2S_Init(SPI3, &I2S_InitStructure);SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE);I2S_Cmd(SPI3, ENABLE);
}

函數首先使能GPIOA/B/CSPI3的時鐘,配置相關引腳為復用推挽輸出(包括數據輸出、字選擇、串行時鐘和主時鐘引腳);接著配置NVIC中斷控制器,設置SPI3中斷的優先級并使能中斷;然后重置SPI3并設置I2S參數,包括主發送模式、飛利浦標準、16位數據格式、8kHz采樣率、低時鐘極性和主時鐘輸出;最后啟用發送緩沖區空中斷(TXE)并使能I2S外設。該配置適用于簡單音頻發送場景,通過中斷驅動方式實現數據傳輸。

4.3.2 中斷服務函數

SPI3_IRQHandler()SPI3外設的中斷處理函數,用于處理I2S發送緩沖區空(TXE)事件,函數內容如下:

void SPI3_IRQHandler(void)
{if (SPI_I2S_GetITStatus(SPI3, SPI_I2S_IT_TXE) == SET){/* Send a data from I2S3 */SPI_I2S_SendData(SPI3, I2S3_Buffer_Tx[TxIdx++]);}if (TxIdx == 32){SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, DISABLE);}
}

當檢測到TXE標志置位時,函數從預設的32元素數據緩沖區I2S3_Buffer_Tx中讀取一個16位數據發送到I2S接口,并遞增索引TxIdx;當TxIdx達到32時,表示所有數據發送完畢,函數禁用TXE中斷以停止傳輸。該函數實現了基于中斷的單次數據塊發送,適用于小規模固定數據的傳輸場景。

4.3.3 主程序

以下為該例程的主程序,用于測試I2S接口的中斷驅動數據發送功能:

int main(void)
{
    RCC_ClocksTypeDef clocks;delay_init();UART_Configuration(115200);RCC_GetClocksFreq(&clocks);printf("\n");printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);printf("IIS Int Test.\n");IIS_Configuration();    while (1);
}

程序先初始化延時函數和UART1串口,獲取并打印系統各時鐘頻率,然后初始化I2S接口(配置GPIO、中斷及I2S參數),最后進入無限循環,數據發送由I2S發送緩沖區空中斷驅動,主程序不參與具體傳輸邏輯。

4.4.4?下載驗證

程序下載運行后,首先打印了系統各時鐘的頻率和示例名稱,I2S觸發中斷之后開始發送數據,數據緩沖區有數據之后便不再觸發:

邏輯分析儀解析數據如下:

同樣的,首幀和尾幀的數據實際也已經可以看到有數據脈沖信號,未解析屬于硬件初始化特性(FIFO填充)或解析器同步延遲原因,不影響實際音頻功能。

5 總結

W55MH32I2S接口為數字音頻應用提供了強大而靈活的解決方案。通過與SPI模塊共享硬件資源,它既實現了專用音頻接口的高性能,又保持了設計的經濟性。支持多種音頻標準和數據格式使其能夠與絕大多數音頻編解碼器無縫協作,滿足從消費電子到專業音頻設備的各種需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87052.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87052.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87052.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

產品-Figma(英文版),圖像的布爾類型圖例說明

文章目錄 Union SelectionSubtract SelectionIntersect SelectionExclude SelectionFlatten Selection Union Selection 把多個形狀合并成一個新的完整形狀&#xff0c;保留所有外部輪廓&#xff0c;內部不被切割。由于紅色的長方形在外面的一層&#xff0c;所以切割后&#x…

Windows CMD命令分類大全

?? ?一、系統與磁盤管理? ?系統信息? systeminfo&#xff1a;查看詳細硬件及系統配置&#xff08;版本/內存/補丁&#xff09;211 winver&#xff1a;快速檢查Windows版本11 msinfo32&#xff1a;圖形化系統信息面板811?磁盤工具? chkdsk /f&#xff1a;修復磁盤錯誤&…

【Dify系列】【Dify1.4.2 升級到Dify1.5.0】

1. 升級前準備工作 1.1 數據備份&#xff1a; 進入原安裝包 docker 目錄&#xff0c;備份“volumes”文件夾&#xff0c;此文件夾包含了 Dify 數據庫數據&#xff1a; rootjoe:/usr/local/dify/docker/volumes# pwd /usr/local/dify/docker/volumesrootjoe:/usr/local/dify/…

DeepSeek網頁版隨機點名器

用DeepSeek幫我們生成了一個基于html5的隨機點名器&#xff0c;效果非常棒&#xff0c;如果需要加入名字&#xff0c;請在代碼中按照對應的格式添加即可。 提示詞prompt 幫我生成一個隨機點名的HTML5頁面 生成真實一點的名字數據 點擊隨機按鈕開始隨機選擇 要有閃動的效果 &…

前后端分離實戰2----后端

戳我抵達前端 項目描述&#xff1a;用Vscode創建Spring Bootmybatis項目&#xff0c;用maven進行管理。創建一個User表&#xff0c;對其內容進行表的基本操作&#xff08;增刪改查&#xff09;&#xff0c;顯示在前端。 項目地址&#xff1a;戳我一鍵下載項目 運行效果如下&…

深入 ARM-Linux 的系統調用世界

1、引言 本篇文章以 ARM 架構為例&#xff0c;進行講解。需要讀者有一定的 ARM 架構基礎 在操作系統的世界中&#xff0c;系統調用&#xff08;System Call&#xff09;是用戶空間與內核空間溝通的橋梁。用戶態程序如 ls、cp 或你的 C 程序&#xff0c;無權直接操作硬件、訪問文…

LabVIEW鍵盤鼠標監測控制

通過Input Device Control VIs&#xff0c;實現對鍵盤和鼠標活動的監測。通過AcquireInput Data VI 在循環中持續獲取輸入數據&#xff0c;InitializeKeyboard與InitializeMouse VIs 先獲取設備ID 引用&#xff0c;用于循環內監測操作&#xff1b;運行時可輸出按鍵信息&#xf…

Linux 系統管理:自動化運維與容器化部署

在現代 IT 基礎設施中&#xff0c;自動化運維和容器化部署是提高系統管理效率和可維護性的關鍵。Linux 系統因其穩定性和靈活性而被廣泛應用于服務器和數據中心。本文將深入探討 Linux 系統管理中的自動化運維和容器化部署技術&#xff0c;幫助系統管理員實現高效運維和快速部署…

直播 APP 開發需要多少成本

直播行業的火爆催生了大量直播 APP 開發需求&#xff0c;而開發成本是開發者最關注的問題之一。其成本構成復雜&#xff0c;受功能需求、開發方式、技術難度等多種因素影響。? 基礎功能開發是成本的重要組成部分。用戶注冊登錄、直播間創建與管理、視頻播放、聊天互動等功能開…

Reactor操作符的共享與復用

在 Reactor 中&#xff0c;transform 和 transformDeferred 是兩個用于代碼復用和操作符鏈封裝的高級操作符。它們允許你將一組操作符封裝成一個函數&#xff0c;并在適當的時候應用到響應式流中。以下是它們的詳細總結&#xff1a; 1. transform 操作符 作用&#xff1a;tran…

C#中的Converter詳解

Converter是C#中一個非常有用的概念&#xff0c;主要用于類型轉換。它通常以委托或接口的形式出現&#xff0c;允許開發者定義如何將一種類型轉換為另一種類型。下面我將詳細介紹Converter的概念、使用場景&#xff0c;并以布爾型轉換為例展示具體應用。 Converter的基本概念 …

LabVIEW熒光微管圖像模擬

利用LabVIEW平臺&#xff0c;集成 PI 壓電平臺、Nikon 熒光顯微鏡及Andor sCMOS 相機等硬件&#xff0c;構建熒光微管滑行實驗圖像序列模擬系統。通過程序化模擬微管運動軌跡、熒光標記分布及顯微成像過程&#xff0c;為生物醫學領域微管跟蹤算法測試、運動特性分析提供標準化仿…

CentOS下Nginx服務器搭建全攻略

Nginx 安裝與配置完整指南 一、安裝 Nginx 1.1 添加 Nginx 官方倉庫 在 CentOS 系統中&#xff0c;默認倉庫的 Nginx 版本可能較舊&#xff08;通常為 1.12 或更早版本&#xff09;&#xff0c;建議添加官方倉庫來安裝最新穩定版本&#xff08;目前為 1.25.x&#xff09;&am…

網絡拓撲圖繪制全流程:從架構解析到工具實戰

在數據呈現與系統管理中&#xff0c;清晰展示設備間的邏輯關系至關重要。網絡拓撲圖正是這樣一種有效的可視化工具。它通過節點設備和連接線路&#xff0c;直觀呈現網絡結構或項目流程中各元素的布局與交互關系&#xff0c;幫助理解系統運作、診斷問題并確保項目順利進行。 1. …

Git 簡介安裝教程

&#x1f4e2;歡迎點贊&#x1f44d;收藏?留言&#x1f4dd;如有錯誤敬請指正&#xff01; 目錄 一、Git 的安裝1.1 Git 的下載1.2 Git 的安裝1.2.1 使用許可聲明1.2.2 選擇安裝目錄1.2.3 選擇安裝組件1.2.4 選擇開始菜單文件夾1.2.5 選擇 Git 默認編輯器1.2.6 決定初始化新項…

鴻蒙NEXT-鴻蒙三層架構搭建,嵌入HMRouter,實現便捷跳轉,新手攻略。(2/3)

在上一小節我們已經完成了關于三層架構的搭建&#xff0c;接下來我們來實現在三層架構中的導入依賴&#xff0c;將他們相互聯系起來。 第一步&#xff1a;在features產品定制層中&#xff0c;對其中所有的動態共享包導入依賴&#xff0c;示例features>my>oh-package.jso…

【每天一個知識點】語料投毒(Corpus Poisoning)

“語料投毒”&#xff08;Corpus Poisoning&#xff09; 是指攻擊者通過向大型語言模型&#xff08;如 ChatGPT&#xff09;使用的外部知識庫中注入惡意或誤導性文檔&#xff0c;從而干擾模型的檢索與回答過程&#xff0c;導致其輸出錯誤、虛假或有害內容。 &#x1f50d; 舉個…

疏通經脈: Bridge 聯通邏輯層和渲染層

本節概述 經過前面兩節的開發&#xff0c;我們已經完成了小程序邏輯線程和 UI 線程的啟動引擎準備&#xff0c;這節開始&#xff0c;我們將完善 native bridge 層的搭建&#xff0c;構建起邏輯線程和UI線程之間的橋梁。 開始之前我們先來回顧一下邏輯引擎小節相關的流程圖: 一…

【攻防篇】解決:阿里云docker 容器中自動啟動xmrig挖礦

解決&#xff1a;阿里云服務器docker容器被植入挖礦程序 **1. 緊急處理&#xff1a;停止挖礦進程****&#xff08;1&#xff09;查找并終止 xmrig 進程****&#xff08;2&#xff09;刪除惡意文件** **2. 清理被感染的容器****&#xff08;1&#xff09;停止并刪除容器****&…

對稱非對稱加密,https和http,https通訊原理,Charles抓包原理

文章目錄 對稱加密的非對稱加密http和https原理TCP三次握手四次揮手https通訊流程&#xff1a;Charles抓包原理 對稱加密的非對稱加密 對稱加密&#xff1a;發送方的接收方式使用同一個秘鑰進行加密和解密&#xff0c;發送方將需要發送的數據&#xff0c;選擇某種加密算法&…