


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、.課 程 設 計 報 告課程設計名稱: 音樂播放器 院 系: 信息工程學院 學生姓名:班 級:學 號:成 績:指導教師:開課時間: 2016-2017 學年 2 學期. v.音樂播放器一、實踐的內容和要求1.1實驗內容學習WAV格式音頻播放原理、數(shù)字音頻接口及的相關知識。了解模擬音頻信號和數(shù)字音頻信號的概念。掌握編寫音頻播主要內容 放器的方法。實現(xiàn)音頻播放,小鍵盤輸入操作。1.2實驗要求本系統(tǒng)要做一個音樂播放器,使用通用定時器定時,用比較輸出功能,輸出樂譜頻率的方波產生聲音,對 3 首歌曲編碼, 其支持 WAV 格式音頻播放(上鍵:暫停;左鍵:上一首;右鍵:下一首)。利用硬件ARM 嵌入式開發(fā)
2、平臺、 用于 ARM7TDMI 的 JTAG 仿 真器、PC 機 Pentium100開發(fā)實現(xiàn)實現(xiàn)音頻播放。主要實現(xiàn):上一首按鍵:當點擊上一首按鍵時,當前播放歌曲的上 一首歌首被播放。下一首按鍵:當點擊下一首按鍵時,當前播放歌曲的下一首歌曲即被 播放。當點擊停止鍵時,當前歌曲即會被停止。 播放界面設計: 在歌曲進行播放時, 界面應包含所有的按鍵, 并且要歌曲的曲目單。2、 實踐原理WAV播放器系統(tǒng)要求能夠對mp3、wav格式的音頻文件進行解碼,處理起來速度是有要求的,尤其是對320Kbps的MP3格式數(shù)據(jù)流的處理,必須非???,才能實現(xiàn)MP3的流暢播放,可供選擇的八位機有AVR、PIC,可供選擇
3、的32位處理器有SAMSUNG、STM32、ATMEL等。選擇MCU優(yōu)先考慮于擁有豐富的RAM,八位機RAM主要靠擴展,內部RAM一般在4Kbyte以內,32位機里面,SAMSUNG一般不內帶RAM,也要外擴。本實驗使用了ARM7處理器,MP3解碼可以有兩種方法,一是通過ARM處理器軟解碼,通過對MP3數(shù)據(jù)格式的解析實現(xiàn)MP3播放,二是通過外部解碼芯片直接解碼。第一種方法在解碼高碼率的MP3時,ARM7處理能力吃緊,而且STM32還需要外部DAC來做音頻輸出,所以采用第二種方法進行解碼。MP3常見的解碼芯片有VS100X系列和STA01系列,STA01需要外接DAC做音頻輸出,而VS1003自
4、帶DAC,且解碼的文件格式包含mp3和wav,另外它還可以實現(xiàn)錄音功能,方便以后進行功能的拓展應用。三、實踐步驟3.1功能設計開機后,先初始化各外設,然后檢測字庫文件夾是否存在,如果有問題,則提示Error,如果檢測無問題,則開始循環(huán)播放 SD卡內MUSIC 文件夾里面的歌曲,在 TFTLCD 上顯示歌曲名字、播放時間、歌曲總時間、歌曲數(shù)目、當前歌曲的編號等信息。KEY0選擇下一首,KEY2 選擇上一首,KEY_UP 控制暫停/繼續(xù)播放。3.2實驗步驟1)初始化 WM8978,這個過程包括軟復位、DAC 設置、輸出設置 和音量設置等。2)初始化 I2S,此過程主要設置 SPI_I2SCFGR
5、寄存器,設置 I2S 模式、I2S 標準、時鐘空閑電平和數(shù)據(jù)幀長等,最后開啟 I2S TX DMA,使能 I2S 外設。 在庫函數(shù)中初始化 I2S 調用的函數(shù)為:void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); 結構體 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; 第一個參數(shù)用來設置 I2S 的模式,也就是設置 SPI_I2SCFGR 寄存器的 I2SCFG 相關位??梢耘渲脼橹髂J桨l(fā)送 I2S_Mode_MasterTx,主模式接受 I2S_Mode_MasterRx,從模式發(fā)送 I2S_Mode_SlaveTx 以及從模式接受 I2S_Mode_SlaveRx 四種模式。第二個參數(shù) I2S_Standard 用來設置 I2S 標準,這個前面已經講解過??梢栽O置為:飛利浦 標準 I2S_Standard_Phillips,MSB 對齊標準 I2S_Standard_MSB
7、,LSB 對齊標準I2S_Standard_LSB 以及 PCM 標準 I2S_Standard_PCMShort。 第三個參數(shù) I2S_DataFormat 用來設置 I2S 的數(shù)據(jù)通信格式。這里實際包含設置 SPI_I2SCFGR 寄存器的 HCLEN 位(通道長度)以及 DATLEN 位(傳輸?shù)臄?shù)據(jù)長度)。當我們 設置為 16 位標準格式 I2S_DataFormat_16b 的時候,實際上傳輸?shù)臄?shù)據(jù)長度為 16 位,通道長度 為 16 位。當我們設置為其他值的時候,通道長度都為 32 位。第四個參數(shù) I2S_MCLKOutput用來設置是否使能主時鐘輸出。我們實驗會使能主時鐘輸出。第五
8、個參數(shù) I2S_AudioFreq 用來設置 I2S頻率。實際根據(jù)輸入的頻率值,會來計算 SPI 預 分頻寄存器 SPI_I2SPR 的預分頻奇數(shù)因子以及 I2S 線性預分頻器的值。這里支持 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) 第六個參數(shù) I2S_CPOL 用來設置空閑狀態(tài)時鐘電平,取值為高電平 I2S_CPOL_High 以及低電平 I2S_CPOL_Low。
10、3) 解析 WAV 文件,獲取音頻信號采樣率和位數(shù)并設置 I2S 時鐘分頻器這里,要先解析 WAV 文件,取得音頻信號的采樣率(fs)和位數(shù)(16 位或 32 位),根據(jù)這兩個參數(shù),來設置 I2S 的時鐘分頻,這里我們用前面介紹的查表法來設置即可。這是我們單獨寫了一個設置頻率的函數(shù)為 I2S2_SampleRate_Set。 4)設置 DMA I2S 播放音頻的時候,一般都是通過 DMA 來傳輸數(shù)據(jù)的,所以必須配置 DMA,本章我們用 I2S2,其 TX是使用的 DMA1 數(shù)據(jù)流 4 的通道 0 來傳輸?shù)?。并且STM32F4 的 DMA 具有雙緩沖機制,這樣可以提高效率,大大方便了我們的數(shù)據(jù)傳
11、輸,本章將 DMA1 數(shù)據(jù)流 4 設置為:雙緩沖循環(huán)模式,外設和存儲器都是 16 位寬,并開啟 DMA 傳輸完成中斷(方便填充數(shù)據(jù))。 5)編寫 DMA 傳輸完成中斷服務函數(shù)為了方便填充音頻數(shù)據(jù),我們使用 DMA 傳輸完成中斷,每當一個緩沖數(shù)據(jù)發(fā)送完后,硬件自動切換為下一個緩沖,同時進入中斷服務函數(shù),填充數(shù)據(jù)到發(fā)送完的這個緩沖。 6)開啟 DMA 傳輸,填充數(shù)據(jù) 最后,我們就只需要開啟 DMA 傳輸,然后及時填充 WAV 數(shù)據(jù)到 DMA 的兩個緩存區(qū)即 可。此時,就可以在 WM8978 的耳機和喇叭通道聽到所播放音樂了。操作方法為: DMA_Cmd(DMA1_Stream4,ENABLE);/
12、開啟 DMA TX 傳輸,開始播放。3.3流程圖3.4關鍵代碼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時鐘RCC_APB1PeriphResetCmd(
13、RCC_APB1Periph_SPI2,ENABLE); /復位SPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);/結束復位I2S_InitStructure.I2S_Mode=I2S_Mode;/IIS模式I2S_InitStructure.I2S_Standard=I2S_Standard;/IIS標準I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;/IIS數(shù)據(jù)長度I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;/主時
14、鐘輸出禁止I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;/IIS頻率設置I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;/空閑狀態(tài)時鐘電平I2S_Init(SPI2,&I2S_InitStructure);/初始化IISSPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);/SPI2 TX DMA請求使能. I2S_Cmd(SPI2,ENABLE);/SPI2 I2S EN使能. /采樣率計算公式:Fs=I2SxCLK/256*(2*I2SDI
15、V+ODD)/I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR/一般HSE=8Mhz /pllm:在Sys_Clock_Set設置的時候確定,一般是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采樣率; /設置IIS的采樣率(MCKEN)/samplerate:采樣率,單位:Hz/返回值:0,設置成功;1,無法設置.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);/先關閉PLLI2Sif(i=(sizeof(I2S_PSC_TBL)/10)return 1;/搜遍了也找不到RCC_PLLI2SConfig(u32)I2S_PSC_TBLi1,(u32)I2S_PSC_TBLi2);/設置I2SxC
18、LK的頻率(x=2) 設置PLLI2SN PLLI2SRRCC->CR|=1<<26;/開啟I2S時鐘while(RCC->CR&1<<27)=0);/等待I2S時鐘開啟成功. tempreg=I2S_PSC_TBLi3<<0;/設置I2SDIVtempreg|=I2S_PSC_TBLi4<<8;/設置ODD位tempreg|=1<<9;/使能MCKOE位,輸出MCKSPI2->I2SPR=tempreg;/設置I2SPR寄存器 return 0; /I2S2 TX DMA配置/設置為雙緩沖模式,并開啟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時鐘使能 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;/外設地址為:(u32)&SPI2->DR DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;/DMA 存儲器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryTo
21、Peripheral;/存儲器到外設模式 DMA_InitStructure.DMA_BufferSize = num;/數(shù)據(jù)傳輸量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外設非增量模式 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;/存儲器增量模式 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;/外設數(shù)據(jù)長度:16位 DMA_InitS
22、tructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;/存儲器數(shù)據(jù)長度:16位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;/ 使用循環(huán)模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;/高優(yōu)先級 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; /不使用FIFO模式 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThre
23、shold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/外設突發(fā)單次傳輸 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;/存儲器突發(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)先級0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;/子優(yōu)先級0 NVIC_Ini
25、tStructure.NVIC_IRQChannelCmd = ENABLE;/使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);/配置 /I2S DMA回調函數(shù)指針void (*i2s_tx_callback)(void);/TX回調函數(shù) /DMA1_Stream4中斷服務函數(shù)void DMA1_Stream4_IRQHandler(void) if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)=SET)/DMA1_Stream4,傳輸完成標志 DMA_ClearITPendingBit(DMA1_Stream4,
26、DMA_IT_TCIF4); i2s_tx_callback();/執(zhí)行回調函數(shù),讀取數(shù)據(jù)等操作在這里面處理 /I2S開始播放void I2S_Play_Start(void) DMA_Cmd(DMA1_Stream4,ENABLE);/開啟DMA TX傳輸,開始播放 /關閉I2S播放void I2S_Play_Stop(void) DMA_Cmd(DMA1_Stream4,DISABLE);/關閉DMA,結束播放 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,初始化正常/ 其他,錯誤代碼u8 WM8978_Init(void)u8 res;GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC
29、, ENABLE);/使能外設GPIOB,GPIOC時 /PB12/13 復用功能輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復用功能 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復用功能輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/復用功能 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);/軟復位WM8978if(res)return 1;/發(fā)送指令失敗,WM8978異常/以下為通用設置WM8978_Write_Reg(1,0X1B);/R1,MICEN
33、設置為1(MIC使能),BIASEN設置為1(模擬器工作),VMIDSEL1:0設置為:11(5K)WM8978_Write_Reg(2,0X1B0);/R2,ROUT1,LOUT1輸出使能(耳機可以工作),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反向,驅動喇叭WM8978_Write_Reg(47,1<<
34、;8);/R47設置,PGABOOSTL,左通道MIC獲得20倍增益WM8978_Write_Reg(48,1<<8);/R48設置,PGABOOSTR,右通道MIC獲得20倍增益WM8978_Write_Reg(49,1<<1);/R49,TSDEN,開啟過熱保護 WM8978_Write_Reg(10,1<<3);/R10,SOFTMUTE關閉,128x采樣,最佳SNR WM8978_Write_Reg(14,1<<3);/R14,ADC 128x采樣率return 0; /WM8978寫寄存器/reg:寄存器地址/val:要寫入寄存器的值
35、/返回值:0,成功;/ 其他,錯誤代碼u8 WM8978_Write_Reg(u8 reg,u16 val) IIC_Start(); IIC_Send_Byte(WM8978_ADDR<<1)|0);/發(fā)送器件地址+寫命令 if(IIC_Wait_Ack()return 1;/等待應答(成功"/失敗") IIC_Send_Byte(reg<<1)|(val>>8)&0X01);/寫寄存器地址+數(shù)據(jù)的最高位if(IIC_Wait_Ack()return 2;/等待應答(成功"/失敗") IIC_Send_Byt
36、e(val&0XFF);/發(fā)送數(shù)據(jù)if(IIC_Wait_Ack()return 3;/等待應答(成功"/失敗") IIC_Stop();WM8978_REGVAL_TBLreg=val;/保存寄存器值到本地return 0; /WM8978讀寄存器/就是讀取本地寄存器值緩沖區(qū)內的對應值/reg:寄存器地址 /返回值:寄存器值u16 WM8978_Read_Reg(u8 reg) return WM8978_REGVAL_TBLreg; /WM8978 DAC/ADC配置/adcen:adc使能(1)/關閉(0)/dacen:dac使能(1)/關閉(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個位設置為1,開啟DACR&DACLelse regval&=(3<<0);/R3最低2個位清零,關閉DACR&DACL.WM8978_Write_Reg(3,regval);/設置R3regval=WM8978_Read_Reg(2);/讀取R2if(adcen)regval|=3<<0;/R2最低2個位設置為1,開啟ADCR&a
38、mp;ADCLelse regval&=(3<<0);/R2最低2個位清零,關閉ADCR&ADCL.WM8978_Write_Reg(2,regval);/設置R2/WM8978 輸入通道配置 /micen:MIC開啟(1)/關閉(0)/lineinen:Line In開啟(1)/關閉(0)/auxen:aux開啟(1)/關閉(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);/關閉INPPGAENR,INPPGAENL. WM8978_Write_Reg(2,regval);/設置R2 regval=WM8978_Read_Reg(44);/讀取R44if(micen)regval|=3<<4|3<<0;/開啟LIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.else regval&=(3<<4|3<<0);/關閉LIN2INPPGA,LIP
40、2INPGA,RIN2INPPGA,RIP2INPGA.WM8978_Write_Reg(44,regval);/設置R44if(lineinen)WM8978_LINEIN_Gain(5);/LINE IN 0dB增益else WM8978_LINEIN_Gain(0);/關閉LINE INif(auxen)WM8978_AUX_Gain(7);/AUX 6dB增益else WM8978_AUX_Gain(0);/關閉AUX輸入 /WM8978 輸出配置 /dacen:DAC輸出(放音)開啟(1)/關閉(0)/bpsen:Bypass輸出(錄音,包括MIC,LINE IN,AUX等)開啟(1
41、)/關閉(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設置WM8978_Write_Reg(51,regval);/R51設置 /WM8978 MIC增益設置(不包括BOOST的20dB,MIC->ADC輸入部分的增益)/gain:063,對應-12dB35.2
42、5dB,0.75dB/Stepvoid WM8978_MIC_Gain(u8 gain)gain&=0X3F;WM8978_Write_Reg(45,gain);/R45,左通道PGA設置 WM8978_Write_Reg(46,gain|1<<8);/R46,右通道PGA設置/WM8978 L2/R2(也就是Line In)增益設置(L2/R2->ADC輸入部分的增益)/gain:07,0表示通道禁止,17,對應-12dB6dB,3dB/Stepvoid WM8978_LINEIN_Gain(u8 gain)u16 regval;gain&=0X07;reg
43、val=WM8978_Read_Reg(47);/讀取R47regval&=(7<<4);/清除原來的設置 WM8978_Write_Reg(47,regval|gain<<4);/設置R47regval=WM8978_Read_Reg(48);/讀取R48regval&=(7<<4);/清除原來的設置 WM8978_Write_Reg(48,regval|gain<<4);/設置R48 /WM8978 AUXR,AUXL(PWM音頻部分)增益設置(AUXR/L->ADC輸入部分的增益)/gain:07,0表示通道禁止,17
44、,對應-12dB6dB,3dB/Stepvoid WM8978_AUX_Gain(u8 gain)u16 regval;gain&=0X07;regval=WM8978_Read_Reg(47);/讀取R47regval&=(7<<0);/清除原來的設置 WM8978_Write_Reg(47,regval|gain<<0);/設置R47regval=WM8978_Read_Reg(48);/讀取R48regval&=(7<<0);/清除原來的設置 WM8978_Write_Reg(48,regval|gain<<0);/
45、設置R48 /設置I2S工作模式/fmt:0,LSB(右對齊);1,MSB(左對齊);2,飛利浦標準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工作模式設置/設置耳機左右聲道音量/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時,直接muteif(volr=0)volr|=1<<6;/音量為0時,直接mute WM8978_Write_Reg(52,voll);/R52,耳機左聲道音量設置WM8978_Write_Reg(53,volr|(1<<8);/R53,耳機右聲道音量設置,同步更新(HPVU=1)/設置喇叭音量/voll:左聲道音量(063) void WM8978_SPKvol_Set(u8 volx) volx&=0X3F;/
47、限定范圍if(volx=0)volx|=1<<6;/音量為0時,直接mute WM8978_Write_Reg(54,volx);/R54,喇叭左聲道音量設置WM8978_Write_Reg(55,volx|(1<<8);/R55,喇叭右聲道音量設置,同步更新(SPKVU=1)/設置3D環(huán)繞聲/depth:015(3D強度,0最弱,15最強)void WM8978_3D_Set(u8 depth) depth&=0XF;/限定范圍 WM8978_Write_Reg(41,depth);/R41,3D環(huán)繞設置 /設置EQ/3D作用方向/dir:0,在ADC起作用/
48、 1,在DAC起作用(默認)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方向/設置EQ1/cfreq:截止頻率,03,分別對應:80/105/135/175Hz/gain:增益,024,對應-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;/設置截止頻率 regval|=gain;/設置增益 WM8978_Write_Reg(18,regval);/R18,EQ1設置 /設置EQ2/cfreq:中心頻率,03,分別對應:230/300/385/500Hz/gain:增益,024,對應-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;/設置截止頻率 regval|=gain;/設置增益 WM8978_Write_Reg(19,regval);/R19,EQ2設置 /設置EQ3/cfreq:中心頻率,03,分別對應:650/850/1100/1400Hz/gain:增益,024,對應-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;/設置截止頻率 regval|=gain;/設置增益 WM8978_Write_Reg(20,regval);/R20,EQ3設置 /設置EQ4/cfreq:中心頻率,03,分別對應:1800/2400/3200/4100Hz/gain:增益,024,對應-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;/設置截止頻率 regval|=gain;/設置增益 WM8978_Write_Reg(21,regval);/R21,EQ4設置 /設置EQ5/cfreq:中心頻率,03,分別對應:5300/6900/9000/11700Hz/gain:增益,024,對應-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;/設置截止頻率 regval|=gain;/設置增益 WM8978_Write_Reg(22,regval);/R22,EQ5設置 Main.c代碼*include "sys.h"*include "delay.h"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)法人變更與股權收購合同
- 2025年度非婚生子女監(jiān)護權及生活費用保障協(xié)議
- 2025年度知識產權交易付款委托三方協(xié)議
- 二零二五年度企業(yè)反壟斷法律顧問服務協(xié)議
- 2025年度未成年人監(jiān)護權委托代理合同模板
- 2025年度甲級寫字樓辦公室合租管理合同
- 二零二五年度汽車保險代理合同
- 二零二五年度花卉租擺與植物養(yǎng)護服務合同
- 二零二五年度信用卡透支貸款協(xié)議書
- 二零二五年度銀行與交通企業(yè)物流金融合同標準
- 提高糖尿病患者自我注射胰島素的規(guī)范率(內分泌科QCC成果匯報)
- 電子產品工藝文件模板-2024
- 測繪地理信息標準化與規(guī)范化
- 《鐵路職業(yè)道德》課件-5. 1職業(yè)行為規(guī)范內涵
- 2024年山東圣翰財貿職業(yè)學院單招綜合素質考試題庫含答案(綜合卷)
- 肝與膽病辨證課件
- 部編版語文七年級下冊第三單元大單元整體教學設計
- (2024年)建筑工程施工工藝
- 部編小語三下《趙州橋》學習任務群教學設計
- 上海交通大學無機化學課件第十一章
- 《經營模式淺談》課件
評論
0/150
提交評論