I2C协议标准代码
1. 起始信号&停止信号
起始信号:当 SCL 线是高电平时 SDA 线从高电平向低电平切换。
停止信号:当 SCL 线是高电平时 SDA 线由低电平向高电平切换。
2. 起始信号代码
void I2cstart() //起始信号
{
SDA=1;
Delay8us();
SCL=1;
Delay8us();
SDA=0;
Delay8us();
SCL=0;
Delay8us();
}
3. 停止信号代码
void I2cstop() //停止信号
{
SDA=0;
Delay8us();
SCL=1;
Delay8us();
SDA=1;
Delay8us();
}
4.发送一个字节
unsigned char I2cSendByte(unsigned char dat) //CPU向设备发送一个字节
{
unsigned char a=0,b=0;
for(a=0;a<>
{
SDA=dat>>7;
dat=dat<>
Delay8us();
SCL=1;
Delay8us();
SCL=0;
Delay8us();
}
SDA=1;
Delay8us();
SCL=1;
while(SDA) //等待设备应答
{
b++;
if(b>200)
{
SCL=0;
Delay8us();
return 0; //设备无应答,返回0,并跳出此程序
}
}
SCL=0;
Delay8us();
return 1; //设备有应答,返回1,并跳出此程序
}
5.读取一个字节
unsigned char I2cReadByte() //CPU向设备读取一个字节
{
unsigned char a=0,dat=0;
SDA=1;
Delay8us();
for(a=0;a<>
{
SCL=1;
Delay8us();
dat<>
dat|=SDA;
Delay8us();
SCL=0;
Delay8us();
}
return dat; //返回dat,并跳出此程序
}
6. 向24C02地址addr,写数据dat
void At24c02Write(unsigned char addr,unsigned char dat) //向24C02地址addr,写数据dat
{
I2cstart(); //启动
I2cSendByte(0xa0); //发送24C02设备地址
I2cSendByte(addr); //发送24C02寄存器地址
I2cSendByte(dat); //发送数据
I2cstop(); //停止
}
7. 读取24C02寄存器addr中的数据
unsigned char At24c02Read(unsigned char addr) //读取24C02寄存器addr中的数据
{
unsigned char num;
I2cstart(); //开始
I2cSendByte(0xa0); //发送24C02设备地址-写
I2cSendByte(addr); //发送24C02寄存器地址
I2cstart(); //改变传输方式,重新开始
I2cSendByte(0xa1); //发送24C02设备地址-读
num=I2cReadByte(); //接收数据并保存至num
I2cstop(); //停止
return num; //返回读取值num
}
8.I2C写数据八个步骤
第一步,发送一个起始信号。
第二步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送寄存器地址,8bit数据。
第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,发送一个数据,8bit数据。
第七步,产生一个ACK应答信号,此应答信号为从机器件产生的应答信号。
第八步,发送一个停止信号。
9. I2C读数据十一个步骤
第一步,发送一个起始信号。
第二步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第三步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第四步,发送寄存器地址。
第五步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第六步,再次发送一个起始信号。
第七步,发送7bit从机地址,即24C02的地址。此处需要注意,发送数据时,无法发送7bit数据,此处发送了7bit地址+1bit读写选择位,即发送7bit+r/w。最低位为1表示读,为0表示写。
第八步,产生一个ACK应答信号,此应答信号为从机器件产生的应答。
第九步,读取一个字节(8bit)的数据。
第十步,产生一个ACK应答信号,此应答信号为CPU产生。
第十一步,产生一个停止信号。
联系客服