📄 i2s.c
字号:
/************************************************************************
* File Name:I2S.c
* Description:包含对L3接口操作的函数和I2S总线的初始化。
* Date:2008-6-07
*************************************************************************/
#include "ISR.h"
#include "Uart.h"
#include "I2S.h"
#include "DMA.h"
/*
*************************************************************************************************************
- 函数名称 : void _WrL3Addr(U8 data)
- 函数说明 : L3地址写程序
- 输入参数 : data
- 输出参数 : 无
*************************************************************************************************************
*/
void _WrL3Addr(unsigned char data)
{
char i,j;
clrL3M; //L3M=L
setL3C; //L3C=H
for(j=0;j<16;j++); //tsu(L3) > 190ns
for(i=0;i<8;i++)
{
if(data&0x1) //if data bit is 'H'
{
clrL3C; //L3C=L
setL3D; //L3D=H
for(j=0;j<8;j++); //tcy(L3) > 500ns
setL3C; //L3C=H
setL3D; //L3D=H
for(j=0;j<8;j++); //tcy(L3) > 500ns
}
else //if data bit is 'L'
{
clrL3C; //L3C=L
clrL3D; //L3D=L
for(j=0;j<8;j++); //tcy(L3) > 500ns
setL3C; //L3C=H
clrL3D; //L3D=L
for(j=0;j<8;j++); //tcy(L3) > 500ns
}
data >>=1;
}
setL3C;
setL3M; //L3M=H,L3C=H
}
/*
*************************************************************************************************************
- 函数名称 : void _WrL3Data(U8 data,int halt)
- 函数说明 : L3数据写程序
- 输入参数 : data,halt
- 输出参数 : 无
*************************************************************************************************************
*/
void _WrL3Data(unsigned char data,char halt)
{
char i,j;
if(halt)
{
setL3C; //L3C=H(while tstp, L3 interface halt condition)
for(j=0;j<16;j++); //tstp(L3) > 190ns
}
setL3M; //L3M=H(in data transfer mode)
for(j=0;j<8;j++); //tsu(L3)D > 190ns
for(i=0;i<8;i++)
{
if(data&0x1) //if data bit is 'H'
{
clrL3C; //L3C=L
setL3D; //L3D=H
for(j=0;j<8;j++); //tcy(L3) > 500ns
setL3C; //L3C=H,L3D=H
setL3D;
for(j=0;j<8;j++); //tcy(L3) > 500ns
}
else //if data bit is 'L'
{
clrL3C; //L3C=L
clrL3D; //L3D=L
for(j=0;j<8;j++); //tcy(L3) > 500ns
setL3C; //L3C=H
clrL3D; //L3D=L
for(j=0;j<8;j++); //tcy(L3) > 500ns
}
data>>=1;
}
setL3C;
setL3M; //L3M=H,L3C=H
}
/*
*************************************************************************************************************
- 函数名称 : void UDA1341_init(void)
- 函数说明 : 初始化UDA1341的程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void UDA1341_init(void)
{
/****** Port Initialize ******/
setL3M; //L3M=H(start condition)
setL3C; //L3C=H(start condition)
/****** L3 Interface ******/
/********L3接口操作********/
/*选择UDA1341 L3地址:0x000101xx
最低两位用于选择数据寄存器
高6位000101是UDA1341的设备地址*/
_WrL3Addr(0x14 + 2); //status(状态寄存器) 地址(000101xx+10)
_WrL3Data(0x60,0); //0,1,10,000,0 reset,256fs,no DCfilter,iisBUS //256fs
_WrL3Addr(0x14 + 2); //status(状态寄存器) 地址(000101xx+10)
_WrL3Data(0x20,0); //0,0,10,000,0 no reset,256fs,no DCfilter,iis //256fs
_WrL3Addr(0x14+2); //status(状态寄存器) 地址(000101xx+10)
_WrL3Data(0xE3,0); // (0x83) 1,0,0,0,0,0,11 OGS=0dB,IGS=0dB,ADC_Non-Inverting,DAC_Non-Inverting,Single Speed,ADC Power on & DAC Power on
// _WrL3Addr(0x14+2); //(000101xx+10):STATUS
// _WrL3Data(0xa2,0); //1, 0(OGS),1(IGS),0(PAD),0(PDA),0(DS),10(PC)
// Gain of DAC 0 dB,Gain of ADC 6dB,ADC non_inverting,DAC non-inverting
//single speed playback,ADC-on DAC-off
/*//in case of using MIC sensitivity settings
_WrL3Addr(0x14+0); //DATA0 (000101xx+00)
_WrL3Data(0xc4,0); //11000:Extended addr(3 bits),100(addr selected):AG&IG(AG 00 IG1 IG0)
_WrL3Data(0xf0,0); //111(Extended data),1(AGC=1,Enable AGC for MIC Amp.Gain Control)00,00(IG1IG0)
_WrL3Addr(0x14+0); //00:DATA0 (000101xx+00)
_WrL3Data(0xc2,0); ////11000:Extended addr(3 bits),010(addr selected):(MS2,MS1,MS0,MM1,MM0)
_WrL3Data(0xfa,0); //111(Extended data),110(MS=27dB),10(Ch2=on,Ch1=off)
*/
//in case of using Input channel 2 Amp.Gain Control samsung
//first select Input channel 2
//_WrL3Addr(0x14+0); //(000101xx+00):DATA0
//_WrL3Data(0xc2,0); //11000:Extended addr(3 bits),010(addr selected):(MS2,MS1,MS0,MM1,MM0)
//_WrL3Data(0xe2,0); //111(Extended data),000(MS=0dB),10(Ch2=on,Ch1=off)
//then diable AGC and set the IG value
//_WrL3Addr(0x14+0); //(000101xx+00):DATA0
//_WrL3Data(0xc4,0); //11000:Extended addr(3 bits),100:AG&IG
//_WrL3Data(0xe3,0); //111(Extended data),0(AGC=0,disable AGC:manual gain setting through IG(7bits))00,11(IG1 IG0:11)
//_WrL3Addr(0x14+0); //DATA0 (000101xx+00)
//_WrL3Data(0xc5,0); //11000:Extended addr(3 bits),101:IG6-IG2
//_WrL3Data(0xff,0); //111(Extended data),11111:(IG6-IG2:11111)
//The Gain of input channel 2 Amp:Max 60.5dB,Input channel 2 selected
}
/*
*************************************************************************************************************
- 函数名称 : void i2s_init(void)
- 函数说明 : S3C44B0X IIS总线初始化
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void i2s_init(void)
{
//Init IIS
IISCON = (0<<5)|(1<<4)|(1<<1); //TxDMAReqDis,RxDMAReqEnable,IISPrescalerEn
IISMOD = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(1<<3)|(0<<2)|(1<<0); //Master,Tx,Rx,IisFormat,16bit,256fs,32fs
//主模式,允许发送和接收,左通道低电平,串行数据iis格式,每通道串行数据位16,主时钟频率256fs,串行时钟频率32fs
IISPSR = 0x44; //CODECLK = MCLK/10
IISFIFCON = (0<<11)|(1<<10)|(1<<9)|(1<<8); //TxFifo=Normal,RxFifo=DMA,TxFifoEnable,RxFifoEnable
IISCON |= (1<<0); //IIS Enable;
}
/*
*************************************************************************************************************
- 函数名称 : void i2s_chn(void)
- 函数说明 : S3C44B0X IIS总线模式改变
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void i2s_chn(void)
{
IISCON &= 0xFFFFFFFE; //IIS Dis
IISCON |= (0<<5)|(0<<4)|(1<<1); //TxDMAReqDis,RxDMAReqDisable,IISPrescalerEn
IISMOD = (0<<8)|
(1<<7)|
(1<<6)|
(0<<5)|
(0<<4)|
(1<<3)|
(0<<2)|
(0<<1)|
(1<<0); //Master,Tx,Rx,IisFormat,16bit,256fs,32fs
IISPSR = 0x44;
IISFIFCON |= (0<<11)|(0<<10)|(1<<9)|(1<<8); //TxFifo=Normal,RxFifo=Normal,TxFifoEnable,RxFifoEnable
IISCON |= (1<<0); //IIS Enable;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -