新闻中心

EEPW首页>嵌入式系统>设计应用> ADS_LPC2103开发板I2C测试试验

ADS_LPC2103开发板I2C测试试验

作者: 时间:2016-11-25 来源:网络 收藏
#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;
}


关键词:ADSLPC2103I2C测

评论


技术专区

关闭