第16章 C51模拟I2C总线

I2C总线是Philips公司最先推出的一种双向数据传输总线,仅使用两根连线便可以实现全双工同步数据传送。在I2C总线中,一条为串行数据线(SDA),另一条为一条串行时钟线(SCL)。I2C总线占用引脚少,接口协议简单。目前多数公司均推出了I2C总线接口的各种器件,如存储器、A/D、D/A、键盘、LCD等,大大方便了用户的选择。

本章主要介绍了I2C总线的工作原理、寻址方式以及数据操作,并重点介绍了数据传输协议以及相应的C51子函数。最后通过具体的实例,介绍如何使用在没有I2C总线接口的单片机上读写具有I2C总线接口的E2PROM存储器。

16.1 I2C总线概述

I2C总线采用两线制,由数据线SDA和时钟线SCL构成。I2C总线对数据通信进行了严格的定义。

16.1.1 I2C总线工作原理

典型的I2C总线系统结构,如图16.1所示。I2C总线上可以挂接多个器件,其中每个器件必须都支持I2C总线通信协议。

第16章 C51模拟I2C总线 - 图1

图 16.1 典型的I2C总线系统结构

其中,I2C总线的SCL和SDA端口在使用时必须连接上拉电阻。I2C总线的传输速率可以支持100kHz和400kHz两种,对于100kHz的速率一般采用10KΩ的上拉电阻,对于400kHz的速率一般采用2KΩ的上拉电阻。

在数据传输时,I2C总线为同步传输串行总线结构,SDA上的数据信号完全与SCL时钟同步。器件之间采用主从方式的控制结构,也就是主器件寻址并控制总线上的从器件。同步时钟脉冲也由主器件来产生。在I2C总线协议中,对数据传输的所有状态及操作都规定了严格的编码格式。主器件和从器件都必须遵守总线编码格式。

I2C总线协议允许总线接入多个器件,但同一时刻只能有一个器件作为主控制器。I2C总线在进行数据交换时,作为主控制器的器件需通过总线竞争获得主控权,然后启动数据传输。

I2C总线上的每个器件都具有唯一的地址,主控制器通过寻址可以确定数据接收方,即从器件。从器件接收主器件的请求并应答。数据传输结束后,主从器件将释放总线。I2C总线在使用时,需要注意如下几点。

❑I2C总线不允许同时存在多个主器件。

❑如果有几个主器件同时企图启动总线传送数据,I2C总线要通过总线裁决,以决定由哪一个主器件控制总线。总线裁决的机制是,当一个主器件送“1”,而另一个(或多个)送“0”,送“1”的主器件则退出竞争。在总线竞争过程中,时钟信号是各个主器件产生的异步时钟信号线“与”的结果。

❑I2C总线上的主控制器,可以是带有I2C总线接口的单片机或其他类型微控制器,也可以不带有I2C总线接口,而采用软件模拟I2C总线的接口功能,例如,典型的8051单片机。

❑I2C总线上的被控制器必须带有I2C总线接口。

❑I2C总线上外围扩展器件的器件数量不是由电流负载能力决定的,而是由电容负载能力确定的。

❑I2C总线上每个外围器件都有一个地址,扩展外围器件时受到器件地址空间的限制。