⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2s.c

📁 在S3C44B0X ARM处理器上用C语言实现的IIS接口驱动程序
💻 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 + -