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

📄 iic.cpp

📁 包含了大量文件
💻 CPP
字号:
#include <windows.h>
#include <Winbase.h>
#include <s2440.h>
#include <nkintr.h>
#include <oalintr.h>
#include <p2.h>
#include "IIC.h"
#include  <Pkfuncs.h>
#include  <Winreg.h>

static volatile int _iicDataCount;
static volatile int _iicMode;
static int _iicPt;

extern volatile	IICreg		*v_pIICregs;		
extern volatile IOPreg		*v_pIOPregs;	
extern volatile CLKPWRreg	*g_pCLKPWRreg;                            
 
static HANDLE IIC_InterruptEvent     =NULL;

#define  len 52
/*BYTE max9851[len]={
	0x00,//0x1  ---------------(read only!)-------------
	0x86,//0x2  adc power up 1 00 0011 0 pnd=1    //mic 0 00 0000 0
	0x07,//0x3  000 0 0 11(mic amp up) 1          //mic 000 11 00 0
	0xaa,//0x4  10(hp on is h) 10 10(sp) 10       //mic 11 11 11 11
	0xa2,//0x5  1(en Auto-Detect) 01 0 0 01(Internal MCLK/LRCK Ratio) 0
	0x00,//0x6  0(slave=0 ) 0(single polrity) 0(1-iis) 1(dis dsp) 00(L_J) 11
	0x00,//0x7  0 0 0 0 0 011
	0x81,//0x8  100 10000
	0x81,//0x9
	0xa5,//0xa  1 0 1 0 0101
	0x00,//0xb  0000 0111
	0x00,//0xc  1 0 01 0 0 0 0
	0x60,//0xd  111 1 00 00
	0x02,//0xe  00 11 0(Register changes take effect immediately)1 0 0
	0x00,//0xf  11(hp unmuted) 11(sp unm) 1 0 1 1  
	0x00,//0x10 0 0(mic1) 1(differential )  11111
	0x00,//0x11   
	0x00,//0x12 1 1 011111 (ALC)    //00
	0x00,//0x13
	0x00,//0x14 0111 1111 (Passthru x Volume:) //18
	0x00,//0x15  
	0x00,//0x16 0111 1111(ADCx Volume) 
	0x00,//0x17
	0x80,//0x18 1 001 1000
	0x80,//0x19 
	0x00,//0x1a 1 001 1000(PCMx Mixer Volume: PCMA)  //18
	0x00,//0x1b
	0x00,//0x1c 0010  0010 (Beep Frequency & On Time)
	0x00,//0x1d 000 00101 (Beep Volume & Off Time)
	0x00,//0x1e 01 0 01 01 1
	0x88,//0x1f 0000 0000(Tone Control)
	0x00,//0x20 0001 1000(Master Volume Control:)
	0x00,//0x21
	0x00,//0x22 0000 0000(Headphone Volume Control:)
	0x00,//0x23 
	0x00,//0x24 0000 0000(Speaker Volume Control:)
	0x00,//0x25
	0x00,//0x26 01 01 01 01 (ADC & PCM Channel Mixer)
	0x00,//0x27 010 010 1  1
	0x7f,//0x28 01 111111
	0xc0,//0x29 11 000000
	0x00,//0x2a 11(alc enable)000000
	0x3f,//0x2b 
	0x00,//0x2c 
	0x00,//0x2d 1 1 0 100 00
	0x00,//0x2e ---------------(read only)--------------
	0x00,//0x2f 1 1 00 1000(Battery Compensation)
	0x00,//0x30 ---------------(read only)--------------
	0xc2,//0x31 ---------------(read only)--------------
	0x3b,//0x32 0  0111011
	0x00,//0x33 0000 1 001
	0x5f,//0x34 0101 1111 
};*/
BYTE CS42L52[len]={
	0x00,//0x1  ---------------(read only!)-------------
	0x1e,//0x2  adc power up 1 00 0011 0 pnd=1    //mic 0 00 0000 0
	0x1f,//0x3  000 0 0 11(mic amp up) 1          //mic 000 11 00 0
	0x50,//0x4  10(hp on is h) 10 10(sp) 10       //mic 11 11 11 11
	0xa0,//0x5  1(en Auto-Detect) 01 0 0 01(Internal MCLK/LRCK Ratio) 0
	0x00,//0x6  0(slave=0 ) 0(single polrity) 0(1-iis) 1(dis dsp) 00(L_J) 11
	0x00,//0x7  0 0 0 0 0 011
	0x90,//0x8  100 10000   *******
	0x90,//0x9              *******
	0xa5,//0xa  1 0 1 0 0101
	0x00,//0xb  0000 0111
	0x00,//0xc  1 0 01 0 0 0 0
	0x60,//0xd  111 1 00 00
	0x00,//0xe  00 11 0(Register changes take effect immediately)1 0 0
	0x00,//0xf  11(hp unmuted) 11(sp unm) 1 0 1 1  
	0x2f,//0x10 0 0(mic1) 1(differential )  11111        *********
	0x2f,//0x11                                          *********
	0x00,//0x12 1 1 011111 (ALC)    //00
	0x00,//0x13
	0x18,//0x14 0111 1111 (Passthru x Volume:) //18
	0x18,//0x15  
	0xf6,//0x16 0111 1111(ADCx Volume) 
	0xfe,//0x17
	0x18,//0x18 1 001 1000
	0x18,//0x19 
	0x18,//0x1a 1 001 1000(PCMx Mixer Volume: PCMA)  //18
	0x18,//0x1b
	0x00,//0x1c 0010  0010 (Beep Frequency & On Time)
	0x00,//0x1d 000 00101 (Beep Volume & Off Time)
	0x41,//0x1e 01 0 01 01 1
	0x21,//0x1f 0000 0000(Tone Control)
	0x18,//0x20 0001 1000(Master Volume Control:)
	0x18,//0x21
	0x00,//0x22 0000 0000(Headphone Volume Control:)
	0x00,//0x23 
	0x00,//0x24 0000 0000(Speaker Volume Control:)
	0x00,//0x25
	0x00,//0x26 01 01 01 01 (ADC & PCM Channel Mixer)
	0x00,//0x27 010 010 1  1
	0x7f,//0x28 01 111111
	0xc0,//0x29 11 000000
	0xc0,//0x2a 11(alc enable)000000
	0x3f,//0x2b 
	0x28,//0x2c 
	0x0c,//0x2d 1 1 0 100 00
	0x00,//0x2e ---------------(read only)--------------
	0x00,//0x2f 1 1 00 1000(Battery Compensation)
	0x00,//0x30 ---------------(read only)--------------
	0x08,//0x31 ---------------(read only)--------------
	0x3b,//0x32 0  0111011
	0x00,//0x33 0000 1 001
	0x5f,//0x34 0101 1111 
};

void IIC_Initialize()

	
{
	g_pCLKPWRreg->rCLKCON |= IIC_INTERNAL_CLOCK_ENABLE;		//   Control PCLK into IIc block.
	
	if (IIC_InterruptEvent == NULL)
	{
		// allocate the interrupt event for IIC
		IIC_InterruptEvent = CreateEvent(NULL, FALSE, FALSE,NULL);
		
		if (NULL == IIC_InterruptEvent) 
		{
			RETAILMSG(1,(TEXT("IIC interrupt event Error1\r\n")));
		}
		// initialize the card insertion interrupt event
		if (!InterruptInitialize (SYSINTR_IIC, IIC_InterruptEvent, NULL, 0)) 
		{
			RETAILMSG(1,(TEXT("IIC interrupt event Error2\r\n")));
		}
	}
	
	MAX_WriteBlock();  //write data finish!
	
	RETAILMSG(1,(TEXT("-------------finsish---------------\r\n")));
}

void MAX_WriteBlock(void)
{
    int i;
    //Sleep(5000);
    
    
   //Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x2,0x9e);
   
   /*U8 data=0;
   Rd_MAXIIC(IIC_SLAVEADDRESS_READ,1,&data);
   RETAILMSG(1,(TEXT("-------------0x1---------------0x%x\r\n"),data));
   //RETAILMSG(1,(TEXT("\r----------------volume value is0x%x \r\n"), ));
   Rd_MAXIIC(IIC_SLAVEADDRESS_READ,0x2e,&data);
   RETAILMSG(1,(TEXT("-------------0x2e---------------0x%x\r\n"),data));
   Rd_MAXIIC(IIC_SLAVEADDRESS_READ,0x30,&data);
   RETAILMSG(1,(TEXT("-------------0x30---------------0x%x\r\n"),data));
   Rd_MAXIIC(IIC_SLAVEADDRESS_READ,0x31,&data);
   RETAILMSG(1,(TEXT("-------------0x31---------------0x%x\r\n"),data));
    */
   
    for(i=2; i<=45; i++)  //2d
    {
		    //RETAILMSG(1,(TEXT("num:%d\r\n"),i));	
	    Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,i,CS42L52[i-1]);
		//RETAILMSG(1,(TEXT("-------------0x%x---------------0x%x\r\n"),i,max9851[i-1]));
    
		  
	}
	RETAILMSG(1,(TEXT("***********************************************************\r\n")));	
	Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x2f,CS42L52[0x2f-1]);	  
  Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x32,CS42L52[0x32-1]);
  Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x33,CS42L52[0x33-1]);
  Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x34,CS42L52[0x34-1]);
    
    //Sleep(500);
  //power up 0x2
   //Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x2,0x9e);
   
   /*U8 kai;
   for(i=0; i<=45; i++)
   {
	   Rd_MAXIIC(IIC_SLAVEADDRESS_READ,i+1,&kai);
	   RETAILMSG(1,(TEXT("-------------0x%x---------------0x%x\r\n"),i+1,kai));

   }*/
   RETAILMSG(1,(TEXT("--------------CLS4252 OK!--------------\r\n")));  
}

void Wr_MAXIIC(U32 slvAddr, U32 addr, U8 data)
{  
	  v_pIOPregs->rGPEUP  &= ~0xc000;                  	//Pull-up disable
    v_pIOPregs->rGPEUP  |=  0xc000;                  	//Pull-up disable
    v_pIOPregs->rGPECON &= ~(0xF<<28);                //GPE15:IICSDA , GPE14:IICSCL    
    v_pIOPregs->rGPECON |=  (0xa<<28);                //GPE15:IICSDA , GPE14:IICSCL    
	
    //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit 
    v_pIICregs->rIICCON  = (1<<7) |  (1<<5) | (0xf);
	
	
    v_pIICregs->rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx)
    v_pIICregs->rIICLC = (1<<2)|(3);// Filter enable, 15 clocks SDA output delay     added into 2440
	
	
    _iicMode      = WRDATA;
    _iicPt        = 0;
    _iicData[0]   = (U8)addr;
    _iicData[1]   = data;
    _iicDataCount = 2;
    // write slave address
    v_pIICregs->rIICDS	= slvAddr;  //0x42: OV7620 Slave ID 
    // After this time, timing is critical, because IIC start.
    v_pIICregs->rIICSTAT	= 0xf0; 	//Start Master TX Condition    
    v_pIICregs->rIICCON	= 0xef;   	//Clearing the pending bit isn't needed because the pending bit has been cleared.
	
    while(_iicDataCount!=-1)
		Run_IicPoll();
    
}

void Rd_MAXIIC(U32 slvAddr,U32 addr,U8 *data)
{  
	  v_pIOPregs->rGPEUP  &= ~0xc000;                  	//Pull-up disable
    v_pIOPregs->rGPEUP  |=  0xc000;                  	//Pull-up disable
    v_pIOPregs->rGPECON &= ~(0xF<<28);                //GPE15:IICSDA , GPE14:IICSCL    
    v_pIOPregs->rGPECON |=  (0xa<<28);                //GPE15:IICSDA , GPE14:IICSCL    
	
    //Enable ACK, Prescaler IICCLK=PCLK/512, Enable interrupt, Transmit clock value Tx clock=IICCLK/512
    v_pIICregs->rIICCON  = (1<<7) | (1<<6) | (1<<5) | (0xf);
	
	
    v_pIICregs->rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx)
    v_pIICregs->rIICLC = (1<<2)|(3);// Filter enable, 15 clocks SDA output delay     added into 2440
	
	/*IIC Slave Addr Write + IIC Reg Addr Write */	
	_iicMode      = SETRDADDR;
	_iicPt        = 0;
	_iicData[0]   = (U8)(addr);
	_iicDataCount = 1;
       
    // write slave address
    v_pIICregs->rIICDS	= IIC_SLAVEADDRESS_WRITE;   //write addr!
    // After this time, timing is critical, because IIC start.
    v_pIICregs->rIICSTAT= 0xf0; 	//Start Master TX Condition   
    v_pIICregs->rIICCON	= 0xef;   	//Clearing the pending bit isn't needed because the pending bit has been cleared.
	
	while(_iicDataCount!=-1)
       Run_IicPoll();
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    _iicMode      = RDDATA;
    _iicPt        = 0;
    _iicDataCount = 1;
    
    v_pIICregs->rIICDS   = slvAddr;    //read addr!

    v_pIICregs->rIICSTAT = 0xb0;                   //Master Rx,Start
    v_pIICregs->rIICCON  = 0xef;                    //Resumes IIC operation.
	while(_iicDataCount!=-1)
       Run_IicPoll();

	*data = _iicData[1]; 
	//RETAILMSG(1,(TEXT("max9851 read data!\r\n")));
	//RETAILMSG(1,(TEXT("Data:0x%d\r\n"),_iicData[1]));
}

void Run_IicPoll(void)
{
	DWORD waitStatus;

	waitStatus = WaitForSingleObject(IIC_InterruptEvent, INFINITE);
	// When using polling mode
	//    if(s2440IIC->rIICCON & 0x10)                  //Tx/Rx Interrupt Enable
	IicPoll();
}       

void IicPoll(void)
{

	//RETAILMSG(1,(TEXT("IIC Interrupt occur\r\n")));
	
    switch(_iicMode)
    {		
	case WRDATA:
		if((_iicDataCount--)==0)
		{
			v_pIICregs->rIICSTAT = 0xd0;                //stop MasTx condition 
			v_pIICregs->rIICCON  = 0xef;                //resumes IIC operation.
			Delay(10);                       		// we should adjust this time.
			break;    
		}
		
		v_pIICregs->rIICDS = _iicData[_iicPt++];        	//_iicData[0] has dummy.
		//for setup time until rising edge of IICSCL. we have to adjust this time.
		Delay(10);	
		v_pIICregs->rIICCON = 0xef;                    	 //resumes IIC operation.		
		break;
	case SETRDADDR:
		if((_iicDataCount--)==0)
		{
			v_pIICregs->rIICSTAT = 0xd0;                //stop MasTx condition 
    		v_pIICregs->rIICCON  = 0xef;                //resumes IIC operation.
            Delay(10);      //wait until stop condtion is in effect.
				  
            break;                  //IIC operation is stopped because of IICCON[4]    
		}
		v_pIICregs->rIICDS = _iicData[_iicPt++];
		Delay(10); 
		v_pIICregs->rIICCON = 0xef;             //resumes IIC operation.
		break;

	case RDDATA:
		if((_iicDataCount--)==0)
		{
			_iicData[_iicPt++] = v_pIICregs->rIICDS;
            
			v_pIICregs->rIICSTAT = 0x90;      //Stop MasRx condition 
			v_pIICregs->rIICCON  = 0xef;      //Resumes IIC operation.
			Delay(10);                 //Wait until stop condtion is in effect., Too long time... 
			//The pending bit will not be set after issuing stop condition.
			break;    
		}      
		_iicData[_iicPt++] = v_pIICregs->rIICDS;     //The last data has to be read with no ack.
		
		if((_iicDataCount)==0)
			v_pIICregs->rIICCON = 0x6f;                 //Resumes IIC operation with NOACK in case of OV7620 Cameara  
		else 
			v_pIICregs->rIICCON = 0xef;                 //Resumes IIC operation with ACK
		break;
		
	default:
		break;      
    }
    
    InterruptDone(SYSINTR_IIC);
}

void Delay(int time)
{
    volatile int i;
    
    for(;time>0;time--)
        for(i=0;i<100;i++);
}

void RecordInit()
{
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x2,0x00);
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x3,0x18);
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x4,0xff);
}

void Recordfinish()
{
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x2,0x1f);
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x3,0x1f);
	 Wr_MAXIIC(IIC_SLAVEADDRESS_WRITE,0x4,0x50);
}

⌨️ 快捷键说明

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