一、简介
I2C由时钟线(SCL)和数据线(SDA)两根线构成通信线路,总线空闲时通过上拉电阻拉高电平。I2C是一种主从结构(Master/Slave)总线,总线上每个设备都可以作为主机或从机,主设备通常是CPU,用来产生传输的时钟信号,并初始化总线的数据传输,而从设备只能被动响应主机请求。
二、如何操作不同I2C设备
因为一个I2C总线可以接多个从设备,这就需要主机通过地址来确定与哪个从机进行通信。I2C总线上的每个从设备都有一个唯一的7bit物理识别地址。因为I2C地址全0表示广播地址,所以一个I2C总线理论最多能挂载2^7 - 1=127个从设备。
三、时序图
起始信号:
SCL为高电平,SDA产生一次下降沿。
结束信号:
SCL为高电平,SDA产生一次上升沿。
数据传输:
SCL为低电平区间,SDA为高则传输1,为低则传输0.
主从机发送数据流程:
主机发送数据:
1.主机发送起始信号
2.主机发送从机地址,相应地址的从机发出ACK进行响应。
3.主机向从机发送数据,每位数据从机接收到就响应一次ACK。
4.主机发送完数据后,发送一个结束信号,结束本次发送。
从机发送数据:
1.主机发送起始信号
2.主机发送从机地址,相应地址的从机发出ACK进行响应。
3.从机向主机发送数据,每位数据主机接收到就响应一次ACK。
4.主机接收完数据后,发送一个结束信号,结束本次发送。
源码(以51单片机控制At24c02为例)
#include"i2c.h"
#include "intrins.h"
/*******************************************************************************
* 函数名 : Delay10us()
* 函数功能 : 延时10us
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Delay10us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_()