I2C(Inter-Integrated Circuit内置集成电路)总线,是由Philips公司推出的一种双向二进制同步串行通信标准,只需要两根线(串行时钟线SCL,串行数据线SDA,这两根线都是双向的)就可以完成总线上器件的数据传输。在总线上既可以只有一个主设备也可以有多个主设备,当多个主设备同时启动总线时,可以进行总线的冲突检测和总线仲裁。AT89C51是没有I2C总线的,但是可以使用两个I/O口进行模拟。连接到总线上的设备均采用漏极开路或集成电极开路,因此SCL、SDA需要连接上拉电阻连接到电源正极。在中线空闲时,SCL、STL保持高电平。I2C的标准传输率是100Kb/s,快速的是400Kb/s,高速下是3.4Mb/s。
这个是ARM中的图,但是也适用于AT89C51(使用两个I/O口进行模拟)。注意:在SCL、SDA上要接上拉电阻(一般是3~10KΩ,强调低功耗可以取得大些,如果强调高速率可以取得小些),且主机(通常是微控制器)和各个从机之间要共GND。
I2C要求有严格的时序要求,总线工作时,由SCL发送时钟脉冲,由SDA传送数据。总线协议规定:主节点在通信时都要使用起始信号、结束信号、发送数据、应答信号。总线传送的每一帧数据(排除起始,结束信号)均为1B,每发送完1B,接收器给一个应答信号。再启动总线后第一个字节的高7位是从节点的寻址地址,第8位为方向为(1表示主节点对从节点的写操作,0表示主节点对从节点的读操作)。
起始信号START:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
停止信号STOP:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号ACK:SCL由主设备控制,在START信号之后,从设备在8个时钟脉冲的控制下接收到8b数据期间不发出任何信号,而在第9个时钟期间,从设备将SDA拉低表示应答。
数据传送:I2C协议规定,只有当SCL为低电平时才允许SDA上的数据改变,当SCL为高电平时,SDA必须保持稳定。因为,开始和结束信号都是发生在SCL为高电平的时候,如果在传送数据时,SDA发生电瓶变化会被认为是开始或停止信号。在传送数据时,高位在前。