www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]在消費(fèi)電子產(chǎn)品中,往往都會(huì)用到音頻系統(tǒng)來(lái)播放音樂(lè)、進(jìn)行通話等多媒體應(yīng)用,此外,對(duì)于一些需語(yǔ)音提示的產(chǎn)品,音頻部分都是不可或缺的功能。筆者此處就s3c2416的音頻驅(qū)動(dòng)實(shí)現(xiàn)作一個(gè)簡(jiǎn)單的介紹。1. IIS音頻總線s3c24

在消費(fèi)電子產(chǎn)品中,往往都會(huì)用到音頻系統(tǒng)來(lái)播放音樂(lè)、進(jìn)行通話等多媒體應(yīng)用,此外,對(duì)于一些需語(yǔ)音提示的產(chǎn)品,音頻部分都是不可或缺的功能。筆者此處就s3c2416的音頻驅(qū)動(dòng)實(shí)現(xiàn)作一個(gè)簡(jiǎn)單的介紹。

1. IIS音頻總線

s3c2416支持IIS、PCM、AC97這三種音頻接口,此處只分析IIS音頻接口。IIS接口(Inter-IC Sound)在20世紀(jì)80年代首先被飛利浦公司用于消費(fèi)音頻,為數(shù)字音頻設(shè)備之間的音頻數(shù)據(jù)傳輸而制定的一種總線標(biāo)準(zhǔn)。IIS有以下三個(gè)主要的信號(hào):

1) 串行時(shí)鐘SCLK,也叫做位時(shí)鐘(BCLK)。數(shù)字音頻的每一位均需對(duì)應(yīng)一個(gè)SCLK脈沖,因此位時(shí)鐘頻率應(yīng)大于等于2*采樣頻率*采樣位數(shù)。乘以2表示每個(gè)采樣會(huì)產(chǎn)生左聲道和右聲道的數(shù)據(jù)。

2) 幀時(shí)鐘LRCK,也叫做左右聲道切換時(shí)鐘(WS)。LRCK為1時(shí)表示傳輸?shù)氖怯衣暤赖臄?shù)據(jù),為0時(shí)表示傳輸?shù)氖亲舐暤赖臄?shù)據(jù),因此IIS是非常適合于立體聲系統(tǒng)的。LRCK是一個(gè)占空比約50%的方波,這個(gè)頻率是需要盡可能與采樣頻率一致的,不然無(wú)法體現(xiàn)原來(lái)的音頻本質(zhì)。

3) 串行數(shù)據(jù)SDATA,用二進(jìn)制補(bǔ)碼表示音頻數(shù)據(jù)。在串行時(shí)鐘SCLK脈沖下,數(shù)據(jù)一位一位出現(xiàn)在SDATA線上。對(duì)于具體的IIS主機(jī)或設(shè)備,為支持全雙工(例如通話時(shí)需同時(shí)支持放音與錄音),串行數(shù)據(jù)線分串行輸入SDI和串行輸出SDO這兩根。SDI用來(lái)傳輸采樣設(shè)備數(shù)字化后的錄音數(shù)據(jù),SDO用來(lái)傳輸需播放的音頻數(shù)據(jù)。

有時(shí)為了IIS主控制與IIS設(shè)備能夠更好的同步,還需要傳輸一路時(shí)鐘信號(hào)MCLK,也叫做主時(shí)鐘。主要用于IIS設(shè)備A/D、D/A采樣時(shí)的采樣時(shí)鐘,一般是采樣頻率的256倍、384倍、512倍、768倍。在滿足要求的條件下,應(yīng)盡可能選用較低的主時(shí)鐘。

2. WM8960音頻編解碼器

WM8960是歐勝微電子推出的一款低功耗、高質(zhì)量的立體編碼解碼器。該芯片內(nèi)置有麥克風(fēng)接口、立體聲耳機(jī)驅(qū)動(dòng)器以及D類(lèi)立體聲揚(yáng)聲器驅(qū)動(dòng),24比特模數(shù)轉(zhuǎn)換器(ADC)和數(shù)模轉(zhuǎn)換器(DAC)。

WM8960具有三對(duì)左右聲道的模擬輸入,其中INPUT1專(zhuān)用于Mic輸入,支持單端或差分的Mic信號(hào)接入。這個(gè)輸入具有一個(gè)程控放大器(PGA),并且可用自動(dòng)電平控制(ALC)對(duì)Mic信號(hào)進(jìn)行增益放大。其它的INPUT2、3可做為Mic差分接入的同相輸入或線輸入。

WM8960具有一對(duì)左右聲道的耳機(jī)輸出,16歐負(fù)載時(shí),輸出40mW。一對(duì)D類(lèi)左右聲道揚(yáng)聲器輸出,每聲道8歐負(fù)載,在1W輸出功率時(shí),具有87%的效率。一路左右聲道混合輸出。

3. WM8960驅(qū)動(dòng)編寫(xiě)

聲音是模擬信號(hào),cpu是不能處理模擬信號(hào)的,并且認(rèn)為模擬信號(hào)也是不具有傳輸性的。因此音頻編解碼器至少具有三個(gè)主要功能部分:模數(shù)轉(zhuǎn)換器(ADC)、數(shù)模轉(zhuǎn)換器(DAC)、程控放大器(PGA)。ADC用來(lái)采樣外部的模擬聲音信號(hào)(如Mic錄音),進(jìn)行離散化后,轉(zhuǎn)換成數(shù)字音頻,通過(guò)音頻總線(如IIS)傳輸給cpu,cpu再對(duì)數(shù)字音頻進(jìn)行處理,如調(diào)頻、混合、存儲(chǔ)等。DAC用來(lái)把從cpu過(guò)來(lái)的數(shù)字音頻信號(hào)還原成原來(lái)的模擬聲音信號(hào),DAC轉(zhuǎn)換后的離散化PCM調(diào)制信號(hào)再通過(guò)濾波器真實(shí)還原出原來(lái)的模擬聲音。PGA可在各個(gè)階段對(duì)音頻信號(hào)進(jìn)行可編程的增益放大,例如音量的控制(可參考WM8960_HeadphoneVolume()函數(shù)),Mic靈敏度的調(diào)節(jié)(可參考WM8960_RecorderVolume()函數(shù))等。

WM8960在使用前必須進(jìn)行初始化,即需配置音頻接口IIS的參數(shù)(可參考WM8960_Init()的實(shí)現(xiàn)),若進(jìn)行錄音,需配置錄音路徑的上電、接通,并進(jìn)行增益的設(shè)定(具體見(jiàn)WM8960_RecorderStart()函數(shù)的實(shí)現(xiàn))。若進(jìn)行放音,需配置是耳機(jī)、揚(yáng)聲器等的話音路徑,進(jìn)行增益設(shè)定(可參考WM8960_HeadphoneStart()函數(shù)的實(shí)現(xiàn))。IIS是音頻接口,只能傳輸音頻信號(hào),因此WM8960還需另外的IIC接口,通過(guò)IIC總線寫(xiě)寄存器對(duì)這些配置進(jìn)行設(shè)定。IIC驅(qū)動(dòng)編寫(xiě)在前面的章節(jié)有詳細(xì)的介紹,此處不再細(xì)說(shuō),WM8960模塊驅(qū)動(dòng)WM8960.c如下:

#include "IIC.h"

#include "WM8960.h"

#define VolumeLevel 7

static int RecorderVolume;

static int HeadphoneVolume;

// WM8960寄存器不能通過(guò)IIC讀,開(kāi)辟緩存記錄寄存器的變化

static unsigned short WM8960_Reg[56] = {

0x0097, 0x0097, 0x0000, 0x0000,

0x0000, 0x0008, 0x0000, 0x000a,

0x01c0, 0x0000, 0x00ff, 0x00ff,

0x0000, 0x0000, 0x0000, 0x0000,

0x0000, 0x007b, 0x0100, 0x0032,

0x0000, 0x00c3, 0x00c3, 0x01c0,

0x0000, 0x0000, 0x0000, 0x0000,

0x0000, 0x0000, 0x0000, 0x0000,

0x0100, 0x0100, 0x0050, 0x0050,

0x0050, 0x0050, 0x0000, 0x0000,

0x0000, 0x0000, 0x0040, 0x0000,

0x0000, 0x0050, 0x0050, 0x0000,

0x0002, 0x0037, 0x004d, 0x0080,

0x0008, 0x0031, 0x0026, 0x00e9,

};

static void WM8960_WriteReg(unsigned char RegAddr, unsigned short Value)

{

unsigned char Data;

unsigned char Addr;

// WM8960只有7位的寄存器地址,外加寄存器值第8位,構(gòu)成8位數(shù)據(jù)

Addr = (RegAddr<<1) |((Value>>8) & 0x1);

// WM8960有9位的寄存器值,最高位與寄存器地址一齊發(fā)送

Data = (unsigned char)Value; // 低8位寄存器值

IIC_WriteBytes(WM8960_SlaveAddr,Addr, &Data, 1);

WM8960_Reg[RegAddr] = Value; // 寫(xiě)成功后更新寄存器的值

}

static unsigned short WM8960_ReadReg(unsigned char RegAddr)

{

return WM8960_Reg[RegAddr]; // 返換緩存的WM8960寄存器的值(9位)

}

unsigned char WM8960_HeadphoneVolume(unsigned char Control)

{

// -10db ~ 6db (0x6f ~ 0x7f)

unsigned char Level;

if (Control == VolumeDown) { // 耳機(jī)音量減

if ((0x7f-0x6f)/VolumeLevel ==0) {

HeadphoneVolume--;

} else {

HeadphoneVolume -=(0x7f-0x6f)/VolumeLevel;

}

if (HeadphoneVolume < 0) {

HeadphoneVolume = 0;

}

} else {// 耳機(jī)音量加

if ((0x7f-0x6f)/VolumeLevel ==0) {

HeadphoneVolume++;

} else {

HeadphoneVolume +=(0x7f-0x6f)/VolumeLevel;

}

if (HeadphoneVolume >VolumeLevel) {

HeadphoneVolume =VolumeLevel;

}

}

if (HeadphoneVolume == 0) {

Level = 0; // 靜音

} else {

Level =((0x7f-0x6f)*HeadphoneVolume)/VolumeLevel + 0x6f;

}

// Headphone Volume Updata

WM8960_WriteReg(0x02,(1<<8)|Level);

WM8960_WriteReg(0x03,(1<<8)|Level);

return ((HeadphoneVolume*100)/VolumeLevel);// 返回音量百分比

}

void WM8960_HeadphoneStop()

{

unsigned short RegValue;

RegValue = WM8960_ReadReg(0x1a);

RegValue =~((1<<8)|(1<<7)|(1<<6)|(1<<5));

WM8960_WriteReg(0x1a, RegValue);

}

void WM8960_HeadphoneStart()

{

unsigned short RegValue;

// DAC Left/Right,LOUT1/ROUT1Output Buffer Power up

WM8960_WriteReg(0x1a, 0x01e0);

// Left DAC Digital Volume -28db

WM8960_WriteReg(0x0a, 0x01c5);

// Right DAC Digital Volume -28db

WM8960_WriteReg(0x0b, 0x01c5);

// DAC Digital No mute

WM8960_WriteReg(0x05, 0x0000);

// Left DAC to Left Output Mixer

WM8960_WriteReg(0x22, 0x0100);

// Right DAC to Left Output Mixer

WM8960_WriteReg(0x25, 0x0100);

// Left/Right Output Mixer Enable

RegValue = WM8960_ReadReg(0x2f);

RegValue |= (1<<2) |(1<<3);

WM8960_WriteReg(0x2f, RegValue);

}

unsigned char WM8960_RecorderVolume(unsigned char Control)

{

// -10db ~ 10db (0xaf ~ 0xd7)

unsigned char Level;

if (Control == VolumeDown) { //Mic靈敏度調(diào)低

if ((0xd7-0xaf)/VolumeLevel ==0) {

RecorderVolume--;

} else {

RecorderVolume -=(0xd7-0xaf)/VolumeLevel;

}

if (RecorderVolume < 0) {

RecorderVolume = 0;

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

IIC是Philips推出的芯片間串行傳輸總線,它以二根連線實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳送,可以極方便地構(gòu)成多機(jī)系統(tǒng)和外圍器件擴(kuò)展系統(tǒng)。由于其接口簡(jiǎn)單靈活,很多外圍器件均提供了IIC接口,如手機(jī)、平板常用的重力傳感器

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) iic驅(qū)動(dòng)

現(xiàn)在主要講解一下在GCC移植UCGUI,Makefile工程如何加入目錄,加入源碼,c標(biāo)準(zhǔn)庫(kù),編譯選項(xiàng)的設(shè)置。筆者的Makefile模板提取自u(píng)boot,工程中加入目錄,加入源碼都是很簡(jiǎn)單的,詳細(xì)的介紹請(qǐng)參考前面章節(jié)”...

關(guān)鍵字: gcc s3c2416 ucgui 移植 裸機(jī)開(kāi)發(fā)

jpeg格式是一種針對(duì)相片影像而廣泛使用的一種失真壓縮標(biāo)準(zhǔn),其壓縮技術(shù)十分先進(jìn),用有損壓縮方式去除冗余的圖像數(shù)據(jù),在獲得極高壓縮率的同時(shí),能展現(xiàn)十分豐富生動(dòng)的圖像,能用最少的磁盤(pán)空間得到較好的圖像品質(zhì)。由

關(guān)鍵字: s3c2416 移植 裸機(jī)開(kāi)發(fā) libjpeg

S3C2416裸機(jī)開(kāi)發(fā)系列十八_音頻驅(qū)動(dòng)實(shí)現(xiàn)(2)標(biāo)簽:WM8960IIS音頻驅(qū)動(dòng)s3c2416裸機(jī)開(kāi)發(fā)2014-06-10 09:50853人閱讀評(píng)論(0)收藏舉報(bào)分類(lèi):s3c2416裸機(jī)開(kāi)發(fā)(24)版權(quán)聲明:本文為博...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) 音頻驅(qū)動(dòng)

很多的嵌入式系統(tǒng)都需要人機(jī)交互,對(duì)于輸出設(shè)備,LCD以其顯示質(zhì)量高、畫(huà)面效果好等優(yōu)點(diǎn)得到了極其廣泛的應(yīng)用。s3c2416包含了一個(gè)LCD控制器,筆者此處就s3c2416的LCD應(yīng)用作一個(gè)簡(jiǎn)單的介紹。1、LCD控制器概述1...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) rgb屏 驅(qū)動(dòng)顯示

/*** 有待學(xué)習(xí) *****/ Linux 下的IIS 音頻驅(qū)動(dòng)程序主要都在/kernel/drivers/sound/s3c2410-uda1341.c 文件中。 在音頻驅(qū)動(dòng)程序中有2個(gè)比較重要的結(jié)構(gòu)體:typede...

關(guān)鍵字: iis s3c2410 音頻驅(qū)動(dòng)

在嵌入式設(shè)計(jì)中,由于Nand Flash具有大容量,擦寫(xiě)次數(shù)高,接口簡(jiǎn)單等優(yōu)點(diǎn),常用作固化存儲(chǔ)器。S3C2416支持Nand啟動(dòng),因此Nand存儲(chǔ)器可以直接保存固化代碼以及其它的數(shù)據(jù)。筆者在此簡(jiǎn)單的介紹Nand flas...

關(guān)鍵字: nand驅(qū)動(dòng) s3c2416 裸機(jī)開(kāi)發(fā) nand啟動(dòng)

筆者前面章節(jié)簡(jiǎn)單介紹了s3c2416啟動(dòng)代碼的實(shí)現(xiàn)過(guò)程,啟動(dòng)代碼就是用來(lái)處理cpu體系結(jié)構(gòu)中一些底層內(nèi)容,一個(gè)功能強(qiáng)大的啟動(dòng)代碼是可以當(dāng)作bootloader(如uboot)來(lái)用的。有了啟動(dòng)代碼,用戶就可以專(zhuān)注于用c來(lái)作...

關(guān)鍵字: mdk s3c2416 啟動(dòng)代碼 裸機(jī)開(kāi)發(fā)

啟動(dòng)代碼是處理器上電復(fù)位后最先運(yùn)行的一段代碼。主要是用來(lái)把處理器初始化到一個(gè)確定的狀態(tài),為c運(yùn)行環(huán)境作好準(zhǔn)備。如設(shè)置異常向量表,初始化系統(tǒng)時(shí)鐘,初始化外部?jī)?nèi)存,把用戶代碼拷貝到外部?jī)?nèi)存,初始化棧,清0全

關(guān)鍵字: s3c2416 啟動(dòng)代碼 流水燈 裸機(jī)開(kāi)發(fā)

S3C2416裸機(jī)開(kāi)發(fā)系列十九_(tái)Fatfs下播放錄音wav音頻文件標(biāo)簽:wavfatfs音頻播放s3c2416sd驅(qū)動(dòng)2014-06-11 09:551938人閱讀評(píng)論(0)收藏舉報(bào)分類(lèi):s3c2416裸機(jī)開(kāi)發(fā)(24)版...

關(guān)鍵字: s3c2416 裸機(jī)開(kāi)發(fā) 播放錄音 音頻文件
關(guān)閉