I2C是一种较为常用的串行接口标准,具有协议完善、支持芯片较多和占用I/O线少等优点。I2C总线是PHILIPS公司为有效实现电子器件之间的控制而开发的一种简单的双向两线总线。现在,I2C总线已经成为一个国际标准,在超过100种不同的IC集成电路上实现,得到超过50家公司的许可,应用涉及家电、通信、控制等众多领域,特别是在ARM嵌入式系统开发中得到广泛应用。
1 实例说明
本实例介绍I2C总线接口在ARM中的应用,以及它在ARM平台中的I/O交互拓展能力。
在ARM嵌入式系统开发中,系统和外围设备的信息交换能力非常重要。传统的方式多采用地址和数据总线来完成,但是由于嵌入式系统总线资源的限制,利用有限的I/O接口和足够的通信速度来扩展多功能的外围器件就显得十分必要。I2C总线正好可以满足这一嵌入式系统设计的需要。在嵌入式系统中应用I2C总线,可以在很大程度上简化系统结构,模块化系统电路,而I2C总线上各节点独立的电气特性也可以使整个系统具有最大的灵活性。
2 I2C设计原理
2.1 12G主从模式
I2C采用两根I/O线:一根时钟线(SCL串行时钟线),一根数据线(SDA串行数据线),实现全双工的同步数据通信。I2C总线通过SCL/SDA两根线使挂接到总线上的器件相互进行信息传递。
ARM通过寻址来识别总线上的存储器、LCD驱动器、I/O扩展芯片及其他I2C总线器件,省去了每个器件的片选线,因而使整个系统的连接极其简洁。总线上的设备分为主设备(ARM处理器)和从设备两种,总线支持多主设备,是一个多主总线,即它可以由多个连接的器件控制。典型的系统构建如图15-1所示。
每一次I2C总线传输都由主设备产生一个起始信号,采用同步串行传送数据,数据接收方每接收一个字节数据后都回应一个应答信号。一次I2C总线传输传送的字节数不受限制,主设备通过产生停止信号来终结总线传输。数据从最高位开始传送,数据在时钟信号高电平时有效。通信双方都可以通过拉低时钟线来暂停该次通信。
2.2 I2C工作原理
SDA和SCL都是双向线路,各通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时这两条线路都是高电平,连接到总线的器件输出必须是漏极开路或集电极开路才能执行线与的功能。I2C总线上数据的传输速率在标准模式下可达100kb/s,在快速模式下可达400kb/s,在高速模式下可达3.4Mb/s。连接到总线的接口数量由总线电容是400pF的限制决定。
图15-2(a)显示了I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。如果SCL处于高电平时,SDA上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。
图15-2(b)显示了I2C总线的起始位和停止位。
每次数据传输都是以一个起始位开始,而以停止位结束。传输的字节数由ARM控制和决定,没有限制。最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。
3 I2C硬件电路设计
3.1 I2C串口存储器
在嵌入式系统中会用到各种带I2C接口的芯片,这里以I2C串口存储器CSl24WC256为例,说明I2C电路在ARM嵌入式系统中的应用。
CSl24WC256是美国CAllALXST公司的一款芯片,是一个256K位支持I2c总线数据传送协议的串行CMOS串口存储器,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms),具有64字节数据的页面写能力。串行存储器一般具有两种写入方式,一种是字节写入方式,另一种是页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。
先进的CMOS技术实质上降低了器件的功耗,可在电源电压低到1.8V的条件下工作,等待电流和额定电流分别为0和3mA,特有的噪声保护施密特触发输入技术,可保证芯片在极强的干扰下数据不丢失。
芯片管脚排列图如图15-3所示,其管脚功能描述如表15-l所示。
其中:
·SCL:串行时钟。输入管脚,用于产生器件所有数据发送或接收的时钟。
·SDA:串行数据/地址。双向传输端,用于传送地址和所有数据的发送或接收。它是一个漏极开路端,因此要求接一个上拉电到Vcc端(典型值为100kHz时为10K,400kHz时为lK)。对于一般的数据传输,仅在SCL为低期间SDA才允许变化;在SCL为高期间变化,留给指示Start(开始)和Stop(停止)条件。
·AO/A1/A2:器件地址输入端。这些输入端用于多个器件级联时设置器件地址,当这些脚悬空时默认值为空。
·WP:写保护。如果WP管脚连接到Vcc,则所有的内容都被写保护(只能读):当 WP管脚连接到Vss或悬空时,则允许器件进行正常的读/写操作。
3.2电路原理图
如图15-4所示为串行存储器电路原理图,具有串行存储的功能,速率为100kHz,所R2/R3为IOK。如果将编码开关任一位打开,则对应的地址线为“l”;如果将编码开关任一位闭合则对应的地址线就为“0”。
4软件设计
4.1 I2C读写过程设计
ARM在系统中一直作为主设备,所以在I2C总线中只有主发送和主接收两种操作方式。在系统初始化时,由指令控制CPU送出相关的数据,经接口送到I2C寄存器内。通过初始化这些寄存器,可以实现I2C总线的主模式控制,以及实现I2C总线上的从设备读写。
当主设备和其中的一个从设备交换数据时,主设备首先发出一个启动Start信号,这个信号被所有的从设备接收。即从设备准备接收CPU的信号,然后主设备再发出它要通信的从设备地址。接下来,所有的从设备将收到的这个地址和它们自己的地址进行比较。
如果收到的地址和它们自己的地址不同,则什么都不做,只是等待主设备发出停止stop信号;如果收到的地址和它自己的地址相同,它就发出一个信号给主设备,这个信号称为应答Acknowledge信号。当主设备收到应答信号后,它就开始向从设备发送数据或者从从设备接收数据。当所有操作都进行完毕时,主设备发出一个Stop信号,通信完毕,释放I2C总线;然后所有的从设备都等待下一次Start信号的到来。
1.写过程
(1)上电后等待一个延时(1ms)。
(2)器件寻址,给一个起始信号(SCL为高电平时SDA给一个下降沿)。发送从器件地址,高5位为10110,然后根据A1/A0(如果和器件的地址相同则那个器件会应答)进行读/写控制(O为读)。
(3)应答,器件在SCL的第9个周期时SDA给出一个低电平,作为应答信号。
(4)开始写有两种模式:字节写模式和页写模式。
·字节模式:给出A15~A8应答,给出A7~A0应答;然后给出DATA和停止信号 (SCL为高电平时,SDA给出一个上升沿),接着要等待一个擦写时间。
·页写模式:给出地址以后连续给出64个数据。如果多于64个数据,则地址计数器自动翻转。(如果少于64昵,估计是没有问题的,但是需要实验验证。)
(5)判断擦写操作是否完毕的一个方法(应答查询),如果器件还处于擦写状态,则不会应答器件寻址;如果有应答,则说明擦写完毕。
2.读过程
(1)上电以后等待一个延时(lms)。
(2)器件寻址。
(3)应答。
(4)开始读有三种模式:立即当前地址读、选择/随机读、连续读。
·立即当前地址读:如果上次读/写的操作地址为N,则现在是N+1。不需要ACK,但是需要Stop信号。
·选择/随机读:先伪写(用于给出一个地址),然后再次启动,读取数据。
·连续读:读取一个以后给一个应答,这样器件会再给出下一个地址的数据内容。
(5)开始数据传输Start后、停止数据传输Stop前,SCL高电平期间,SDA上为有效数据。
4.2程序代码说明
以下是I2C函数的程序代码,其中DataBuff为读写数据输入/输出缓冲区的首址,ByteQuantity为要读写数据的字节数量,Address为I2C串口存储器片内地址,ControlByte为I2C串口存储器的控制字节,具体形式为(1)(0)(1)(O)(A2)(A1)(A0)(E/W)。
其中R/W=1表示读操作,R/W=0为写操作。ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效,则函数中止操作,并返回1。SDA和SCL由用户自定义。
此程序设计时考虑了通用性,与ARM CPU无关,与ARM速度也无关。时序的等待时间严格按照芯片文档上描述的,定义在I2C.h文件中。
使用时只需要定义SCL和SDL的引脚,以及I2C使用的电压(修改ⅡC_v宏定义)。
5实例总结
I2C总线硬件电路结构简单,符合系统设计向小型化低功耗方向发展的趋势。在其软件方面,由于使用平台模式的ⅡC软件包,保证了在较短的时间内开发出高稳定性的驱动程序。同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个惟一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。
本章以I2C串口存储器为例,给出了在ARM平台中I2C总线的软硬件实现方法,软件设计上I2C总线读和写模块的函数流程图,以及具体驱动程序的设计。实验证明,I2C总线能很好地扩展ARM系统的I/O交互能力。在设计I2C串口存储器时需注意以下几点问题。
·SCL不能太快,这只要限制高低电平的时间就可以了。
·Start信号需要建立和保持一段时间。
·Stop信号需要一定的建立时间,之后就是总线空闲时间。
存放在I2C总线的地址寄存器,称为主器件的从地址。器件地址由7位组成和一个方向位构成寻址字节SLA,寻址字节格式如下: DA3~DA0为器件地址,由器件出厂时给定的固定地址编码;A2~A0为器件在电路中接电源或地的不同,形成的地址数据;R/W——数据传输方向,规定总线上主节点对从节点的数据传输方向,R——接收,W——发送。表1为常用外围器件的节点地址。
表1 常用外围器件的节点地址
种类 | 型号 | 器件地址 | 备注 |
256x8/128x8静态RAM | PCF8570/71 | 1010A2A1A0R/W | |
256x8静态RAM | PCF8570 | 1011A2A1A0R/W | |
256BE2PROM | PCF8582 | 1010A2A1A0R/W | |
256BE2PROM | AT24C02 | 1010A2A1A0R/W | |
8位I/O口 | PCF8574 | 0100A2A1A0R/W | |
PCF8574A | |||
4位LED驱动控制器 | SAA1064 | 01110A1A0R/W | |
4通道8位A/D、1路D/A转换器 | PCF8591 | 1001A2A1A0R/W |
用I2C总线扩展I/O
系统应用中,需监控不同的输入信号或控制几个输出信号,有时把这些信号线直接连接到微处理器引脚。这些监控和控制用软件来做。然而,这种技术需要很多微处理器引脚。<?xml:namespace prefix = o /> 为了节省微处理器引脚,另一种可采用的方法是通过胶合逻辑接口实现监控和控制线与微处理器的通信。采用这种方法,连接到微处理器引脚的连线较少。而开发这样的系统比较麻烦和费时,因为需要更多的器件、更多的连线路由或更复杂的码开发。 本文给出监控和控制几个外设信号的良好方案,为接入并行总线提供一简单经济的方法,为接口不同的电子器件提供方便的途径。此方案是基于标准PCF8574和PCF8574A器件基础上的。这些器件的I2C地址是不同的。在此把这两种器件当做扩展器。 这种扩展器具有1个2线I2C通信总线,可与双向数据传输的I2C主机接口。I2C总线由2条信号线和1条地线组成。信号线是双向串行数据(SDA)线和双向串行时钟(SCL)线(见图1)。SDA和SCL线经上拉电阻连接正电源电压。在总线闲置时,这两条信号线上拉为高态。 >图1 I2C总线器件通过双向SDA和SCL线连接到I2C总线上 >图2 用PCF8574和PCF8574A实现I/O扩展的电路 连接到I2C总线上的每个器件,根据其功能都具有自己的专门地址,每个器件可做为接收器或发送器。可配置扩展器具有专门的7位地址。PCF8574 7位地址的前4位是0100,而PCF8574A是0111。低3位地址由器件引脚A2、A1、A0设置。因此,器件的完整的专门地址由A2、A1和A0设置。表1示出PCF8574和PCF8574A专门地址的各种可能设置。 这种为器件设置专门地址的能力使得在同一I2C总线上可具有多达8个PCF8574和8个PCF8574A器件。因为每个器件具有8个I/O引脚,所以采用PCF8574和PCF8574A可使单个I2C总线能控制多达128个I/O。 I2C与扩展器的通信由主机进行初始化,主机发送与主机通信的从器件的地址位。地址字节的第1部分由4位地址码组成,对于PCF8574器件设置为0100、PCF8574A器件设置为0111。片选位(A2、A1、A0)跟在地址码之后。这使得在1个总线上能用多达8个PCF8574和8个PCF8574A并能确定存取那个器件。对于所响应的器件,其地址字节中的片选位必须对应相应A2、A1和A0引脚上的逻辑电平。图2所示的电路用8个PCF8574和8个PCF8574A器件控制和监视高达128个I/O。■(冰) |
I2C 总线术语 器件寻址 数据传输位流 |
文章评论(0条评论)
登录后参与讨论