#include”config.h”//相关头文件
#defineC02MasterAddr 0xa0//C02的器材地址
#defineC02SlaveAddr 0//读写数据的开始地址
#defineLED(1<<19)//LED IO标语
#defineLED2(1<<20)
#defineAA(1<<2)//I2CONSET的各位界说
#defineSI(1<<3)
#defineSTO(1<<4)
#defineSTA(1<<5)
#defineI2EN(1<<6)
#defineWRMode 0//写形式
#defineRDMode 1//读形式
#definelastbyte 1//是否为最终一个字节
uint8 I2C_buf1=5;
uint8 I2C_buf2=0;
//延时函数
voidDelay(uint32 dly)
{
uint32 i;
for(;dly>0;dly–)
{
for(i=0;i<50000;i++);
}
}
//I2C初始化函数
voidI2C_Init(uint32 Fi2c)
{
if(Fi2c>400000)
{
Fi2c=400000;
}
PINSEL0=(PINSEL0&(~0xf0))|0x50;//这里是让P02,P03选第二功用,即I2C总线
I2SCLH=(Fpclk/Fi2c+1)/2;//设置I2C速度为400K
I2SCLL=(Fpclk/Fi2c)/2;
I2CONCLR=0x2c;//主发送形式对STA,AA,SI清零
I2CONSET=0x40;//运用I2C总线
//I2CONCLR = STA|AA|SI;
//I2CONSET = I2EN;
}
//I2C bus start function
voidI2C_Start(void)
{
I2CONSET=STA;//set start condition
do{}while(0x08!=I2STAT);//A start condition has been transmitted
I2CONCLR=STA;//clear start condition
}
//I2C bus stop function
voidI2C_Stop(void)
{
I2CONSET=STO;//set STO condition
I2CONCLR=SI;//clear SI condition
}
//write byte function
voidWriteByte(uint8 data)
{
I2DAT=data;// data transmitted
I2CONCLR=SI;//clear SI condition
}
//wirte I2C bus address mode is RDMode or WRMode
voidWriteAddr(uint8 Mode)
{
WriteByte(C02MasterAddr+Mode);//transmite the I2C address and R/W mode
if(Mode)
{
do{}while(0x40!=I2STAT);//SLA+R has been transmitted;ACK has been recevied
}
else
{
do{}while(0x18!=I2STAT);//SLA+W has been transmitted;ACK has been received
}
}
//write data to I2C
voidWriteData(uint8 data)
{
WriteByte(data);// data is will transmited data
do{}while(0x28!=I2STAT);//Data byte in I2DAT has been transmitted;ACK has been received
}
//read i2c byte
uint8 ReadByte(uint8 last)
{
if(last)
{
I2CONCLR=AA;
I2CONCLR=SI;
do{}while(0x58!=I2STAT);//data byte has been received;NOT ACK has been returned
}
else
{
I2CONSET=AA;//transmited ACK
I2CONCLR=SI;
do{}while(0x50!=I2STAT);//data byte has been received;ACK has been returned.
}
returnI2DAT;//return read data
}
//write data into 24c02
voidWriteC02(void)
{
//uint8 i;//define unsigned char i
I2C_Start();
WriteAddr(WRMode);
WriteData(C02SlaveAddr);//the data stor address
WriteData(I2C_buf1);
I2C_Stop();
}
//read I2C data
voidReadC02(void)
{
//uint8 i;
I2C_Start();
WriteAddr(WRMode);
WriteData(C02SlaveAddr);
I2C_Stop();
I2C_Start();
WriteAddr(RDMode);
I2C_buf2=ReadByte(lastbyte);
I2C_Stop();
}
intmain(void)
{
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR=LED|LED2;
IOSET=LED|LED2;
I2C_Init(400000);
WriteC02();
Delay(1000);
ReadC02();
if(I2C_buf2==I2C_buf1)
{
while(1){
IOCLR=LED;//correct LED1 light
Delay(50);
IOSET=LED;
Delay(50);
}
}
else
{
while(1)
{
IOCLR=LED2;//error LED2 light
Delay(50);
IOSET=LED2;
Delay(50);
}
}
return0;
}