單芯片解決方案,開啟全新體驗(yàn)——W55MH32高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計(jì)。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第三十五章 I2S——音頻傳輸接口
I2S(Inter-Integrated Circuit Sound)是W55MH32中用于數(shù)字音頻傳輸?shù)闹匾涌冢瑥V泛應(yīng)用于各種音頻設(shè)備與嵌入式系統(tǒng)。本文將從工作原理、注意事項(xiàng)、應(yīng)用場景以及程序設(shè)計(jì)來講解I2S接口,和大家一起學(xué)習(xí)和使用這一技術(shù)。
1I2S概述
1.1簡介
I2S(Inter-Integrated Circuit Sound)是飛利浦公司為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn),專門用于音頻設(shè)備之間的高質(zhì)量數(shù)字音頻傳輸。在W55MH32中,I2S功能與SPI模塊共享相同的硬件資源,通過將寄存器SPI_I2SCFGR的I2SMOD位置為'1'即可使能I2S功能,將SPI模塊轉(zhuǎn)換為I2S音頻接口。
I2S接口與SPI接口使用大致相同的引腳、標(biāo)志和中斷,但專為音頻數(shù)據(jù)傳輸優(yōu)化。它采用獨(dú)立的導(dǎo)線傳輸時鐘與數(shù)據(jù)信號,通過將數(shù)據(jù)和時鐘信號分離,避免了因時差誘發(fā)的失真,為用戶節(jié)省了購買抵抗音頻抖動的專業(yè)設(shè)備的費(fèi)用。I2S已成為數(shù)字音頻領(lǐng)域的事實(shí)標(biāo)準(zhǔn)接口,廣泛應(yīng)用于各種消費(fèi)電子和專業(yè)音頻設(shè)備中。
1.2功能特點(diǎn)
W55MH32的I2S接口有以下特點(diǎn):
單工通信(僅發(fā)送或接收)
主或者從操作
8位線性可編程預(yù)分頻器,獲得精確的音頻采樣頻率(8KHz到96kHz)
數(shù)據(jù)格式可以是16位,24位或者32位
音頻信道固定數(shù)據(jù)包幀為16位(16位數(shù)據(jù)幀)或32位(16、24或32位數(shù)據(jù)幀)
可編程的時鐘極性(穩(wěn)定態(tài))
從發(fā)送模式下的下溢標(biāo)志位和主/從接收模式下的溢出標(biāo)志位
16位數(shù)據(jù)寄存器用來發(fā)送和接收,在通道兩端各有一個寄存器
支持的I2S協(xié)議:
I2S飛利浦標(biāo)準(zhǔn)
MSB對齊標(biāo)準(zhǔn)(左對齊)
LSB對齊標(biāo)準(zhǔn)(右對齊)
PCM標(biāo)準(zhǔn)(16位通道幀上帶長或短幀同步或者16位數(shù)據(jù)幀擴(kuò)展為32位通道幀)
數(shù)據(jù)方向總是MSB在先
發(fā)送和接收都具有DMA能力
主時鐘可以輸出到外部音頻設(shè)備,比率固定為256xFs(Fs為音頻采樣頻率)
1.3工作原理
I2S接口的核心工作原理基于三個主要信號線的協(xié)同工作:
串行時鐘(SCK/CK):也稱為位時鐘(BCLK),由主設(shè)備產(chǎn)生,用于同步數(shù)據(jù)傳輸。每個時鐘周期對應(yīng)音頻數(shù)據(jù)的一位。SCK的頻率計(jì)算公式為:SCK頻率 = 2 ×采樣頻率 ×采樣位數(shù)。例如,對于44.1kHz采樣率、16位精度的立體聲音頻,SCK頻率應(yīng)為44.1kHz×16bits×2(左右聲道)=1.4112MHz。
字選擇(WS):也稱為幀時鐘(LRCK),用于指示當(dāng)前傳輸?shù)囊纛l數(shù)據(jù)所屬聲道。在I2S飛利浦標(biāo)準(zhǔn)下,WS為'0'表示左聲道數(shù)據(jù),為'1'表示右聲道數(shù)據(jù)。WS信號在發(fā)送第一位數(shù)據(jù)(MSB)前1個時鐘周期即變?yōu)橛行А?/p>
串行數(shù)據(jù)(SD):承載實(shí)際的音頻數(shù)據(jù),采用二進(jìn)制補(bǔ)碼表示。數(shù)據(jù)總是從最高位(MSB)開始傳輸,與SPI接口的MSB優(yōu)先模式類似。
在某些需要更高精度時鐘同步的系統(tǒng)中,還可以使用第四個信號線:
主時鐘(MCK):為外部音頻編解碼器提供系統(tǒng)時鐘參考,通常設(shè)置為采樣頻率的256倍(256xFs)。當(dāng)寄存器SPI_I2SPR的MCKOE位為'1'時,W55MH32可輸出此額外時鐘信號。
I2S的數(shù)據(jù)傳輸遵循嚴(yán)格的時序關(guān)系。在I2S飛利浦標(biāo)準(zhǔn)下,發(fā)送方在時鐘信號(CK)的下降沿改變數(shù)據(jù),接收方在上升沿讀取數(shù)據(jù)。WS信號也在時鐘信號的下降沿變化。這種同步機(jī)制確保了數(shù)據(jù)傳輸?shù)目煽啃裕词乖诟咚俾氏乱材鼙3州^低的誤碼率。
對于不同數(shù)據(jù)格式的處理,I2S硬件提供了自動的數(shù)據(jù)對齊和填充功能。例如,當(dāng)16位數(shù)據(jù)擴(kuò)展到32位幀時,高16位(MSB)為有效數(shù)據(jù),低16位被硬件強(qiáng)制為0x0000,無需軟件干預(yù)。24位數(shù)據(jù)擴(kuò)展到32位幀時,高24位為有效數(shù)據(jù),低8位由硬件置0。這種自動處理大大簡化了軟件開發(fā),特別是在使用DMA傳輸時。
I2S的功能框圖如下:
1.4利用DMA通信的I2S
1.4.1I2S配合DMA通信工作原理
I2S接口與DMA控制器協(xié)同工作時,形成高效的數(shù)據(jù)傳輸通道。通過將寄存器SPI_CR2的TXDMAEN/RXDMAEN位置1,可使能DMA傳輸請求。I2S模式下DMA的工作方式與SPI模式基本相同,只是沒有CRC功能。當(dāng)I2S接口需要發(fā)送或接收數(shù)據(jù)時,會自動觸發(fā)DMA請求:
發(fā)送過程:TXE標(biāo)志置1時觸發(fā)DMA請求,DMA控制器將數(shù)據(jù)從內(nèi)存搬運(yùn)至SPI_DR寄存器。
接收過程:RXNE標(biāo)志置1時觸發(fā)DMA請求,DMA控制器將數(shù)據(jù)從SPI_DR寄存器搬運(yùn)至內(nèi)。
使用DMA發(fā)送和接收的時序圖如下:
1.4.2配置要點(diǎn)
數(shù)據(jù)格式處理
I2S支持多種數(shù)據(jù)格式,DMA需要相應(yīng)配置:
數(shù)據(jù)格式 | DMA傳輸次數(shù) | 備注 |
16位→16位幀 | 1次 | 直接傳輸 |
16位→32位幀 | 1次 | 硬件自動補(bǔ)0 |
24位→32位幀 | 2次 | 硬件補(bǔ)低8位0 |
32位→32位幀 | 2次 | 完整32位處理 |
聲道管理
左聲道數(shù)據(jù)總是先傳輸
通過CHSIDE標(biāo)志識別當(dāng)前聲道
從模式需提前準(zhǔn)備好第一個數(shù)據(jù)
發(fā)送流程
配置DMA:內(nèi)存→SPI_DR,設(shè)置數(shù)據(jù)寬度
啟動傳輸:TXE=1時自動觸發(fā)
聲道切換:根據(jù)CHSIDE處理左右聲道
完成處理:等待TXE=1及BSY=0后關(guān)閉
接收流程
配置DMA:SPI_DR→內(nèi)存,設(shè)置數(shù)據(jù)寬度
啟動傳輸:RXNE=1時自動觸發(fā)
數(shù)據(jù)解析:根據(jù)標(biāo)準(zhǔn)處理數(shù)據(jù)對齊
關(guān)閉時序:按數(shù)據(jù)格式選擇正確時序
2應(yīng)用場景
W55MH32的I2S接口憑借其高質(zhì)量數(shù)字音頻傳輸能力,在眾多領(lǐng)域得到廣泛應(yīng)用:
2.1消費(fèi)類音頻設(shè)備
便攜式音樂播放器:連接音頻DAC實(shí)現(xiàn)高質(zhì)量音樂播放,支持從MP3解碼器到功率放大器的數(shù)字音頻傳輸。
智能音箱:用于主控芯片與數(shù)字音頻處理器之間的連接,實(shí)現(xiàn)語音助手和音樂播放功能。
數(shù)字電視和機(jī)頂盒:傳輸數(shù)字音頻信號到音頻處理芯片或直接驅(qū)動數(shù)字功放。
2.2專業(yè)音頻設(shè)備
錄音設(shè)備:連接高性能ADC實(shí)現(xiàn)多通道音頻采集,支持24位高分辨率錄音。
音頻混音器:在數(shù)字域混合多個音頻源,保持信號完整性。
效果處理器:傳輸音頻數(shù)據(jù)到DSP芯片進(jìn)行實(shí)時效果處理。
2.3通信設(shè)備
VoIP電話:實(shí)現(xiàn)雙向語音通信,同時支持回聲消除等高級功能。
會議系統(tǒng):連接數(shù)字麥克風(fēng)陣列和音頻處理單元。
無線耳機(jī):在藍(lán)牙模塊與編解碼器之間傳輸音頻數(shù)據(jù)。
2.4汽車電子
車載娛樂系統(tǒng):連接多個音頻源和功放,支持環(huán)繞聲處理。
主動降噪系統(tǒng):實(shí)時采集車內(nèi)噪聲并生成反相聲波。
語音識別系統(tǒng):傳輸高清晰度語音數(shù)據(jù)到語音處理單元。
2.5嵌入式系統(tǒng)
工業(yè)控制人機(jī)界面:實(shí)現(xiàn)語音提示和報警功能。
醫(yī)療監(jiān)護(hù)設(shè)備:傳輸心音、呼吸音等生物音頻信號。
智能家居:用于門鈴、對講系統(tǒng)等需要音頻功能的設(shè)備。
3注意事項(xiàng)
時鐘同步:從模式需確保在外部時鐘有效前完成初始化。
數(shù)據(jù)對齊:注意不同標(biāo)準(zhǔn)(Philips/MSB/LSB)的數(shù)據(jù)對齊差異。
PCB布局:時鐘信號線應(yīng)盡量短并考慮端接匹配。
關(guān)閉順序:嚴(yán)格按照規(guī)范流程關(guān)閉接口,避免數(shù)據(jù)損壞。
4程序設(shè)計(jì)
4.1IIS_CS4344例程
IIS_CS4344例程主要實(shí)現(xiàn)了基于W55MH32芯片的I2S音頻傳輸功能。以下是實(shí)現(xiàn)過程和結(jié)果驗(yàn)證:
4.1.1I2S初始化
I2S的初始化函數(shù)為IIS_Configuration()函數(shù):
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); }
該函數(shù)首先使能了相關(guān)時鐘并釋放GPIOA15資源(PA15默認(rèn)為調(diào)試接口,必須先釋放其默認(rèn)的調(diào)試功能,否則,調(diào)試接口會持續(xù)占用該引腳,導(dǎo)致I2S無法正常工作。),然后配置GPIOA15、GPIOB3、GPIOB5和GPIOC7為復(fù)用推挽輸出模式以連接I2S的SCK、SD、WS和MCLK信號,接著將SPI3初始化為I2S模式并設(shè)置為主機(jī)發(fā)送模式,采用飛利浦標(biāo)準(zhǔn)、16位數(shù)據(jù)格式、8kHz采樣率,啟用MCLK輸出和低時鐘極性,最后使能DMA傳輸以提高數(shù)據(jù)效率并激活I(lǐng)2S外設(shè)。
4.1.2DMA初始化
DMA_Configuration()為DMA初始化函數(shù):
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); }
該函數(shù)首先使能了DMA2時鐘,然后將DMA2通道2初始化為從內(nèi)存到外設(shè)的傳輸模式,設(shè)置外設(shè)基址為SPI3的數(shù)據(jù)寄存器(用于I2S通信),內(nèi)存基址為音頻數(shù)據(jù)緩沖區(qū)I2S3_Buffer_Tx,配置傳輸方向?yàn)閮?nèi)存到外設(shè)、緩沖區(qū)大小為BufferSize,禁用外設(shè)地址自增、啟用內(nèi)存地址自增,設(shè)置數(shù)據(jù)寬度為半字(16位,與I2S數(shù)據(jù)格式匹配),采用循環(huán)模式確保連續(xù)傳輸,設(shè)置優(yōu)先級為非常高,禁用內(nèi)存到內(nèi)存模式,最后使能傳輸完成中斷并暫時禁用DMA通道。
4.1.3中斷配置函數(shù)
NVIC_Configuration()為NVIC(嵌套向量中斷控制器)的配置函數(shù):
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); }
該函數(shù)首先定義NVIC了初始化結(jié)構(gòu)體,然后將中斷通道設(shè)置為DMA2通道2(對應(yīng)I2S3的TX DMA傳輸),配置搶占優(yōu)先級和子優(yōu)先級均為0(最高優(yōu)先級),使能該中斷通道,最后調(diào)用初始化函數(shù)完成配置,整體實(shí)現(xiàn)了對DMA2通道2傳輸完成事件的高優(yōu)先級中斷響應(yīng)設(shè)置,確保音頻數(shù)據(jù)傳輸中斷能被及時處理。
4.1.4中斷服務(wù)函數(shù)
DMA2_Channel2_IRQHandler()為DMA2通道2的中斷服務(wù)函數(shù):
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),若是則清除中斷掛起位和完成標(biāo)志位,禁用DMA2通道2以暫停傳輸,最后將標(biāo)志位Flag置1以通知主程序數(shù)據(jù)已傳輸完畢,整體實(shí)現(xiàn)了對I2S音頻數(shù)據(jù)DMA傳輸完成的響應(yīng)處理,確保在數(shù)據(jù)發(fā)送完成后能進(jìn)行必要的狀態(tài)更新和后續(xù)操作。
4.1.5數(shù)據(jù)處理函數(shù)
DATA_Processing()是數(shù)據(jù)處理函數(shù),通過以下步驟實(shí)現(xiàn)將8位數(shù)據(jù)轉(zhuǎn)換為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]; } }
程序首先定義循環(huán)計(jì)數(shù)器,然后對長度為DATA_LEN的8位數(shù)據(jù)源數(shù)組DATA進(jìn)行遍歷,每次取連續(xù)的兩個8位數(shù)據(jù),將前一個左移8位后與后一個按位或運(yùn)算,組合成一個16位數(shù)據(jù)存入目標(biāo)數(shù)組I2S3_Buffer_Tx中,整體實(shí)現(xiàn)了將8位原始數(shù)據(jù)轉(zhuǎn)換為適合I2S傳輸?shù)?6位數(shù)據(jù)格式,確保音頻數(shù)據(jù)能夠正確地通過I2S接口發(fā)送。
4.1.6主程序
主程序main()通過以下步驟實(shí)現(xiàn)I2S音頻數(shù)據(jù)的持續(xù)傳輸:
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.1fMhzn", (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 Successn"); Flag=0; DMA_Configuration(); DMA_Cmd(DMA2_Channel2, ENABLE); } } }
程序首先初始化系統(tǒng)時鐘和延時函數(shù),配置115200波特率的UART用于調(diào)試信息輸出,獲取并打印系統(tǒng)各時鐘頻率;接著依次配置I2S接口、DMA通道、NVIC中斷控制器,并將8位原始數(shù)據(jù)處理為16位格式以適配I2S傳輸;然后啟用DMA通道開始數(shù)據(jù)傳輸;最后在主循環(huán)中檢測傳輸完成標(biāo)志Flag,若置1則打印成功信息、重置標(biāo)志,重新配置并啟用DMA通道以實(shí)現(xiàn)循環(huán)傳輸,整體實(shí)現(xiàn)了通過I2S接口持續(xù)發(fā)送音頻數(shù)據(jù)的功能。
4.1.7下載驗(yàn)證
程序下載運(yùn)行后,首先打印了系統(tǒng)各時鐘的頻率和示例名稱,然后每發(fā)送成功一次I2S數(shù)據(jù)就會打印數(shù)據(jù)發(fā)送成功的信息:
此時我們接上DAC音頻轉(zhuǎn)換器、戴上耳機(jī)就能持續(xù)聽到“微信到賬100萬元”的音頻內(nèi)容。
4.2IIS_Dma例程
IIS_Dma例程通過I2S接口和DMA傳輸機(jī)制,發(fā)送預(yù)設(shè)的音頻數(shù)據(jù)。該例程的I2S初始化、DMA初始化、中斷配置函數(shù)與IIS_CS4344例程保持一致,這里不再贅述。其他程序設(shè)計(jì)如下:
4.2.1發(fā)送數(shù)據(jù)
I2S3_Buffer_Tx為需要發(fā)送的測試數(shù)據(jù):
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中斷服務(wù)函數(shù)
DMA2_Channel2_IRQHandler是W55MH32中DMA2通道2的中斷處理函數(shù):
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; } }
當(dāng)DMA完成預(yù)設(shè)的32個16位數(shù)據(jù)傳輸后觸發(fā)。函數(shù)首先檢查傳輸完成中斷狀態(tài),若中斷已觸發(fā)則清除中斷掛起位和傳輸完成標(biāo)志,避免重復(fù)響應(yīng);接著禁用DMA2通道2,停止數(shù)據(jù)傳輸;最后將全局標(biāo)志位Flag置1,通知主程序DMA傳輸已完成,主循環(huán)檢測到該標(biāo)志后會輸出成功信息并重置標(biāo)志。此函數(shù)實(shí)現(xiàn)了DMA傳輸?shù)闹袛囗憫?yīng)與狀態(tài)反饋,是I2S音頻數(shù)據(jù)傳輸流程中的關(guān)鍵環(huán)節(jié)。
4.2.3主程序
主程序main()通過以下步驟實(shí)現(xiàn)I2S音頻數(shù)據(jù)的傳輸:
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.1fMhzn", (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 Successn"); Flag=0; } } }
程序首先初始化系統(tǒng)時鐘、UART調(diào)試接口并打印時鐘信息,接著配置I2S接口(復(fù)用SPI3)、DMA2通道2(循環(huán)模式)和NVIC中斷控制器,隨后啟用DMA開始將預(yù)設(shè)的32個16位音頻數(shù)據(jù)循環(huán)傳輸?shù)絀2S接口,主循環(huán)持續(xù)檢測DMA傳輸完成標(biāo)志位Flag,當(dāng)Flag被中斷處理函數(shù)置1時,打印傳輸成功信息并重置標(biāo)志,不過因中斷處理函數(shù)中禁用了DMA通道,實(shí)際數(shù)據(jù)僅能傳輸一次,此代碼常用于音頻設(shè)備初始化測試。
4.2.4下載驗(yàn)證
程序下載運(yùn)行后,首先打印了系統(tǒng)各時鐘的頻率和示例名稱,然后I2S數(shù)據(jù)發(fā)送成功后打印數(shù)據(jù)發(fā)送成功的信息:
通過邏輯分析儀就可以解析出發(fā)送的數(shù)據(jù):
首幀和尾幀的數(shù)據(jù)實(shí)際已經(jīng)可以看到有數(shù)據(jù)脈沖信號,未解析屬于硬件初始化特性(FIFO填充)或解析器同步延遲原因,不影響實(shí)際音頻功能。
4.3IIS_Int例程
IIS_Int例程通過I2S接口和中斷控制器實(shí)現(xiàn)音頻數(shù)據(jù)的中斷驅(qū)動傳輸。其他程序設(shè)計(jì)如下:
4.3.1 I2S初始化
IIS_Configuration()函數(shù)用于初始化W55MH32的I2S接口(復(fù)用SPI3外設(shè))及中斷配置,其內(nèi)容如下:
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); }
函數(shù)首先使能GPIOA/B/C和SPI3的時鐘,配置相關(guān)引腳為復(fù)用推挽輸出(包括數(shù)據(jù)輸出、字選擇、串行時鐘和主時鐘引腳);接著配置NVIC中斷控制器,設(shè)置SPI3中斷的優(yōu)先級并使能中斷;然后重置SPI3并設(shè)置I2S參數(shù),包括主發(fā)送模式、飛利浦標(biāo)準(zhǔn)、16位數(shù)據(jù)格式、8kHz采樣率、低時鐘極性和主時鐘輸出;最后啟用發(fā)送緩沖區(qū)空中斷(TXE)并使能I2S外設(shè)。該配置適用于簡單音頻發(fā)送場景,通過中斷驅(qū)動方式實(shí)現(xiàn)數(shù)據(jù)傳輸。
4.3.2 中斷服務(wù)函數(shù)
SPI3_IRQHandler()是SPI3外設(shè)的中斷處理函數(shù),用于處理I2S發(fā)送緩沖區(qū)空(TXE)事件,函數(shù)內(nèi)容如下:
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); } }
當(dāng)檢測到TXE標(biāo)志置位時,函數(shù)從預(yù)設(shè)的32元素數(shù)據(jù)緩沖區(qū)I2S3_Buffer_Tx中讀取一個16位數(shù)據(jù)發(fā)送到I2S接口,并遞增索引TxIdx;當(dāng)TxIdx達(dá)到32時,表示所有數(shù)據(jù)發(fā)送完畢,函數(shù)禁用TXE中斷以停止傳輸。該函數(shù)實(shí)現(xiàn)了基于中斷的單次數(shù)據(jù)塊發(fā)送,適用于小規(guī)模固定數(shù)據(jù)的傳輸場景。
4.3.3 主程序
以下為該例程的主程序,用于測試I2S接口的中斷驅(qū)動數(shù)據(jù)發(fā)送功能:
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.1fMhzn", (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); }
程序先初始化延時函數(shù)和UART1串口,獲取并打印系統(tǒng)各時鐘頻率,然后初始化I2S接口(配置GPIO、中斷及I2S參數(shù)),最后進(jìn)入無限循環(huán),數(shù)據(jù)發(fā)送由I2S發(fā)送緩沖區(qū)空中斷驅(qū)動,主程序不參與具體傳輸邏輯。
4.3.4 下載驗(yàn)證
程序下載運(yùn)行后,首先打印了系統(tǒng)各時鐘的頻率和示例名稱,I2S觸發(fā)中斷之后開始發(fā)送數(shù)據(jù),數(shù)據(jù)緩沖區(qū)有數(shù)據(jù)之后便不再觸發(fā):
邏輯分析儀解析數(shù)據(jù)如下:
同樣的,首幀和尾幀的數(shù)據(jù)實(shí)際也已經(jīng)可以看到有數(shù)據(jù)脈沖信號,未解析屬于硬件初始化特性(FIFO填充)或解析器同步延遲原因,不影響實(shí)際音頻功能。
5總結(jié)
W55MH32的I2S接口為數(shù)字音頻應(yīng)用提供了強(qiáng)大而靈活的解決方案。通過與SPI模塊共享硬件資源,它既實(shí)現(xiàn)了專用音頻接口的高性能,又保持了設(shè)計(jì)的經(jīng)濟(jì)性。支持多種音頻標(biāo)準(zhǔn)和數(shù)據(jù)格式使其能夠與絕大多數(shù)音頻編解碼器無縫協(xié)作,滿足從消費(fèi)電子到專業(yè)音頻設(shè)備的各種需求。
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器iMCU?,它采用TOE(TCP/IP卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
WIZnet
+關(guān)注
關(guān)注
3文章
20瀏覽量
42644 -
音頻傳輸
+關(guān)注
關(guān)注
0文章
50瀏覽量
12379 -
I2S
+關(guān)注
關(guān)注
1文章
77瀏覽量
43690
發(fā)布評論請先 登錄
音頻總線I2S協(xié)議:I2S收發(fā)模塊FPGA的仿真設(shè)計(jì)

「正點(diǎn)原子NANO STM32開發(fā)板資料連載」第三十五章 USB 虛擬串口實(shí)驗(yàn)
音頻接口I2S實(shí)驗(yàn)
模擬電路網(wǎng)絡(luò)課件 第三十五節(jié):負(fù)反饋放大電路的穩(wěn)定問題
基于FPGA和AD1836的I2S接口設(shè)計(jì)
I2S接口工作原理_I2S接口介紹

數(shù)字接口I2S數(shù)據(jù)傳輸模式和應(yīng)用框圖
stm32 讀取sd卡圖片顯示_「正點(diǎn)原子STM32Mini板資料連載」第三十五章 漢字顯示實(shí)驗(yàn)...

【正點(diǎn)原子FPGA連載】第三十五章高速AD/DA實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開發(fā)指南_V2.1

基于I2S接口的Linux內(nèi)核音頻技術(shù)

科普小課堂 | 5分鐘讀懂I2S、SPDIF數(shù)字音頻傳輸協(xié)議

從藍(lán)牙音頻模塊中了解I2S的主端和從端功能應(yīng)用

評論