📄 iis.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 + -