?? iic.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 + -