近年来,单片机串行扩展技术得到了发展,并正在成为单片机应用系统扩展的主流。目前较为常用的串行扩展方式有移位寄存器扩展和I2C总线扩展。
1
. I2C总线基础
(
1
)串行扩展总线的特点
与并行扩展相比,串行扩展具有如下特点:
- 能最大限度地发挥最小系统的资源功能。将原来由并行扩展占用的P0 口和P2 口直接用于输入/输出。
- 简化硬件线路,缩小了印制线路板的面积,降低了成本。串行扩展只需1~4根信号线,器件间连线简单,结构紧凑,可大大缩小系统的尺寸,适用于小型单片机应用系统。
- 扩展性好,可简化系统的设计。串行总线能十分方便地构成由一台单片机和部分外围器件组成的单片机应用系统。
- 串行总线的缺点是数据处理容量较小,信号传输速度较慢,但随着CPU工作频率的提高,以及串行扩展芯片功能的不断增强,这些缺点将逐步淡化。其应用将会越来越广。
(2)I2C总线简介
aaaaI2C总线(Inter IC BUS—集成电路芯片间的串行总线)是一种由Philips公司推出的两线式串行总线,用于连接微控制器及其外围设备,是近年来在微电子通信控制领域广泛采用的一种新型总线标准,能用于替代标准的并行总线。
aaaaI2C总线产生于80年代,它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。目前有很多半导体集成电路上都集成了I2C接口,很多外围器件如SRAM、EEPROM、I/O口、ADC/DAC等也提供I2C接口。即使无I2C总线接口的器件(如80C51),只要通过与具有I2C结构的I/O接口电路连接,也能成为I2C总线扩展器件。带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。图6-34是I2C总线的外围扩展示意图。它给出了单片机应用系统中最常使用的I2C总线外围通用器件。
![i21](http://jpk.dqzyxy.net/dpj/kwzl6_clip_image002_0000.jpg)
aaaa图6-34 I2C总线的外围扩展示意图
(3) I2C总线的性能特点
I2C总线的性能特点可体现为以下几方面:
- 简单性
aaaa这是I2C总线最主要的优点。由于接口就在组件上,因此I2C总线占用的空间非常小,减少了电路板的层数和电路连线,简化了芯片管脚的数量,并且不需要并行总线接口,因而降低了互联成本。
- 有效性
aaaaI2C总线的长度可达25英尺(7、8米),标准I2C总线传输速率可以到100Kbps,通过使用7位地址码,就能支持128个设备。加强型I2C总线用了10位地址码(能够支持1024个设备),快速模式传输速度达到400Kbps;高速模式传输速度最高有3.4Mbps。
- 支持多主控(multimastering),所以更容易调试。
2. I2C总线原理
(1)I2C总线的构成
aaaaI2C总线是由数据线SDA和时钟信号SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址。
aaaa在信息的传输过程中,I2C总线上并接的每一模块电路既可充当主控器(或被控器),又能作为发送器(或接收器)使用,这取决于它所要完成的功能。
aaaaCPU发出的控制信号分为地址码和控制量两部分,地址码用来选地址,即接通需要控制的电路,确定控制的种类,类似于电话的拨号;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
(2) I2C总线的信号类型
aaaaI2C总线在传送数据过程中共有三种信号类型,它们分别是:开始信号、结束信号和应答信号。
- 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
- 应答位信号:主控器与被控器之间的联系信号,它是I2C总线上第9个时钟脉冲对应的SDA状态。当该状态为“0”电平时,表示有应答信号;当该状态为“1”电平时,表示无应答。
主控器与被控器之间应答信号的联系过程如下:
aaaa接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,可以判断为受控单元出现故障。
(3) I2C总线上一次典型的工作流程
- 开始:发送开始信号,表明传输开始。
- 发送地址:主设备发送地址信息,包含7位的从设备地址和1位的指示位(表明读或者写,即数据流的方向)。
- 发送数据:根据指示位,数据在主设备和从设备之间传输。数据一般以8位传输,最重要的位放在前面;具体能传输多少量的数据并没有限制。接收器上用一位的ACK(应答信号)表明每一个字节都收到了。传输可以被终止和重新开始。
- 停止:发送停止信号,结束传输。
(4) I2C总线的基本操作
aaaaI2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。参见图6-35。
![i23](http://jpk.dqzyxy.net/dpj/kwzl6_clip_image002_0001.jpg)
图6-35 串行总线上的数据传送顺序
⑴从器件的控制地址
aaaa在起始条件之后,必须是从器件的控制地址,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位是片选,最后一位是读写位,当该位为1时表示读操作,为0时表示写操作。如图6-36 所示。
图6-36 从器件的地址配置SLA
⑵写操作
aaaa写操作分为字节写和页面写两种,在页面写方式下要根据芯片的一次装载的字节不同而有所不同。关于页面写的地址、应答和数据传送的时序参见图6-37。灰色部分由80C51发送,白色部分由24CXX发送。
![i25](http://jpk.dqzyxy.net/dpj/kwzl6_clip_image002_0002.jpg)
说明:1.其中S表示开始信号,A是应答信号,P是停止信号。
2.SLAw是从器件的控制地址(最后一位为0,表示写操作);
3.SADR是要写入页面的首地址。
图6-37 页面写
⑶读操作
aaaa读操作有三种基本情况:当前地址读、随机读和顺序读。图6-38给出的是顺序读的时序图。
aaaa应当注意的是:最后一个读操作的第9个时钟周期没有应答信号。原因是为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。
![i26](http://jpk.dqzyxy.net/dpj/kwzl6_clip_image004_0001.jpg)
说明:1.其中S表示开始信号,A是应答信号,P是停止信号。
2.SLAw是从器件的控制地址(最后一位为0,表示写操作);
3.SLAR是从器件的控制地址(最后一位为1,表示读操作);
4.SADR是读出单元的首地址。
aaaaaaaaaaaa图6-38 顺序读
3. I2C总线应用实例
(1) 常用I2C芯片简介
aaaa近年来,基于I2C总线的各种串行EEPROM的应用日益增多,如CATALYST公司生产的24CXX系列芯片就是一个典型代表。该系列产品主要有24C02、24C04、24C08、24C16和24C32,容量分别对应于2~32KB。它们一般具有并口EEPROM的特点,但以串行方式传送数据,一般仅占用2~4条I/O线,价格低廉。
图6-39 是DIP封装的24C02与80C51的接口方案。其中A0、A1、A2是芯片地址线,单片使用时接地;SCL是串行移位时钟端;SDA是串行数据或地址端,CPU通过SDA访问芯片;WP是写保护端,接高电平时芯片只能读。
(2) 应用实例—80C51对X24C04的单字节写操作
aaaaX24C04是XICOR公司的CMOS结构4096位(512Byte×8位)串行EEPROM,16字节页面写。与80C51单片机接口如图6-40所示。SDA是漏极开路输出,且可以与任何数目的漏极开路或集电极开路输出“线或”(wire-Ored)连接,上拉电阻的选择可参考X24C04的数据手册。下面是通过I2C接口对X24C04进行单字节写操作的例程(设输入参数为A)。流程图及源程序如下:
MOV R7,#08H ;1字节8位
SENDA: CLR P3.2 ;
RLC A ;左移一位
MOV P3.3,C ;写一位
SETB P3.2
DJNZ R7,SENDA ;写完8个字节?
CLR P3.2 ;应答信号
SETB P3.3
SETB P3.2
RET
(3) 使用须知
aaaa在I2C总线的应用中应注意这样几个问题:
-
- 严格按照时序图的要求进行操作。
- 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。
- 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。
- 为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。