代码如下
#include<i2.h>
void Delay10us() //@11.0592MHz
{
unsigned char i;
i=2;
while (--i);
}
void I2cStart()//I2c开始信号
{
SCL=1;//SCL在高电平时SDA从高电平转为低电平就是开始信号
Delay10us();
SDA=1;
Delay10us();//保持状态时间要大于4.7us以便读取
SDA=0;
Delay10us();//保持状态时间要大于4us以便读取
SCL=0;//结束后恢复初始状态
Delay10us();
}
void I2cStop()//I2c结束信号
{
SCL=1;//SCL在高电平时SDA从低电平转为高电平就是结束信号
Delay10us();
SDA=0;
Delay10us();//保持状态时间要大于4.7us以便读取
SDA=1;
Delay10us();//保持状态时间要大于4us以便读取
SCL=0;//结束后恢复初始状态
Delay10us();
}
u8 I2cSendBaty(u8 dat)//发送一个字节的数据
{
//SCL在高电平时读取SDA数据在低电平时允许改变SDA数据改变
u8 i,j=0,k=0;
SCL=0;
for(i=0;i<8;i++)
{
j=dat>>(7-i);
SDA=j%2;
Delay10us();
SCL=1;//开始读取数据
Delay10us();
SCL=0;
}
SDA=1;//开始检测从机是否接收完成
Delay10us();
SCL=1;
while(SDA)//判断SDA状态(低电平时说明接收完成)
{
k++;
if(k>200)//超时判断
{
SDA=0;
Delay10us();
return 0;//返回接收失败
}
}
SCL=0;
Delay10us();
return 1;//返回接收完成
}
u8 I2cReadBaty()//读取一个字节的数据
{
u8 i,dat=0;
SDA=1;
Delay10us();
for(i=0;i<8;i++)
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
void At24c02Write(u8 Chip_addr,u8 M_addr,u8 dat)//IC芯片写入数据
{
I2cStart();//数据写入开始
I2cSendBaty(Chip_addr);//发送储存芯片地址
I2cSendBaty(M_addr);//发送储存芯片储存地址
I2cSendBaty(dat);//发送储存数据
I2cStop();//I2c结束信号
}
u8 At24c02Read(u8 Chip_addr,u8 M_addr,u8 dat)//IC芯片读取数据
{
u8 ret=0;
I2cStart();//数据写入开始
I2cSendBaty(Chip_addr);//发送储存芯片地址
I2cSendBaty(M_addr);//发送储存芯片储存地址
I2cStart();//数据写入开始
I2cSendBaty(Chip_addr+1);//发送储存芯片地址
ret= I2cReadBaty();//读取一个字节的数据
I2cStop();//I2c结束信号
return ret;
} |