单片机I2C通讯代码详解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<8;a++) { SDA=dat>>7; dat=dat<<1; 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<8;a++) { SCL=1; Delay8us(); dat<<=1; 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产生。 第十一步,产生一个停止信号。 |
|