您的位置 首页 被动

ADS_LPC2103开发板I2C测验实验

includeconfigh相关头文件defineC02MasterAddr0xa0C02的器件地址defineC02SlaveAddr0读写数据的起始地址defineLED(119)

#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;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/258818.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部