📄 iis.c
字号:
/*
;************************************************************************************************************
;* 北京精仪达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;*
;* 文件名称 : IIS.c
;* 文件功能 : 该文件为S3C44B0硬件平台配置具体函数的初始化。
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM7开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : ARM7开发小组
;* 创建日期 : 2004/04/20
;* 版本声明 : v1.0.0
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\..\startup44b0\inc\44b.h"
#include "..\..\startup44b0\inc\44blib.h"
#include "..\..\startup44b0\inc\def.h"
#include "..\inc\iis.h"
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void __irq TR_Done(void);
unsigned char *Buf, *_temp;
volatile unsigned int size=0;
volatile int Tx_Done;
volatile int Rx_Done;
/*
*************************************************************************************************************
- 函数名称 : void Init1341(void)
- 函数说明 : 初始化UDA1341的程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Init1341(void)
{
/****** Port Initialize ******/
rPCONE = 0x29968; //L3D PE3; L3M PE6; L3C PE4 (out)
rPUPE |= 0X00; //0x58; //disable(pull-up)
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 TR_Done(void)
{
rI_ISPC=BIT_BDMA0; //clear pending bit
Rx_Done=1;
Tx_Done=1;
}
/*
*************************************************************************************************************
- 函数名称 : void Test_Iis(void)
- 函数说明 : IIS的接收程序
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Iis_Rx(void)
{
unsigned int i;
unsigned short *rxdata;
Rx_Done=0;
Tx_Done = 0;
ChangePllValue(0x47,0x5,0x1); //改换主频为MCLK=45.1584MHz <-- Fin 8MHz -->45.142857Mhz
pISR_BDMA0=(unsigned)TR_Done;
rINTMSK=~(BIT_GLOBAL|BIT_BDMA0);
/****** Rx Buf initialize ******/
rxdata = (unsigned short *)malloc(0x30000); //128KB
for(i=0;i<0x30000;i++)
*(rxdata+i)=0;
while(1)
{
/****** BDMA0 Initialize ******/
rBDISRC0 = (1<<30)+(3<<28)+((int)rIISFIF); //Half word,fix,IISFIF
rBDIDES0 = (2<<30)+(1<<28)+(int)(rxdata); //IO2M,increment,rxdata
rBDICNT0 = (1<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20) + 0x30000*2;
//iis,reserved,end_int,1_tx,DMA disable,COUNT
/****** IIS Initialize ******/
rIISCON=0x012; //Rx DMA enable,Tx idle,prescaler enable
rIISMOD=0x049; // 0 01 0 0 1 1 01 Master,Rx,L-ch=low,iis,16bit ch.,codeclk=256fs,lrck=32fs
// rIISPSR=0x11; //Prescaler_A/B enable, value=3
rIISPSR=0x0; //Prescaler_A/B enable, value=0
rIISFCON=0x500; //Tx/Rx DMA,Tx/Rx FIFO --> start piling....
rBDICNT0 |= (1<<20); //enable
rBDCON0 = 0x0<<2;
/****** Rx start ******/
rIISCON |=0x1;
while(!Rx_Done);
Rx_Done = 0;
/****** Rx Stop(Master) ******/
rIISCON = 0x0; //IIS stop
rIISFCON = 0x0; //for FIFO flush
rBDICNT0 = 0x0; //BDMA stop
rBDISRC0 = (1<<30)+(1<<28)+(int)(rxdata); //Half word,inc,Buf
rBDIDES0 = (1<<30)+(3<<28)+((int)rIISFIF); //M2IO,fix,IISFIF
rBDICNT0=(1<<30)+(1<<26)+(3<<22)+(1<<21)+(0<<20) + 0x30000*2;
//iis,reserve,done_int,auto-reload/start,DMA enable,COUNT
rBDCON0 = 0x0<<2;
/****** IIS Initialize ******/
rIISCON=0x22; //Tx DMA enable,Rx idle,prescaler enable
rIISMOD=0x89; //Master,Tx,L-ch=low,iis,16bit ch.,codeclk=384fs,lrck=32fs
//rIISPSR=0x11; //Prescaler_A/B enable, value=3 MCLK=45.1584MHz/8 = 5.6448MHz
rIISPSR=0x0; //Prescaler_A/B enable, value=0 MCLK=45.1584MHz/2 = 5.6448*4MHz
rIISFCON=0xa00; //Tx DMA,Tx FIFO --> start piling....
rBDICNT0 |= (1<<20); //enable
rIISCON |= 0x1; /****** IIS Tx Start ******/
while(!Tx_Done);
Tx_Done=0;
}
free(rxdata);
Cache_Flush();
rNCACHBE0=0x0;
rINTMSK=BIT_GLOBAL;
ChangePllValue(0x43,0x3,0x1); //Fin=8MHz, Fout=60MHz
Uart_Init(0,115200,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -