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

📄 iis.c

📁 达盛EL-ARM-830
💻 C
字号:
/*
;************************************************************************************************************
;*									  北京精仪达盛科技有限公司
;*                                     	    研    发    部
;*
;*                                 	    http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;*
;* 文件名称 : IIS.c	
;* 文件功能 : 该文件为S3C44B0硬件平台配置具体函数的初始化。
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/08/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\..\startup2410\inc\2410ADDR.h"
#include "..\..\startup2410\inc\2410LIB.h"
#include "..\..\startup2410\inc\def.h"
#include "..\inc\iis.h"

unsigned char val;
                                                                                                        
#define clrL3C			(*(volatile unsigned char *)0x1800000d) = 0xd
#define setL3C			usedata((*(volatile unsigned char *)0x1800000d))
#define clrL3D			(*(volatile unsigned char *)0x1800000c) = 0xd
#define setL3D			usedata((*(volatile unsigned char *)0x1800000c))
#define clrL3M			rGPBDAT &= ~1
#define setL3M			rGPBDAT |=1

void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);

void __irq TX_Done(void);
void __irq RX_Done(void);

unsigned char 	*Buf, *_temp;
volatile unsigned int size=0;
volatile int Tx_Done;
volatile int Rx_Done;
int usedata(int d)
{
	return d;
}


/*
*************************************************************************************************************
- 函数名称 : void Init1341(void)
- 函数说明 : 初始化UDA1341的程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Init1341(void)
{
    /****** Port Initialize ******/

    setL3M;
    setL3C;					//L3M=H(start condition)
    						//L3C=H(start condition)

    /****** L3 Interface ******/
    _WrL3Addr(0x14 + 2);	//status (000101xx+10)
    
#ifdef FS2205KHZ
    _WrL3Data(0x60,0); 		//0,1,10,000,0 reset,256fs,no DCfilter,iisBUS //256fs
#else
    _WrL3Data(0x50,0); 		//0,1,01,000,0 reset,384fs,no DCfilter,iisBUS
#endif

    _WrL3Addr(0x14 + 2); 	//status (000101xx+10)
    
#ifdef FS2205KHZ
    _WrL3Data(0x20,0); 		//0,0,10,000,0 no reset,256fs,no DCfilter,iis //256fs
#else
    _WrL3Data(0x10,0); 		//0,0,01,000,0 no reset,384fs,no DCfilter,iis
#endif
    
    _WrL3Addr(0x14+2); 		//status (000101xx+10)
    _WrL3Data(0x83,0);  	//1,0,0,0,0,0,11 OGS=0,IGS=0,ADC_NI,DAC_NI,sngl speed,AonDon

}

/*
*************************************************************************************************************
- 函数名称 : void _WrL3Addr(U8 data)
- 函数说明 : L3地址写程序
- 输入参数 : data
- 输出参数 : 无
*************************************************************************************************************
*/
void _WrL3Addr(U8 data)
{	
    S32 i,j;

    clrL3M;						//L3M=L
    setL3C;						//L3C=H

    for(j=0;j<4;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(U8 data,int halt)
{
    S32 i,j;
    
    if(halt)
    {
        setL3C;	    			//L3C=H(while tstp, L3 interface halt condition)
        for(j=0;j<4;j++);   	//tstp(L3) > 190ns
    }
    setL3M;	    				//L3M=H(in data transfer mode)	
    for(j=0;j<4;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 Test_Iis(void)
- 函数说明 : 检测IIS的程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/  

void __irq TX_Done(void)
{
    ClearPending(BIT_DMA2);	//clear pending bit
    while((rDSTAT2&0xFFFFF) != 0);  
    Tx_Done=1;
}
/*
*************************************************************************************************************
- 函数名称 : void Test_Iis(void)
- 函数说明 : 检测IIS的程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/  

void __irq RX_Done(void)
{
    ClearPending(BIT_DMA1);	//clear pending bit
    while((rDSTAT1&0xFFFFF) != 0); 
    Rx_Done=1;
}
/*
*************************************************************************************************************
- 函数名称 : void Iis_RxTX(void)
- 函数说明 : IIS的接收发送程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Iis_RxTx(void)
{
    unsigned int i;
    unsigned short *rxdata;

    Rx_Done=0;
    Tx_Done = 0;
    //ChangeClockDivider(1,1);          		// 1:2:4 
    //ChangeMPllValue(0x52,0x1,0x1);			//改换主频为MCLK=45MHz <-- Fin 6MHz -->45Mhz
	//ChangeMPllValue(0x70,0x2,0x2);			//改换主频为MCLK=45MHz <-- Fin 6MHz -->45Mhz
	 //ChangeMPllValue(0xa1,0x3,0x1);    // FCLK=202.8MHz 
    pISR_DMA2=(unsigned)TX_Done;
    pISR_DMA1=(unsigned)RX_Done;
    rINTMSK &=~(BIT_DMA1);
    rINTMSK &=~(BIT_DMA2);
    
    rxdata = (unsigned short *)malloc(0x80000); //384KB
    for(i=0;i<0x80000;i++)
	*(rxdata+i)=0;
	
	while(1)
	{
	    //DMA1 for AudioIn 
    rDMASKTRIG1 = (1<<2)|(0<<1);						        //DMA1_Stop 
    //Init DMA Ch 1
    rDISRC1 	= (U32)IISFIFO;  							// Rx FIFO address
    rDISRCC1 	= (1<<1)|(1<<0); 							//Src=APB,Fixed;
    rDIDST1 	= (U32)(rxdata);
    rDIDSTC1 	= (0<<1)|(0<<0); 							//DSt=AHB,Increment
    rDCON1 		= (1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(2<<24)|(1<<23)|(1<<22)|(1<<20)|(0x80000);
                                //handshake,Sync=APB,IntEn,unit,single,dst=I2SSDI,HwReqMode,AutoReload,Halfword, USing single mode !!!
    rDMASKTRIG1 = (1<<1); 		//No-stop, DMA2 channel on, No-sw trigger
    
    rIISCON		= (0<<5)|(1<<4)|(1<<1);                       //TxDMAReqdis,RxDMAReqEn,IISPrescalerEn 
    rIISMOD		= (0<<8)|(1<<6)|(0<<5)|(0<<4)|(1<<3)|(0<<2)|(1<<0);  //Master,Rx,IisFormat,16bit,256fs,32fs
    rIISPSR 	= (8<<5)|(8<<0); //FCLK 202MHz(1:2:4),PreScalerA=50.5Mhz/9,PreScalerB=45Mhz/8,5.61MHZ(256fs),21.91KHz
    rIISFCON	= (0<<15)|(1<<14)|(0<<13)|(1<<12);   		//TxFifo=normal,RxFifo=DMA,TxFifodisable,RxFifoEn
    
    rIISCON		|= (1<<0);  	//IIS Enable;
    
	while(!Rx_Done);
    Rx_Done = 0;
    //IIS Stop
    Delay(10);                          //For end of H/W Rx
    rIISCON     = 0x0;                  //IIS stop
    rDMASKTRIG1 = (1<<2);               //DMA2 stop
    rIISFCON    = 0x0;                  //For FIFO flush
    
    
    rDMASKTRIG2 = (1<<2)|(0<<1);
    rIISCON=(1<<5)|(0<<4)|(1<<1);        //TxDMAReqEn,RxDMAReqdis,IISPrescalerEn    
    rIISMOD=(0<<8)|(2<<6)|(0<<4)|(1<<3)|(0<<2)|(1<<0);        //Master,Rx,IisFormat,16bit,256fs,32fs
    rIISPSR=(8<<5)|(8<<0);  	//FCLK 202MHz(1:2:4),PreScalerA=50.5Mhz/9,PreScalerB=45Mhz/8,5.61MHZ(256fs),21.91KHz
    rIISFCON=(1<<15)|(0<<14)|(1<<13)|(0<<12);    	//TxFifo=normal,RxFifo=DMA,TxFifodisable,RxFifoEn
   
    //Init DMA Ch 2
    rDISRC2 = (U32)(rxdata);
    rDISRCC2 = (0<<1)|(0<<0); //Src=AHB,Increment
    rDIDST2 = (U32)IISFIFO;  // Tx FIFO address
    rDIDSTC2 = (1<<1)|(1<<0); //Dst=APB,Fixed;
    rDCON2 = (1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<24)|(1<<23)|(1<<22)|(1<<20)|(0x80000);
        //handshake,Sync=APB,IntEn,unit,single,dst=I2SSDO,HwReqMode,NoAutoReload,Halfword, USing single mode !!!
    
    rDMASKTRIG2 = (1<<1); 	//DMA2En
    rIISCON|=(1<<0);
    
    while(!Tx_Done);
    Tx_Done=0;
    rIISCON     = 0x0;                  //IIS stop
    rDMASKTRIG2 = (1<<2);               //DMA2 stop
    rIISFCON    = 0x0;                  //For FIFO flush
    
	}
    free(rxdata);
    rINTMSK |= (BIT_DMA2);
    rINTMSK |= (BIT_DMA1);
   ChangeClockDivider(1,1);          // 1:2:4 
   ChangeMPllValue(0xa1,0x3,0x1);    // FCLK=202.8MHz 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -