http://blog.youkuaiyun.com/hao507/archive/2011/01/27/6165909.aspx
转载自:http://blog.youkuaiyun.com/sailor_8318/archive/2009/03/06/3961458.aspx
在现代电子系统中,有为数众多的 IC 需要进行相互之间以及与外界的通信。为了提供硬件的效率和简化电路的设计, PHILIPS 开发了一种用于内部 IC 控制的简单的双向两线串行总线 I2C ( Inter-integrated circuit )。
每个器件都有一个唯一的地址,而且可以是单接收的器件(例如: LCD 驱动器)或者可以接收也可以发送的器件(例如:存储器)。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。 I2C 是一个多主总线,即它可以由多个连接的器件控制。
I2C 总线的一些特征
• 只要求 两条总线线路一条串行数据线 SDA 一条串行时钟线 SCL
• 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址,主机可以作为主机发送器或主机接收器
• 它是一个真正的 多主机总线 ,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
• 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s
• 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
• 连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制
传输速率
基本的 I2C 总线规范于 20 年前发布, 其数据传输速率最高为 100Kbits/s ,采用 7 位寻址。 但是由于数据传输速率和应用功能的迅速增加, I2C 总线也增强为快速模式( 400Kbits/s )和 10 位寻址以满足更高速度和 更大寻址空间的需求。
I2C 总线始终和先进技术保持同步,但仍然保持其向下兼容性。并且最近还增加了高速模式,其速度可达 3.4Mbits/s 。它使得 I2C 总线能够支持现有以及将来的高速串行传输应用,例如 EEPROM 和 Flash 存储器。
对于大于 256 字节的寻址空间是如何读取的呢?????????
设备地址
协议格式中第一个字节 ( 为 slave address) 由 7 位地址和一位 R/W 读写位 组成的,这字节是个器件地址。
常用 IIC 接口通用器件的器件地址是由 种类型号,及寻址码组成的,共 7 位。
如格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
1 、器件类型: D7-D4 共 4 位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这 4 位已是固定的。
2 、用户自定义地址码: D3-D1 共 3 位。这是由用户自己设置的,通常的作法如 EEPROM 这些器件是由外部 IC 的 3 个引脚所组合电平决定的 (用常用的名字如 A0,A1,A2 )。这也就是寻址码。所以为什么同一 IIC 总线上同一型号的 IC 只能最多共挂 8 片同种类芯片的原因了。
3 、最低一位就是 R/W 位,, “ 0 ” 表示写,“ 1 ” 表示读(通常读写信号中写上面有一横线,表示低电平)。 所以 I2C 设备通常有两个地址,即读地址和写地址
读写时序
要知道,主机向从访问时:
先向总线发出芯片地址
如果有芯片地址正确的芯片,会产生一个 SDA 上应答。
接着主机再发出应答过的芯片发出将要所进行操作的片内地址。
芯片地址正确的芯片,会再产生一个 SDA 上应答。
此时如果是读操作,从芯片将输出数据到 SDA 上。如果是写操作,主机会将数据写到 SDA 上。
就这样可以完成了一个读或写的操作。当然这里面还开始和停止位这些动作。
SDA 线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。。为什么啊??
因为 I2C 总线规范就是这样定义的。如果不符合这样的要求, I2C 总线就定义为起始位或者停止位。
起始位的定义:时钟为高电平时, SDA 线上的电平由高变为低;
停止位的定义:时钟为高电平时, SDA 线上的电平由低变为高。
所以数据在 SCL 高电平期间必须保持稳定,数据的改变必须发生在 SCL=0 期间。
典型器件:
EEPROM AT24C 系列 AT24C02/04/08/16…../256 , 128byte - 32K
地址 1010
8-bit A/D and D/A converter PCF8591 地址 1001
键盘 ZLG7290 http://www.zlgmcu.com/philips/iic/zlg7290.asp
LED SAA1064 http://www.laogu.com/wz_26862.htm
http://hi.baidu.com/alone6230/blog/item/0ebf50d8ff802c3132fa1c1c.html
I2C I/O 扩展芯片 PCF8574 ,如 LCD1602 变成了 I2C 接口
拓扑连接
上拉电阻,集电极开漏门
http://hi.baidu.com/wengqiaoyi/blog/item/e82c6055d6c14ec6b745ae9d.html
利用 I2C 总线的 24C 系列串行 E2PROM 的读写
I2C 总线是一种用于 IC 器件之间连接的二线制总线。它通过 SDA (串行数据线)及 SCL (串行时钟线 ) 两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、 LCD 驱动器还是键盘接口。
1 . I2C 总线的基本结构 采用 I2C 总线标准的单片机或 IC 器件,其内部不仅有 I2C 接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。 CPU 不仅能通过指令将某个功能单元电路挂靠或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。
2 . 双向传输的接口特性 传统的单片机串行接口的发送和接收一般都各用一条线 ,如 MCS51 系列的 TXD 和 RXD ,而 I2C 总线则根据器件的功能通过 软件程序使其可工作于发送或接收方式。 当某个器件向总线上 发送信息时,它就是发送器 ( 也叫主器件 ) ,而当其从总线上接收信息时,又成为接收器 ( 也叫从器件 ) 。主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。 I2C 总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。在总线上,既没有中心机,也没有优先机。
总线上主和从 ( 即发送和接收 ) 的关系不是一成不变的,而是取决于此时数据传送的方向。 SDA 和 SCL 均为双向 I/O 线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。
3 . I2C 总线上的时钟信号 在 I2C 总线上传送信息时的时钟同步信号是由挂接在 SCL 时钟线上的所有器件的逻辑“与”完成的。 SCL 线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使 SCL 线一直保持低电平,使 SCL 线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响 SCL 线的状态,于是这些器件将进入高电平等待的状态。
当所有器件的时钟信号都上跳为高电平时,低电平期结束, SCL 线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将 SCL 线拉成低电平。这样就在 SCL 线上产生一个同步时钟。可见, 时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定 。
4 .数据的传送 在数据传送过程中,必须确认数据传送的开始和结束。在 I2C 总线技术规范中,开始和结束信号(也称启动和停止信号)的定义:当时钟线 SCL 为高电平时,数据线 SDA 由高电平跳变为低电平定义为“开始”信号;当 SCL 线为高电平时, SDA 线发生低电平到高电平的跳变为“结束”信号。开始和结束信号都是由主器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。
I2C 总线的数据传送格式是:在 I2C 总线开始信号后,送出的第一个字节数据是用来选择从器件地址的,其中前 7 位为地址码,第 8 位为方向位 (R/W) 。方向位为“ 0 ” 表示发送,即主器件把信息写到所选择的从器件;方向位为“ 1 ” 表示主器件将从从器件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件,其接收信息还是发送信息则由第 8 位 (R/W) 确定。
在 I2C 总线上每次传送的数据字节数不限,但每一个字节必须为 8 位, 而且每个传送的字节后面必须跟一个认可位(第 9 位),也叫应答位( ACK )。数据的传送过程如图 3 所示。每次都是先传最高位,通常从器件在接收到每个字节后都会作出响应,即释放 SCL 线返回高电平,准备接收下一个数据字节,主器件可继续传送。 如果从器件正在处理一个实时事件而不能接收数据时,(例如正在处理一个内部中断,在这个中断处理完之前就不能接收 I2C 总线上的数据字节)可以使时钟 SCL 线保持低电平 ,从器件必须使 SDA 保持高电平,此时主器件产生 1 个结束信号,使传送异常结束,迫使主器件处于等待状态。当从器件处理完毕时将释放 SCL 线,主器件继续传送。
当主器件发送完一个字节的数据后,接着发出对应于 SCL 线上的一个时钟( ACK )认可位,在此时钟内主器件释放 SDA 线,一个字节传送结束,而从器件的响应信号将 SDA 线拉成低电平,使 SDA 在该时钟的高电平期间为稳定的低电平。从器件的响应信号结束后, SDA 线返回高电平,进入下一个传送周期。
I2C 总线还具有广播呼叫地址用于寻址总线上所有器件的功能。若一个器件不需要广播呼叫寻址中所提供的任何数据,则可以忽略该地址不作响应。如果该器件需要广播呼叫寻址中提供的数据,则应对地址作出响应,其表现为一个接收器。
5 .总线竞争的仲裁 总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况。例如, 多单片机系统中,可能在某一时刻有两个单片机要同时向总线发送数据,这种情况叫做总线竞争。 I2C 总线具有多主控能力 ,可以对发生在 SDA 线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平, 则发送电平与此时 SDA 总线电平不符的那个器件将自动关闭其输出级。 总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。 由于是利用 I2C 总线上的信息进行仲裁,因此不会造成信息的丢失。(和 CAN 总线的仲裁原理一样)
6. I2C 总线接口器件 目前在视频处理、移动通信等领域采用 I2C 总线接口器件已经比较普遍。另外,通用的 I2C 总线接口器件,如带 I2C 总线的单片机、 RAM 、 ROM 、 A/D 、 D/A 、 LCD 驱动器等器件,也越来越多地应用于计算机及自动控制系统中。
现在常用 I2C 总线接口的串行 E2PROM 器件,如 AT24C02/04/08/16…../256 等。( 02 即 2kbit . )
AT24C02 是美国 ATMEL 公司的低功耗 CMOS 串行 EEPROM ,它是内含 256 × 8 位存储空间,具有工作电压宽( 2.5 ~ 5.5V )、擦写次数多(大于 10000 次)、写入速度快(小于 10ms )等特点。
AT24C02 的 1 、 2 、 3 脚是三条地址线,用于确定芯片的硬件地址。在 AT89C51 试验开发板上它们都接地,第 8 脚和第 4 脚分别为正、负电源。第 5 脚 SDA 为串行数据输入 / 输出,数据通过这条双向 I2C 总线串行传送,在 AT89C51 试验开发板上和单片机的 P3.5 连接。第 6 脚 SCL 为串行时钟输入线,在 AT89C51 试验开发板上和单片机的 P3.6 连接。 SDA 和 SCL 都需要和正电源间各接一个 5.1K 的电阻上拉。第 7 脚需要接地。
24C 02 中带 有片内地址寄存器 。每写入或读出一个数据字节后, 该地址寄存器自动加 1 , 以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达 8 个字节的数据。
http://baike.baidu.com/view/751581.htm
I2C(Inter - Integrated Circuit) 总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。 I2C 总线产生于在 80 年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
1 I2C 总线特点
I2C 总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此 I2C 总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达 25 英尺 ,并且能够以 10Kbps 的最大传输速率支持 40 个组件。 I2C 总线的另一个优点是,它支持多主控 (multimastering) , 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
2 I2C 总线工作原理
2.1 总线的构成及信号类型
I2C 总线是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送,最高传送速率 100kbps 。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中, I2C 总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。 CPU 发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。 CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号, CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了 I2C 接口。带有 I2C 接口的单片机有: CYGNAL 的 C8051F0XX 系列, PHILIPSP87LPC7XX 系列, MICROCHIP 的 PIC16C6XX 系列等。很多外围器件如存储器、监控芯片等也提供 I2C 接口。
3 总线基本操作
I2C 规程运用主 / 从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟( SCL )控制总线的传输方向,并产生起始和停止条件。 SDA 线上的数据状态仅在 SCL 为低电平的期间才能改变, SCL 为高电平的期间, SDA 状态的改变被用来表示起始和停止条件。
3.1 控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义, EEPROM 一般应为 1010 ),接着三位为片选,最后一位为读写位,当为 1 时为读操作,为 0 时为写操作。
3.2 写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。
3.3 读操作
读操作有三种基本操作:当前地址读、随机读和顺序读。图 4 给出的是顺序读的时序图。应当注意的是:最后一个读操作的第 9 个时钟周期不是“不关心”。为了结束读操作,主机必须在第 9 个周期间发出停止条件或者在第 9 个时钟周期内保持 SDA 为高电平、然后发出停止条件。
在 I2C 总线的应用中应注意的事项总结为以下几点 :
1 ) 严格按照时序图的要求进行操作,
2 ) 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。
3 ) 程序中为配合相应的传输速率,在对口线操作的指令后可用 NOP 指令加一定的延时。
4 ) 为了减少意外的干扰信号将 EEPROM 内的数据改写可用外部写保护引脚(如果有),或者在 EEPROM 内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断 EEPROM 是否被意外改写。