


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.課 程 設(shè) 計(jì) 報(bào) 告課程設(shè)計(jì)名稱: 音樂播放器 院 系: 信息工程學(xué)院 學(xué)生姓名:班 級(jí):學(xué) 號(hào):成 績(jī):指導(dǎo)教師:開課時(shí)間: 2016-2017 學(xué)年 2 學(xué)期. v.音樂播放器一、實(shí)踐的內(nèi)容和要求1.1實(shí)驗(yàn)內(nèi)容學(xué)習(xí)WAV格式音頻播放原理、數(shù)字音頻接口及的相關(guān)知識(shí)。了解模擬音頻信號(hào)和數(shù)字音頻信號(hào)的概念。掌握編寫音頻播主要內(nèi)容 放器的方法。實(shí)現(xiàn)音頻播放,小鍵盤輸入操作。1.2實(shí)驗(yàn)要求本系統(tǒng)要做一個(gè)音樂播放器,使用通用定時(shí)器定時(shí),用比較輸出功能,輸出樂譜頻率的方波產(chǎn)生聲音,對(duì) 3 首歌曲編碼, 其支持 WAV 格式音頻播放(上鍵:暫停;左鍵:上一首;右鍵:下一首)。利用硬件ARM 嵌入式開發(fā)
2、平臺(tái)、 用于 ARM7TDMI 的 JTAG 仿 真器、PC 機(jī) Pentium100開發(fā)實(shí)現(xiàn)實(shí)現(xiàn)音頻播放。主要實(shí)現(xiàn):上一首按鍵:當(dāng)點(diǎn)擊上一首按鍵時(shí),當(dāng)前播放歌曲的上 一首歌首被播放。下一首按鍵:當(dāng)點(diǎn)擊下一首按鍵時(shí),當(dāng)前播放歌曲的下一首歌曲即被 播放。當(dāng)點(diǎn)擊停止鍵時(shí),當(dāng)前歌曲即會(huì)被停止。 播放界面設(shè)計(jì): 在歌曲進(jìn)行播放時(shí), 界面應(yīng)包含所有的按鍵, 并且要歌曲的曲目單。2、 實(shí)踐原理WAV播放器系統(tǒng)要求能夠?qū)p3、wav格式的音頻文件進(jìn)行解碼,處理起來(lái)速度是有要求的,尤其是對(duì)320Kbps的MP3格式數(shù)據(jù)流的處理,必須非???,才能實(shí)現(xiàn)MP3的流暢播放,可供選擇的八位機(jī)有AVR、PIC,可供選擇
3、的32位處理器有SAMSUNG、STM32、ATMEL等。選擇MCU優(yōu)先考慮于擁有豐富的RAM,八位機(jī)RAM主要靠擴(kuò)展,內(nèi)部RAM一般在4Kbyte以內(nèi),32位機(jī)里面,SAMSUNG一般不內(nèi)帶RAM,也要外擴(kuò)。本實(shí)驗(yàn)使用了ARM7處理器,MP3解碼可以有兩種方法,一是通過ARM處理器軟解碼,通過對(duì)MP3數(shù)據(jù)格式的解析實(shí)現(xiàn)MP3播放,二是通過外部解碼芯片直接解碼。第一種方法在解碼高碼率的MP3時(shí),ARM7處理能力吃緊,而且STM32還需要外部DAC來(lái)做音頻輸出,所以采用第二種方法進(jìn)行解碼。MP3常見的解碼芯片有VS100X系列和STA01系列,STA01需要外接DAC做音頻輸出,而VS1003自
4、帶DAC,且解碼的文件格式包含mp3和wav,另外它還可以實(shí)現(xiàn)錄音功能,方便以后進(jìn)行功能的拓展應(yīng)用。三、實(shí)踐步驟3.1功能設(shè)計(jì)開機(jī)后,先初始化各外設(shè),然后檢測(cè)字庫(kù)文件夾是否存在,如果有問題,則提示Error,如果檢測(cè)無(wú)問題,則開始循環(huán)播放 SD卡內(nèi)MUSIC 文件夾里面的歌曲,在 TFTLCD 上顯示歌曲名字、播放時(shí)間、歌曲總時(shí)間、歌曲數(shù)目、當(dāng)前歌曲的編號(hào)等信息。KEY0選擇下一首,KEY2 選擇上一首,KEY_UP 控制暫停/繼續(xù)播放。3.2實(shí)驗(yàn)步驟1)初始化 WM8978,這個(gè)過程包括軟復(fù)位、DAC 設(shè)置、輸出設(shè)置 和音量設(shè)置等。2)初始化 I2S,此過程主要設(shè)置 SPI_I2SCFGR
5、寄存器,設(shè)置 I2S 模式、I2S 標(biāo)準(zhǔn)、時(shí)鐘空閑電平和數(shù)據(jù)幀長(zhǎng)等,最后開啟 I2S TX DMA,使能 I2S 外設(shè)。 在庫(kù)函數(shù)中初始化 I2S 調(diào)用的函數(shù)為:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); 結(jié)構(gòu)體 I2S_InitTypeDef 的定義為: typedef struct uint16_t I2S_Mode; uint16_t I2S_Standard; uint16_t I2S_DataFormat; uint16_t I2S_MCLKOutput; uint32_t I2S_AudioF
6、req; uint16_t I2S_CPOL; I2S_InitTypeDef; 第一個(gè)參數(shù)用來(lái)設(shè)置 I2S 的模式,也就是設(shè)置 SPI_I2SCFGR 寄存器的 I2SCFG 相關(guān)位??梢耘渲脼橹髂J桨l(fā)送 I2S_Mode_MasterTx,主模式接受 I2S_Mode_MasterRx,從模式發(fā)送 I2S_Mode_SlaveTx 以及從模式接受 I2S_Mode_SlaveRx 四種模式。第二個(gè)參數(shù) I2S_Standard 用來(lái)設(shè)置 I2S 標(biāo)準(zhǔn),這個(gè)前面已經(jīng)講解過。可以設(shè)置為:飛利浦 標(biāo)準(zhǔn) I2S_Standard_Phillips,MSB 對(duì)齊標(biāo)準(zhǔn) I2S_Standard_MSB
7、,LSB 對(duì)齊標(biāo)準(zhǔn)I2S_Standard_LSB 以及 PCM 標(biāo)準(zhǔn) I2S_Standard_PCMShort。 第三個(gè)參數(shù) I2S_DataFormat 用來(lái)設(shè)置 I2S 的數(shù)據(jù)通信格式。這里實(shí)際包含設(shè)置 SPI_I2SCFGR 寄存器的 HCLEN 位(通道長(zhǎng)度)以及 DATLEN 位(傳輸?shù)臄?shù)據(jù)長(zhǎng)度)。當(dāng)我們 設(shè)置為 16 位標(biāo)準(zhǔn)格式 I2S_DataFormat_16b 的時(shí)候,實(shí)際上傳輸?shù)臄?shù)據(jù)長(zhǎng)度為 16 位,通道長(zhǎng)度 為 16 位。當(dāng)我們?cè)O(shè)置為其他值的時(shí)候,通道長(zhǎng)度都為 32 位。第四個(gè)參數(shù) I2S_MCLKOutput用來(lái)設(shè)置是否使能主時(shí)鐘輸出。我們實(shí)驗(yàn)會(huì)使能主時(shí)鐘輸出。第五
8、個(gè)參數(shù) I2S_AudioFreq 用來(lái)設(shè)置 I2S頻率。實(shí)際根據(jù)輸入的頻率值,會(huì)來(lái)計(jì)算 SPI 預(yù) 分頻寄存器 SPI_I2SPR 的預(yù)分頻奇數(shù)因子以及 I2S 線性預(yù)分頻器的值。這里支持 10 中頻率: *define I2S_AudioFreq_192k (uint32_t)192000) *define I2S_AudioFreq_96k (uint32_t)96000) *define I2S_AudioFreq_48k (uint32_t)48000) *define I2S_AudioFreq_44k (uint32_t)44100)*define I2S_AudioFreq_3
9、2k (uint32_t)32000)*define I2S_AudioFreq_22k (uint32_t)22050) *define I2S_AudioFreq_16k (uint32_t)16000) *define I2S_AudioFreq_11k (uint32_t)11025)*define I2S_AudioFreq_8k (uint32_t)8000) *define I2S_AudioFreq_Default (uint32_t)2) 第六個(gè)參數(shù) I2S_CPOL 用來(lái)設(shè)置空閑狀態(tài)時(shí)鐘電平,取值為高電平 I2S_CPOL_High 以及低電平 I2S_CPOL_Low。
10、3) 解析 WAV 文件,獲取音頻信號(hào)采樣率和位數(shù)并設(shè)置 I2S 時(shí)鐘分頻器這里,要先解析 WAV 文件,取得音頻信號(hào)的采樣率(fs)和位數(shù)(16 位或 32 位),根據(jù)這兩個(gè)參數(shù),來(lái)設(shè)置 I2S 的時(shí)鐘分頻,這里我們用前面介紹的查表法來(lái)設(shè)置即可。這是我們單獨(dú)寫了一個(gè)設(shè)置頻率的函數(shù)為 I2S2_SampleRate_Set。 4)設(shè)置 DMA I2S 播放音頻的時(shí)候,一般都是通過 DMA 來(lái)傳輸數(shù)據(jù)的,所以必須配置 DMA,本章我們用 I2S2,其 TX是使用的 DMA1 數(shù)據(jù)流 4 的通道 0 來(lái)傳輸?shù)?。并且STM32F4 的 DMA 具有雙緩沖機(jī)制,這樣可以提高效率,大大方便了我們的數(shù)據(jù)傳
11、輸,本章將 DMA1 數(shù)據(jù)流 4 設(shè)置為:雙緩沖循環(huán)模式,外設(shè)和存儲(chǔ)器都是 16 位寬,并開啟 DMA 傳輸完成中斷(方便填充數(shù)據(jù))。 5)編寫 DMA 傳輸完成中斷服務(wù)函數(shù)為了方便填充音頻數(shù)據(jù),我們使用 DMA 傳輸完成中斷,每當(dāng)一個(gè)緩沖數(shù)據(jù)發(fā)送完后,硬件自動(dòng)切換為下一個(gè)緩沖,同時(shí)進(jìn)入中斷服務(wù)函數(shù),填充數(shù)據(jù)到發(fā)送完的這個(gè)緩沖。 6)開啟 DMA 傳輸,填充數(shù)據(jù) 最后,我們就只需要開啟 DMA 傳輸,然后及時(shí)填充 WAV 數(shù)據(jù)到 DMA 的兩個(gè)緩存區(qū)即 可。此時(shí),就可以在 WM8978 的耳機(jī)和喇叭通道聽到所播放音樂了。操作方法為: DMA_Cmd(DMA1_Stream4,ENABLE);/
12、開啟 DMA TX 傳輸,開始播放。3.3流程圖3.4關(guān)鍵代碼I2s.c代碼:*include "i2s.h" *include "usart.h"void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat) I2S_InitTypeDef I2S_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);/使能SPI2時(shí)鐘RCC_APB1PeriphResetCmd(
13、RCC_APB1Periph_SPI2,ENABLE); /復(fù)位SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);/結(jié)束復(fù)位I2S_InitStructure.I2S_Mode=I2S_Mode;/IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;/IIS標(biāo)準(zhǔn)I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;/IIS數(shù)據(jù)長(zhǎng)度I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;/主時(shí)
14、鐘輸出禁止I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;/IIS頻率設(shè)置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;/空閑狀態(tài)時(shí)鐘電平I2S_Init(SPI2,&I2S_InitStructure);/初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);/SPI2 TX DMA請(qǐng)求使能. I2S_Cmd(SPI2,ENABLE);/SPI2 I2S EN使能. /采樣率計(jì)算公式:Fs=I2SxCLK/256*(2*I2SDI
15、V+ODD)/I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR/一般HSE=8Mhz /pllm:在Sys_Clock_Set設(shè)置的時(shí)候確定,一般是8/PLLI2SN:一般是192432 /PLLI2SR:27/I2SDIV:2255/ODD:0/1/I2S分頻系數(shù)表pllm=8,HSE=8Mhz,即vco輸入頻率為1Mhz/表格式:采樣率/10,PLLI2SN,PLLI2SR,I2SDIV,ODDconst u16 I2S_PSC_TBL5=800 ,256,5,12,1,/8Khz采樣率1102,429,4,19,0,/11.025Khz采樣率 1600,213,2,1
16、3,0,/16Khz采樣率2205,429,4, 9,1,/22.05Khz采樣率3200,213,2, 6,1,/32Khz采樣率4410,271,2, 6,0,/44.1Khz采樣率4800,258,3, 3,1,/48Khz采樣率8820,316,2, 3,1,/88.2Khz采樣率9600,344,2, 3,1, /96Khz采樣率17640,361,2,2,0, /176.4Khz采樣率 19200,393,2,2,0, /192Khz采樣率; /設(shè)置IIS的采樣率(MCKEN)/samplerate:采樣率,單位:Hz/返回值:0,設(shè)置成功;1,無(wú)法設(shè)置.u8 I2S2_Sampl
17、eRate_Set(u32 samplerate) u8 i=0; u32 tempreg=0;samplerate/=10;/縮小10倍 for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i+)/看看改采樣率是否可以支持if(samplerate=I2S_PSC_TBLi0)break;RCC_PLLI2SCmd(DISABLE);/先關(guān)閉PLLI2Sif(i=(sizeof(I2S_PSC_TBL)/10)return 1;/搜遍了也找不到RCC_PLLI2SConfig(u32)I2S_PSC_TBLi1,(u32)I2S_PSC_TBLi2);/設(shè)置I2SxC
18、LK的頻率(x=2) 設(shè)置PLLI2SN PLLI2SRRCC->CR|=1<<26;/開啟I2S時(shí)鐘while(RCC->CR&1<<27)=0);/等待I2S時(shí)鐘開啟成功. tempreg=I2S_PSC_TBLi3<<0;/設(shè)置I2SDIVtempreg|=I2S_PSC_TBLi4<<8;/設(shè)置ODD位tempreg|=1<<9;/使能MCKOE位,輸出MCKSPI2->I2SPR=tempreg;/設(shè)置I2SPR寄存器 return 0; /I2S2 TX DMA配置/設(shè)置為雙緩沖模式,并開啟DMA
19、傳輸完成中斷/buf0:M0AR地址./buf1:M1AR地址./num:每次傳輸數(shù)據(jù)量void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num) NVIC_InitTypeDef NVIC_InitStructure;DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);/DMA1時(shí)鐘使能 DMA_DeInit(DMA1_Stream4);while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE)/
20、等待DMA1_Stream1可配置 /* 配置 DMA Stream */ DMA_InitStructure.DMA_Channel = DMA_Channel_0; /通道0 SPI2_TX通道 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;/外設(shè)地址為:(u32)&SPI2->DR DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;/DMA 存儲(chǔ)器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryTo
21、Peripheral;/存儲(chǔ)器到外設(shè)模式 DMA_InitStructure.DMA_BufferSize = num;/數(shù)據(jù)傳輸量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外設(shè)非增量模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/存儲(chǔ)器增量模式 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/外設(shè)數(shù)據(jù)長(zhǎng)度:16位 DMA_InitS
22、tructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/存儲(chǔ)器數(shù)據(jù)長(zhǎng)度:16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/ 使用循環(huán)模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;/高優(yōu)先級(jí) DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /不使用FIFO模式 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThre
23、shold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/外設(shè)突發(fā)單次傳輸 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/存儲(chǔ)器突發(fā)單次傳輸 DMA_Init(DMA1_Stream4, &DMA_InitStructure);/初始化DMA StreamDMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);/雙緩沖模式配置
24、 DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);/雙緩沖模式開啟 DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);/開啟傳輸完成中斷NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;/搶占優(yōu)先級(jí)0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;/子優(yōu)先級(jí)0 NVIC_Ini
25、tStructure.NVIC_IRQChannelCmd = ENABLE;/使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);/配置 /I2S DMA回調(diào)函數(shù)指針void (*i2s_tx_callback)(void);/TX回調(diào)函數(shù) /DMA1_Stream4中斷服務(wù)函數(shù)void DMA1_Stream4_IRQHandler(void) if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)=SET)/DMA1_Stream4,傳輸完成標(biāo)志 DMA_ClearITPendingBit(DMA1_Stream4,
26、DMA_IT_TCIF4); i2s_tx_callback();/執(zhí)行回調(diào)函數(shù),讀取數(shù)據(jù)等操作在這里面處理 /I2S開始播放void I2S_Play_Start(void) DMA_Cmd(DMA1_Stream4,ENABLE);/開啟DMA TX傳輸,開始播放 /關(guān)閉I2S播放void I2S_Play_Stop(void) DMA_Cmd(DMA1_Stream4,DISABLE);/關(guān)閉DMA,結(jié)束播放 wm8978代碼:*include "wm8978.h"*include "myiic.h"*include "delay.h&q
27、uot;static u16 WM8978_REGVAL_TBL58=0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000,0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF,0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000,0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0038,0X000B,0X0032,0X0000,0X0008,0X000C
28、,0X0093,0X00E9,0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100,0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039,0X0001,0X0001; /WM8978初始化/返回值:0,初始化正常/ 其他,錯(cuò)誤代碼u8 WM8978_Init(void)u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC
29、, ENABLE);/使能外設(shè)GPIOB,GPIOC時(shí) /PB12/13 復(fù)用功能輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復(fù)用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_U
30、P;/上拉 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化/PC2/PC3/PC6復(fù)用功能輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復(fù)用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/推挽 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/100MHz GPIO_I
31、nitStructure.GPIO_PuPd = GPIO_PuPd_UP;/上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);/初始化GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); /PB12,AF5 I2S_LRCKGPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);/PB13,AF5 I2S_SCLK GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2);/PC3 ,AF5 I2S
32、_DACDATA GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2);/PC6 ,AF5 I2S_MCKGPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2);/PC2 ,AF6 I2S_ADCDATA I2S2ext_SD是AF6!IIC_Init();/初始化IIC接口res=WM8978_Write_Reg(0,0);/軟復(fù)位WM8978if(res)return 1;/發(fā)送指令失敗,WM8978異常/以下為通用設(shè)置WM8978_Write_Reg(1,0X1B);/R1,MICEN
33、設(shè)置為1(MIC使能),BIASEN設(shè)置為1(模擬器工作),VMIDSEL1:0設(shè)置為:11(5K)WM8978_Write_Reg(2,0X1B0);/R2,ROUT1,LOUT1輸出使能(耳機(jī)可以工作),BOOSTENR,BOOSTENL使能WM8978_Write_Reg(3,0X6C);/R3,LOUT2,ROUT2輸出使能(喇叭工作),RMIX,LMIX使能WM8978_Write_Reg(6,0);/R6,MCLK由外部提供WM8978_Write_Reg(43,1<<4);/R43,INVROUT2反向,驅(qū)動(dòng)喇叭WM8978_Write_Reg(47,1<<
34、;8);/R47設(shè)置,PGABOOSTL,左通道MIC獲得20倍增益WM8978_Write_Reg(48,1<<8);/R48設(shè)置,PGABOOSTR,右通道MIC獲得20倍增益WM8978_Write_Reg(49,1<<1);/R49,TSDEN,開啟過熱保護(hù) WM8978_Write_Reg(10,1<<3);/R10,SOFTMUTE關(guān)閉,128x采樣,最佳SNR WM8978_Write_Reg(14,1<<3);/R14,ADC 128x采樣率return 0; /WM8978寫寄存器/reg:寄存器地址/val:要寫入寄存器的值
35、/返回值:0,成功;/ 其他,錯(cuò)誤代碼u8 WM8978_Write_Reg(u8 reg,u16 val) IIC_Start(); IIC_Send_Byte(WM8978_ADDR<<1)|0);/發(fā)送器件地址+寫命令 if(IIC_Wait_Ack()return 1;/等待應(yīng)答(成功"/失敗") IIC_Send_Byte(reg<<1)|(val>>8)&0X01);/寫寄存器地址+數(shù)據(jù)的最高位if(IIC_Wait_Ack()return 2;/等待應(yīng)答(成功"/失敗") IIC_Send_Byt
36、e(val&0XFF);/發(fā)送數(shù)據(jù)if(IIC_Wait_Ack()return 3;/等待應(yīng)答(成功"/失敗") IIC_Stop();WM8978_REGVAL_TBLreg=val;/保存寄存器值到本地return 0; /WM8978讀寄存器/就是讀取本地寄存器值緩沖區(qū)內(nèi)的對(duì)應(yīng)值/reg:寄存器地址 /返回值:寄存器值u16 WM8978_Read_Reg(u8 reg) return WM8978_REGVAL_TBLreg; /WM8978 DAC/ADC配置/adcen:adc使能(1)/關(guān)閉(0)/dacen:dac使能(1)/關(guān)閉(0)void W
37、M8978_ADDA_Cfg(u8 dacen,u8 adcen)u16 regval;regval=WM8978_Read_Reg(3);/讀取R3if(dacen)regval|=3<<0;/R3最低2個(gè)位設(shè)置為1,開啟DACR&DACLelse regval&=(3<<0);/R3最低2個(gè)位清零,關(guān)閉DACR&DACL.WM8978_Write_Reg(3,regval);/設(shè)置R3regval=WM8978_Read_Reg(2);/讀取R2if(adcen)regval|=3<<0;/R2最低2個(gè)位設(shè)置為1,開啟ADCR&a
38、mp;ADCLelse regval&=(3<<0);/R2最低2個(gè)位清零,關(guān)閉ADCR&ADCL.WM8978_Write_Reg(2,regval);/設(shè)置R2/WM8978 輸入通道配置 /micen:MIC開啟(1)/關(guān)閉(0)/lineinen:Line In開啟(1)/關(guān)閉(0)/auxen:aux開啟(1)/關(guān)閉(0) void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen)u16 regval; regval=WM8978_Read_Reg(2);/讀取R2if(micen)regval|=3<&
39、lt;2;/開啟INPPGAENR,INPPGAENL(MIC的PGA放大)else regval&=(3<<2);/關(guān)閉INPPGAENR,INPPGAENL. WM8978_Write_Reg(2,regval);/設(shè)置R2 regval=WM8978_Read_Reg(44);/讀取R44if(micen)regval|=3<<4|3<<0;/開啟LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.else regval&=(3<<4|3<<0);/關(guān)閉LIN2INPPGA,LIP
40、2INPGA,RIN2INPPGA,RIP2INPGA.WM8978_Write_Reg(44,regval);/設(shè)置R44if(lineinen)WM8978_LINEIN_Gain(5);/LINE IN 0dB增益else WM8978_LINEIN_Gain(0);/關(guān)閉LINE INif(auxen)WM8978_AUX_Gain(7);/AUX 6dB增益else WM8978_AUX_Gain(0);/關(guān)閉AUX輸入 /WM8978 輸出配置 /dacen:DAC輸出(放音)開啟(1)/關(guān)閉(0)/bpsen:Bypass輸出(錄音,包括MIC,LINE IN,AUX等)開啟(1
41、)/關(guān)閉(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen)u16 regval=0;if(dacen)regval|=1<<0;/DAC輸出使能if(bpsen)regval|=1<<1;/BYPASS使能regval|=5<<2;/0dB增益 WM8978_Write_Reg(50,regval);/R50設(shè)置WM8978_Write_Reg(51,regval);/R51設(shè)置 /WM8978 MIC增益設(shè)置(不包括BOOST的20dB,MIC->ADC輸入部分的增益)/gain:063,對(duì)應(yīng)-12dB35.2
42、5dB,0.75dB/Stepvoid WM8978_MIC_Gain(u8 gain)gain&=0X3F;WM8978_Write_Reg(45,gain);/R45,左通道PGA設(shè)置 WM8978_Write_Reg(46,gain|1<<8);/R46,右通道PGA設(shè)置/WM8978 L2/R2(也就是Line In)增益設(shè)置(L2/R2->ADC輸入部分的增益)/gain:07,0表示通道禁止,17,對(duì)應(yīng)-12dB6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain)u16 regval;gain&=0X07;reg
43、val=WM8978_Read_Reg(47);/讀取R47regval&=(7<<4);/清除原來(lái)的設(shè)置 WM8978_Write_Reg(47,regval|gain<<4);/設(shè)置R47regval=WM8978_Read_Reg(48);/讀取R48regval&=(7<<4);/清除原來(lái)的設(shè)置 WM8978_Write_Reg(48,regval|gain<<4);/設(shè)置R48 /WM8978 AUXR,AUXL(PWM音頻部分)增益設(shè)置(AUXR/L->ADC輸入部分的增益)/gain:07,0表示通道禁止,17
44、,對(duì)應(yīng)-12dB6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain)u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);/讀取R47regval&=(7<<0);/清除原來(lái)的設(shè)置 WM8978_Write_Reg(47,regval|gain<<0);/設(shè)置R47regval=WM8978_Read_Reg(48);/讀取R48regval&=(7<<0);/清除原來(lái)的設(shè)置 WM8978_Write_Reg(48,regval|gain<<0);/
45、設(shè)置R48 /設(shè)置I2S工作模式/fmt:0,LSB(右對(duì)齊);1,MSB(左對(duì)齊);2,飛利浦標(biāo)準(zhǔn)I2S;3,PCM/DSP;/len:0,16位;1,20位;2,24位;3,32位; void WM8978_I2S_Cfg(u8 fmt,u8 len)fmt&=0X03;len&=0X03;/限定范圍WM8978_Write_Reg(4,(fmt<<3)|(len<<5);/R4,WM8978工作模式設(shè)置/設(shè)置耳機(jī)左右聲道音量/voll:左聲道音量(063)/volr:右聲道音量(063)void WM8978_HPvol_Set(u8 voll,u
46、8 volr)voll&=0X3F;volr&=0X3F;/限定范圍if(voll=0)voll|=1<<6;/音量為0時(shí),直接muteif(volr=0)volr|=1<<6;/音量為0時(shí),直接mute WM8978_Write_Reg(52,voll);/R52,耳機(jī)左聲道音量設(shè)置WM8978_Write_Reg(53,volr|(1<<8);/R53,耳機(jī)右聲道音量設(shè)置,同步更新(HPVU=1)/設(shè)置喇叭音量/voll:左聲道音量(063) void WM8978_SPKvol_Set(u8 volx) volx&=0X3F;/
47、限定范圍if(volx=0)volx|=1<<6;/音量為0時(shí),直接mute WM8978_Write_Reg(54,volx);/R54,喇叭左聲道音量設(shè)置WM8978_Write_Reg(55,volx|(1<<8);/R55,喇叭右聲道音量設(shè)置,同步更新(SPKVU=1)/設(shè)置3D環(huán)繞聲/depth:015(3D強(qiáng)度,0最弱,15最強(qiáng))void WM8978_3D_Set(u8 depth) depth&=0XF;/限定范圍 WM8978_Write_Reg(41,depth);/R41,3D環(huán)繞設(shè)置 /設(shè)置EQ/3D作用方向/dir:0,在ADC起作用/
48、 1,在DAC起作用(默認(rèn))void WM8978_EQ_3D_Dir(u8 dir)u16 regval; regval=WM8978_Read_Reg(0X12);if(dir)regval|=1<<8;else regval&=(1<<8); WM8978_Write_Reg(18,regval);/R18,EQ1的第9位控制EQ/3D方向/設(shè)置EQ1/cfreq:截止頻率,03,分別對(duì)應(yīng):80/105/135/175Hz/gain:增益,024,對(duì)應(yīng)-12+12dBvoid WM8978_EQ1_Set(u8 cfreq,u8 gain) u16 reg
49、val;cfreq&=0X3;/限定范圍 if(gain>24)gain=24;gain=24-gain;regval=WM8978_Read_Reg(18);regval&=0X100;regval|=cfreq<<5;/設(shè)置截止頻率 regval|=gain;/設(shè)置增益 WM8978_Write_Reg(18,regval);/R18,EQ1設(shè)置 /設(shè)置EQ2/cfreq:中心頻率,03,分別對(duì)應(yīng):230/300/385/500Hz/gain:增益,024,對(duì)應(yīng)-12+12dBvoid WM8978_EQ2_Set(u8 cfreq,u8 gain) u1
50、6 regval=0;cfreq&=0X3;/限定范圍 if(gain>24)gain=24;gain=24-gain; regval|=cfreq<<5;/設(shè)置截止頻率 regval|=gain;/設(shè)置增益 WM8978_Write_Reg(19,regval);/R19,EQ2設(shè)置 /設(shè)置EQ3/cfreq:中心頻率,03,分別對(duì)應(yīng):650/850/1100/1400Hz/gain:增益,024,對(duì)應(yīng)-12+12dBvoid WM8978_EQ3_Set(u8 cfreq,u8 gain) u16 regval=0;cfreq&=0X3;/限定范圍 if(
51、gain>24)gain=24;gain=24-gain; regval|=cfreq<<5;/設(shè)置截止頻率 regval|=gain;/設(shè)置增益 WM8978_Write_Reg(20,regval);/R20,EQ3設(shè)置 /設(shè)置EQ4/cfreq:中心頻率,03,分別對(duì)應(yīng):1800/2400/3200/4100Hz/gain:增益,024,對(duì)應(yīng)-12+12dBvoid WM8978_EQ4_Set(u8 cfreq,u8 gain) u16 regval=0;cfreq&=0X3;/限定范圍 if(gain>24)gain=24;gain=24-gain;
52、regval|=cfreq<<5;/設(shè)置截止頻率 regval|=gain;/設(shè)置增益 WM8978_Write_Reg(21,regval);/R21,EQ4設(shè)置 /設(shè)置EQ5/cfreq:中心頻率,03,分別對(duì)應(yīng):5300/6900/9000/11700Hz/gain:增益,024,對(duì)應(yīng)-12+12dBvoid WM8978_EQ5_Set(u8 cfreq,u8 gain) u16 regval=0;cfreq&=0X3;/限定范圍 if(gain>24)gain=24;gain=24-gain; regval|=cfreq<<5;/設(shè)置截止頻率 regval|=gain;/設(shè)置增益 WM8978_Write_Reg(22,regval);/R22,EQ5設(shè)置 Main.c代碼*include "sys.h"*include "delay.h"
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代操作系統(tǒng)中的安全技術(shù)探討
- 屋頂翻建合同范本
- 2024年菏澤市勞信就業(yè)服務(wù)有限公司招聘制醫(yī)院人員筆試真題
- 2024年濟(jì)寧鄒城市事業(yè)單位招聘綜合類崗位考試真題
- 科技產(chǎn)品電商營(yíng)銷的跨平臺(tái)整合
- 2025至2030年中國(guó)柔性防水干混砂漿數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 傳統(tǒng)香料采購(gòu)合同
- 2025年02月貴州食品工程職業(yè)學(xué)院公開招聘17人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 科技引領(lǐng)下的生活新體驗(yàn)-社區(qū)科普活動(dòng)規(guī)劃
- 2025年02月貴州省藥品監(jiān)督管理局所屬事業(yè)單位公開招聘10人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 疏散路線智能規(guī)劃系統(tǒng)
- 《快遞實(shí)務(wù)》課件 項(xiàng)目1 走進(jìn)快遞
- 統(tǒng)編版語(yǔ)文四年級(jí)下冊(cè)第六單元教材解讀解讀與集體備課課件
- 新教科版六年級(jí)下冊(cè)科學(xué)全冊(cè)教案
- 雞肉食品行業(yè)報(bào)告
- 顆粒增強(qiáng)鋁基復(fù)合材料
- 火車站消防指導(dǎo)培訓(xùn)課件
- 婦產(chǎn)科全套課件
- 穴位貼敷的運(yùn)用課件
- 中心靜脈壓與有創(chuàng)動(dòng)脈血壓監(jiān)測(cè)護(hù)理
- 【銅版畫“飛塵”技法實(shí)踐研究4900字(論文)】
評(píng)論
0/150
提交評(píng)論