I2C设备

2024-06-24

I2C设备(精选6篇)

I2C设备 篇1

1、引言

I2C总线是Philips公司首先推出的一种两线制串行传输总线, 由一根数据线 (SDA) 和一根时钟线 (SCL) 组成, 用于连接微处理器及其外围设备。微处理器可以通过I2C总线访问控制支持I2C传输协议的设备。I2C总线因为协议成熟, 引脚简单, 传输速率高, 支持的芯片多等优点, 在Linux等嵌入式操作系统中应用非常广泛。I2C总线协议也随着Linux内核的不断升级而逐渐完善。在Linux 2.6内核中, I2C总线协议已经成为内核驱动的一部分。为了将I2C设备应用于嵌入式系统, 研究I2C总线在Linux内核中的实现过程将非常必要。

2、I2C总线体系结构

Linux的I2C体系结构分为3个部分:I2C核心、I2C总线驱动、I2C设备驱动。

I2C核心对应的源码在Linux 2.6内核driver目录下的i2c-core.c。它提供了I2C总线和I2C设备驱动的注册注销方法。它是I2C总线驱动和I2C设备驱动通信的桥梁。

I2C总线驱动是对I2C体系结构中, 适配器端的实现, 适配器可以由CPU控制, 甚至可以直接集成到CPU内部。

I2C总线驱动主要包含了I2C适配器的数据结构i2c_adapter, I2C适配器的通信方法algorithm等。通过访问I2C总线驱动, 我们可以控制I2C适配器的工作状态和过程等。

I2C设备驱动是对I2C硬件体系结构中设备端的实现, 设备一般挂在受CPU控制的I2C适配器上, 通过I2C适配器与CPU交换数据。I2C设备驱动包含的数据结构有i2c_driver和i2c_client, 我们需要根据具体的设备实现其中的成员函数。

如图 (1) 可以直观反映I2C设备、I2C驱动、I2C通信方法之间的相互依赖控制关系。

2.1 I2C总线的结构原理

内核中i2c.h文件对i2c_driver、i2c_client、i2c_adap ter和i2c_algorithm这四个数据结构进行了定义, 分析这四个数据结构复杂的关系是理解I2C体系结构的关键所在。

(1) i2c_adapte与i2c_algorithm。

i2c_adapter对应于物理上的一个适配器, 而i2c_algorithm可以看做是适配器访问总线的方法。

(2) i2c_driver与i2c_client。

i2c_driver对应一套驱动方法, 是纯粹辅助作用的数据结构, 不对应任何的物理实体。i2c_client对应于真实的物理设备, 每个I2C设备都需要一个i2c_clien来描述。

(3) i2c_adapte与i2c_client。

i2c_adapte与i2c_client的关系和硬件体系中适配器和设备的关系一致, 即i2c_client依附于i2c_adapte。

3、I2C总线的通信方法

I2C通信主要指I2C消息的传输和接收, I2C消息的结构体i2c_msg如下:

我们要为特定的I2C适配器实现其通信方法, 主要实现i2c_algorithm的master_xfer () 函数。

master_xfer () 函数处理I2C消息的流程, 对于数组中的每个消息, 若为读消息, 则赋从设备地址为 (msg->addr<<1) |1, 否则为msg->addr<<1。对每个消息产生一个开始位, 紧接着传送从设备地址, 然后开始数据的发送或接收, 对最后的消息还需要产生一个停止位。

3.1 I2C设备ZLG7290与ARM S3C2410之间的通信

I2C设备的读写可以有两种方法, 直接通过read () write () 读写I2C设备和通过O_RDWR IOCTL读写I2C设备。以下程序实现的功能是在8个8段数码管上显示A、0、1、4、2、C、3、5数据。我们可以通过如下程序实现ZLG7290与ARM S3C2410之间的通信, 实现CPU对ZLG7290的读写控制。

通过O_RDWR IOCTL读写I2C设备, 常用的IOCTL包括I2C_SLAVE (设置从设备地址) 、I2C_RE-TRIES (没有收到ACK情况下的重试次数, 默认为1) , I2C_TIMEOUT (超时) 以及I2C_RDWD。这种方式下, 要写入设备的数据连同从设备地址, 设备内部数据访问地址一起被封装成i2c_rdwr_ioctl_data数据结构。i2c_rdwr_ioctl_data数据结构包含了I2C消息数据结构i2c_msg及其消息数目。

以上两中方式读写ZLG7290设备中, 我们利用的是系统提供的字符设备驱动程序i2c-dev.c。应用程序用read () /write () 读写设备时, 会调用i2c-dev.c中的i2cdev_write/i2cdev_read函数, 这两个函数最终调用i2c_master_send函数, 由i2c_master_send调用i2ccore.c中的i2c_transfer函数。通过O_RDWR IOCTL读写I2C设备, 调用i2c-dev.c中的i2cdev_ioctl函数, 由i2cdev_ioctl函数调用i2c-core.c中的i2c_transfer函数。

Linux提供的字符设备的总线驱动程序摸板在driver/I2C/Algos目录下的i2c-algo-bit.c文件。在同级目录的Busses目录下, i2c-s3c2410.c文件具体实现了I2C总线的驱动程序。

s3c24xx_i2c结构体中定义了I2C适配器adap的名称, 重试次数, 访问方法algo (为s3c24xx_i2c_algorithm结构体)

s3c24xx_i2c_algorithm这个结构体填充了master_xfer和functionality函数。

i2c-core.c中的i2c_transfer函数中ret=adap->algo->master_xfer (adap, msgs, num) 程序调用了i2cs3c2410.c中的s3c24xx_i2c_xfer函数。这个函数非常关键, 所有I2C总线上对设备的访问最终应该由它来完成。这个函数还依赖于另外两个函数s3c24xx_i2c_doxfer和s3c24xx_i2c_message_start。

s3c24xx_i2c_xfer函数调用s3c24xx_i2c_doxfer函数传输I2C消息。s3c24xx_i2c_doxfer首先将S3C2410的I2C适配器设置为I2C主设备, 后初始化

s3c24xx_i2c结构体, 使能I2C中断, 并调用s3c24xx_i2c_message_start函数启动I2C消息的传输。

s3c24xx_i2c_message_start函数写S3C2410适配器对应的控制寄存器, 向I2C从设备传递开始位和设备位。

以上函数只是启动了I2C消息数组的传输周期, 并没有完整实现algorithm中的master_xfer流程, 这个流程的实现要借助于I2C适配器上的中断来步步推进。中断处理函数s3c24xx_i2c_irq主要通过调用i2s_s3c_irq_nextbyte函数进行传输工作的进一步推进。i2s_s3c_irq_nextbyte函数通过switch (i2c->state) 语句分成i2c-state的不同状态进行处理。在每种状态下, 先检查i2c-state的状态与硬件寄存器的状态是否一致, 若不一致, 则证明有误, 直接返回。当I2C处于读状态STATE_READ或写状态STATE_ERITE时, 通过is_lastmsg () 函数判断是否传输的是最后一条I2C消息, 如果是, 则产生停止位, 否则通过i2c->msg_idx++, i2c->msg++推进下一条消息。

4、结束语:

本文详细论述了Linux I2C体系结构, 通过对ZLG7290与ARM通信的实例分析, 详细阐述了I2C体系结构传输I2C消息的过程。随着ARM Linux嵌入式技术的不断发展, I2C驱动程序的开发在嵌入式设备的硬件开发中将会越来越重要。ARM Linux嵌入式产品将会遍及我们生活的各个领域, 嵌入式技术也将会不断推动社会进步, 给我们的生活带来越来越多的便利。

参考文献

[1]陈赜.ARM9嵌入式技术及Linux高级实践教程[M].北京:北京航空航天出版社, 2007

[2]吴明晖.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社, 2004

[3]孙福春、宁滨, ARM7嵌入式系统在车辆调度中的应用[J].微计算机信息 (测量自动化) , 2008.21 (3) :78-79.

[4]马忠梅, ARM嵌入式处理器结构与应用基础[M].北京:北京航空航天大学出版社, 2005.6.

[5]邬宽明, CAN总线原理和应用系统设计[M].北京:航空航天大学出版社, 1998.

I2C设备 篇2

摘 要:在一些应用系统中常常使用多片MCU协同实现系统功能,为实现多片MCU之间的数据交换,可以应用多端口RAM,但其结构复杂,成本高;而利用I2C总线使多片MCU之间通过RAM实现数据交换,具有结构简单、成本低的优点。介绍一种基于I2C总线的多MCU系统的设计,简要讨论I2C总线的结构、工作原理及多MCU竞争仲裁,给出I2C总线的多MCU系统的设计,实现了多MCU系统在实际中的应用。

关键词: I2C总线; 多MCU系统; P89LPC932; 数据交换

中图分类号: TN915?04 文献标识码: A 文章编号: 1004?373X09?0016?03

Abstract: System functions are implemented by multi?MCU collaborative working in some application systems. Although the multi?port RAM can be applied to achieve data exchange among multiple MCUs, its structure is complex and cost is high. Multi?MCU data exchange can be realized by the method to link I2C bus with RAM, which has the advantages of simple structure and low cost. Design of the multi?MCU system based on I2C bus is introduced. The structure, execution principle, multi?MCU competition and arbitration of I2C bus are discussed briefly. The design of multi?MCU system based on I2C bus is given. The application of multi?MCU system in practice was implemented.

Keywords: I2C; multi?MCU system; P89LPC932; data exchange

0 引 言

随着微电子技术的发展和MCU价格的降低,常常在实际应用中使用多片MCU来协同完成系统功能,以实现更高的性能。在这些系统中多片MCU通过某种方式实现数据交换,其中使用双口或多口E2PROM是一种常见的方法。这种电路结构复杂、成本高,需要软、硬件解决多MCU访问的竞争问题,更重要的是目前许多MCU不支持外部总线,不能扩展外部E2PROM,因此无法使用这种方法。I2C总线是由Philips公司推出的芯片间串行传输总线。它以规范严谨、使用简单灵活、支持的外围器件繁多等特点而被广泛应用。I2C总线具有十分完善的总线协议,在协议的支持下,可以自动处理总线上出现的多MCU访问的竞争。目前的文献通常是介绍I2C总线在单MCU系统中的应用,本文介绍一种利用I2C总线实现多片MCU访问E2PROM,从而实现数据交换的方法。

1 I2C总线工作原理

I2C总线是一种“二线”结构,分别使用“SDA”和“SCL”信号线实现数据传输。I2C总线对与其相连的设备采用软件寻址。每一种器件都有一个特定的7位I2C地址,以便主机了解当前正与其进行通信的器件。这个7位地址的前4位固定,用来指明器件所属类别,如1010表明是串行E2PROM器件。后3位(如A2,A1和A0)通过硬件管脚进行设置来修改器件的I2C地址。表示地址字节的最低1位(R/W)用来指明主控制器向从机发送(写,R/W=0)还是接收(读,R/W=1)来自从机的数据。每个传输过程都是以起始条件开始,停止或重新开始条件结束。每一次数据传送都是由主控制器发起的,如果某一时刻总线上有多个主控器,并且都请求控制总线,这时就要进行总线仲裁处理。一旦一个主控器获得总线控制权,其他主控器必须等待此主控器发送完一个停止条件并将总线释放为“空闲”状态方可重新控制总线。在系统中主控制器通常都由MCU担任。

2 多MCU系统下的I2C总线

I2C总线软、硬件协议十分巧妙,它可以用于构成多MCU系统。当系统中有多个I2C总线接口单片机时,会出现多MCU竞争的复杂状态。I2C总线软、硬件协议以及I2C总线单片机中的SFR保证了多MCU竞争时的协调管理。I2C总线提供的状态处理软件能自动处理总线上出现的26种状态。在使用I2C总线时将这些软件工具在程序存储器中定位,利用这些软件编制出归一化操作命令,用于I2C总线应用程序设计十分简单、方便。

2.1 多MCU竟争仲裁

主机只能在总线空闲的时侯启动传输。两个或多个主机可能在起始条件的最小持续时间内产生一个起始条件,结果在总线上产生一个规定的起始条件。当SCL线是高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同,仲裁可以持续多位。它的第一个阶段是比较地址位。如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机—发送器),或者比较响应位(如果是主机—接收器)。因为I2C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。

2.2 主系统的数据传送过程

考虑以下实际应用,系统中有两片单片机,MCU A进行数据采集,并将数据存入E2PROM,MCU B不定时地从E2PROM取出数据(如图1所示)。传输数据的过程如下:

(1) 假设MCU A要发送信息到E2PROM

① MCU A(主机)寻址接收器E2PROM;

② MCU A(主机)发送器发送数据到接收器E2PROM;

③ MCU A终止传输。

(2) 如果MCU B想从器件E2PROM中接收信息

① MCU B(主机)寻址E2PROM(从器件);

② MCU B(主机)从E2PROM(从器件)读数据;

③ MCU B终止传输。

(3) 以上两种情况同时发生时,I2C总线起动总线的竞争仲裁功能

① MCU A或MCU B赢得总线的控制权,掌管总线,竞争失败的微控制器退出总线;

② 赢得总线的控制权的微控制器寻址E2PROM(从器件),并进行数据传输;

③ 赢得总线的控制权的微控制器终止数据传输,竞争失败的微控制器试图掌控总线,从器件寻址,并进行数据传输;

④ 数据传送完毕,总线进入空闲状态。

由上可知,在多MCU系统下的数据传送过程要比单主机系统下复杂得多。但I2C总线软、硬件协议能进行协调管理,保证数据的可靠传输。

3 多MCU系统的具体实现

本应用中选用了两片P89LPC932单片机及一片24系列的E2PROM。P89LPC932中I/O口P1.3和P1.2为复用端口,在用作I2C通信时,P1.3为SDA,P1.2为SCL,在程序中应该设置为开漏方式。电路中为I2C总线的上拉电阻,在具体电路中应适当调整。选择上拉电阻要考虑的因素主要为供电电源、总线上的电容 值和连接器件数。在《I2C总线协议》中规定,在供电电压大于2 V,灌电流为3 mA时,输出低电平不高于0.4 V。在本电路中供电电压为(3±0.3) V。,因而上拉电阻的最小值为Ω。上拉电阻的取值不能过大,因为上拉电阻R与总线上的电容值C构成的RC电路的时间常数,影响了总线从高电平到低电平的过渡时间,因而影响了通信速率。在快速模式中,SDA,SCL信号从低到高的过渡时间应该不大于300 ns,P89LPC932端口输出电容为15 pF,因而上拉电阻的最大值为kΩ。在电路中取值为5 kΩ。

由于P89LPC932单片机中带有内部RC振荡源,在电路中省略了一般51单片机所需要的晶振,因而电路比较简单。其硬件电路如图2所示。

4 多MCU系统下的软件设计

I2C总线的通信都是由主机发起的`。具体为主机发送起始条件,然后发送要操作的从机地址和读写命令。在收到从机应答后,进行相应操作。软件设计主要包括主机的寄存器的设置及读写子程序的设计。

4.1 P89LPC932单片机I2C寄存器的设置

LPC932单片机微功耗51内核,内部集成了I2C总线,支持400K高速模式,既可作I2C总线上的主控器件,也可作I2C总线上的从器件。LPC900单片机的I2C总线通过以下6个特殊功能寄存器实现接口:I2CON(I2C控制寄存器?0D8H)、I2DAT(数据寄存器?0DAH)、I2STAT(状态寄存器?0D9H)、I2ADR(地址寄存器?0DBH)、I2SCLH(占空比寄存器高字节?0DDH)、I2SCLLSCL(占空比寄存器低字节?0DCH)。

I2C地址寄存器在处于主模式时,该寄存器的内容无效。I2C状态寄存器是一个8位只读寄存器,它包含了I2C接口的状态代码,最低3位总是为0,I2C一共有26种可能的状态。

4.2 多MCU系统下的程序设计

按照I2C总线的规范,I2C总线数据传送可分为主发送、主接收、从发送、从接收4种方式。在多MCU模式下有主发送、主接收2种方式。每种方式都有典型的传送过程,这些数据传送都是由一些状态码标记的总线状态处理过程组成,因此I2C总线上的一个完整的数据传送是由多个I2C中断状态处理程序来完成的。每出现一个新的状态,就会产生一次I2C中断,然后进入该总线的中断处理程序,处理完毕中断返回再等待一次新的中断及状态处理直至结束。注意以下所说的主机可以是两片MCU中的任一片,而从机指的是I2C器件。

I2C总线的数据操作过程及总线状态处理是在标准软件包的支持下完成,无须用户介入,用户可以通过查询I2C总线的状态寄存器就可了解总线的处理状态,从而做相应的处理。程序设计流程图如图3所示。

I2C通信程序设计要点如下:

(1) 每次通信的起始条件和停止条件均由主机发起,从机只是负责监听主机信号。起始条件和停止条件是通过置位I2CON中的STA和STO位达到的。

(2) 当主机获得总线,成功发送启动条件后,地址和数据的发送是通过写数据寄存器I2DAT达到的。

(3) 每次发送地址和数据后应该查询状态寄存器I2STAT检查数据发送状态以进行下一步动作。

(4) 每次通信完毕后主机和从机均应该释放总线。

程序设计过程中值得注意的是:读写过程中从器件的地址是变化的,写过程中E2PROM的地址是0A0H,读过程中E2PROM的地址是0A1H。

5 结 语

本应用以两片MCU通过I2C总线共享一个存储器,实现了I2C总线多MCU机应用系统的设计,电路设计简单,易于扩展,具有较强的实用性。虽然本文是以MCS51内核单片机LPC932为例实现的,并且系统中仅两片MCU,但实际上任何带有I2C总线接口的多片MCU都可使用该方法。

参考文献

张洪刚,苑秉成,徐瑜,等.基于FPGA和SD卡的水声信号高速采集与存储系统设计.电子器件,,32(1):208?212.

I2C总线存储器的数据复制 篇3

I2C总线存储器是一种采用I2C总线接口进行数据存取的可擦除写入存储器件,广泛应用于音视频设备之中。早期产品如M58655、PCF8581等等,现在大多使用24系列存储器件,如电视机中使用的24C02、24C04、24C08等等,用来存储电视机收看节目使用的制式、语言、工作模式及频道数据等信息。

本文以24C02存储器为例,介绍一下I2C总线存储器的数据传输规范以及采用单片机对I2C总线存储器进行数据复制。

一、电路原理

图1即为数据复制仪的电路原理图。这种电路配合下文程序,可完成两片存储器N1、N2之间数据复制。程序设计以N2为读取方,N1为写入方,完成将存储器N2中的数据复制到N1之中。

电路核心采用单片机电路89S51。一个完整的微机系统必须包括处理器、内存(随机存储器)、ROM(程序存储器)及输入输出接口这几部分。所谓单片机就是将这几部分集成到一块电路中,从而形成一个完整的微机系统,可以独立完成一些较小的程序。现在单片机电路已经很普遍了,遥控电视机中的微处理器就是一种最常见的单片机电路。单片机电路89S51内部集成了128Byte的随机存储器RAM、4KByte的可擦写程序存储器ROM、P0-P3四个双向输入输出端口、一个标准的异步通讯接口,用来与电脑COM口连接,进行异步通讯。89S51并不具有标准的I2C总线通讯接口,这里仅通过软件模拟,实现与标准I2C总线接口存储器的数据通讯。

存储器N2、N1与单片机89S51通过SDA、SCL两线,共同连接在一条I2C总线之上。N1的三位芯片地址线A0、A1、A2全部接地,N2的A0地址线则与正电源相接。这样的连接可以为两片同样型号的存储器设置了不同的芯片地址,这样单片机就能通过芯片地址的不同对同一总线上的两块存储器分别进行读写操作了。存储器N1、N2与电路的连接,采用插座方式。按放、拿取存储器电路时,需要使用开关“SW”将电源切断,保证断电操作。“复制”按键负责控制程序的运行。

连接好电路之后,接通电源,按动“复制”键,程序进入执行,单片机依次读取N2中的数据,并将数据写入到N1中,在这同时还将读写数据送入P0接口,通过P0接口的八只发光管显示出来。数据复制完成后,发光管熄灭。

二、程序设计

24Cxx是标准的低功耗可擦写可编程只读存储器,采用I2C总线进行数据读写,8脚形式的封装,02指可储存2Kbit (256字节)的二进制数据。

24Cxx芯片型号含义如下:

24C系列存储器引脚表见表1。

它的数据读取有三种模式:当前地址读、连续读取、随机读取。数据写入模式有随机写与页写两种。由于24CXX系列存储器随容量大小,硬件有较大差异,这就导致24C02、24C04、24C08等等各种容量的存储器之间的读写规则也有较大差异,这里仅对它们之间较为统一的随机单字节读取、单字节写入模式进行介绍。在这种模式下,可以由外部设备向储存器指定地址存入一个字节的数据或者从存储器特定地址读取一个字节的数据,即完成一次完整的读写操作。单字节随机读写模式下,24C04、24C08等芯片与24C02的读写方式总还有一些微小的差别,可参考芯片的相关资料介绍。

表2、表3分别列出24C02在随机字节读、写方式下数据线(SDA)上传递的数据格式及完整的流程。

在与存储器通讯过程中,微处理器始终作为主机,所有的同步时钟都是由处理器发出。

启动信号由主机在第一个时钟周期发出。当主机访问存储器时, 在时钟线 (SCL) 高电平期间, 主机发出总线启动信号, 使串行数据线 (SDA) 由高电平向低电平跳变。接到启动位后, 挂接在同一条I2C总线上各个存储器进入待命状态, 等待接收主机发出八位寻址数据。

紧随启动位发出的八位设备寻址数据如表4所示,数据发送由最高位b7起,依次发送,每时钟周期发送一位,总长度为八个时钟周期。这八位设备寻址数据由b7、b6、b5、b4四位设备类型识别码、b3、b2、b1三位芯片编程码和一个读写位b0构成。同一电路中所有芯片都可利用I2C总线进行相互间的讯息传递,为了对不同芯片进行区分,I2C总线协议为每种完成特定功能的芯片制定了各自的四位设备识别码,如显示驱动控制芯片的设备识别码为0111,数模、模数转换芯片的设备识别码为1001,而24C系列存储器之类的电可擦写可编程只读存储器电路的识别码统一指定为1010。

b3、b2、b1三位芯片编程码依次与24C02的A2、A1、A0三个引脚对对应,当引脚接+5V电源电压,对应位则为高电平“1”。如果引脚接地,则对应位为低电平“0”。在上述电路中,存储器N1的芯片编程地址为000,而N2的芯片地址则为001。由于有三位可编程地址,所以同一条I2C总线上可以挂接8块同样的24C02芯片,最大提供8×2Kbit=16Kbit的寻址空间。

最后一位读写(R/W) 位用来指示数据传送方向。读写位为“0”低电平时,主机发出数据存入指定存储器地址空间,存储器作为接收方;读写位为“1”高电平时,主机读取存储器指定地址的数据,主机作为接收方。

每次八位数据接收发送完成后,数据接收的一方要发出一位应答信号,作为对数据发送方的回应, 指示通讯成功,以便发送方为下一部作好准备。当主机作为发送方,发送完毕后,要释放数据线,进入待机。此时存储器要作出回应,由被寻址的存储器发出一位低电平信号,将数据线拉低,指示数据传输成功。当主机接收存储器数据时,回应信号则由主机发出。回应信号也由时钟同步,占一位时钟周期。

通讯完成后,在之后的一个时钟周期里,时钟线高电平期间由主机使数据线产生从低电平向高电平的跳变,以此作为停机信号,通知存储器停止数据传送。

在整个通讯过程中,数据线上高低电平的变化均须在时钟信号低电平期间完成,时钟高电平期间数据线电平保持稳定不变。之所以要这样,就是要将时钟高电平期间数据线上电压的变化保留用来指示总线通讯的启动和停止。

如表2、表3所示,进行随机数据读取时,主机进行设备寻址,并发送寻址地址后,需要重新启动,将读写控制位设置变为“1”,以改变数据传送方向,使处理器成为数据接收一方。而数据写入时,存储器始终作为数据接收一方,读写控制位始终为“0”,所以不需重新启动,一次就可完成写入。

依据上述传输规范,可以写出24C02的数据拷贝汇编程序:

I2C设备 篇4

I2C总线是一种简单、双向二线制同步串行总线, 它只需要两根线 (串行时钟线和串行数据线) 即可在连接于总线上的器件之间传送信息。I2C总线接口的电气结构如图1所示, 组成I2C总线的串行数据线SDA和串行时钟线SCL必须经过上拉电阻Rp接到正电源上, 连接到总线上的器件的输出级必须为“开漏"或“开集”的形式, 以便完成“线与”的功能。

I2C总线可以构成多主从数据传送系统, 但只有带CPU的器件可以成为主器件。主器件发送时钟、启动位、数据工作方式, 从器件则接收时钟及数据工作方式。接收或发送根据数据的传送方向决定。I2C总线上数据传送时的启动、结束和有效状态都由SDA、SCL的电平状态决定, 在I2C总线规约中启动和停止条件规定如下:

启动条件:在SCL为高电平时, SDA出现一个下降沿则启动I2C总线。

停止条件:在SCL为高电平时, SDA出现一个上升沿则停止使用I2C总线。

除了启动和停止状态, 在其余状态下, SCL的高电平都对应于SDA的稳定数据状态。

每一个被传送的数据位由SDA线上的高、低电平表示, 对于每一个被传送的数据位都在SCL线上产生一个时钟脉冲。在时钟脉冲为高电平期间, SDA线上的数据必须稳定, 否则被认为是控制信号。SDA只能在时钟脉冲SCL为低电平期间改变。启动条件后总线为“忙”, 在结束信号过后的一定时间总线被认为是“空闲”的。在启动和停止条件之间可转送的数据不受限制, 但每个字节必须为8位。首先传送最高位, 采用串行传送方式, 但在每个字节之后必须跟一个响应位。主器件收发每个字节后产生一个时钟应答脉冲, 在这期间, 发送器必须保证SDA为高, 由接收器将SDA拉低, 称为应答信号 (ACK) 。主器件为接收器时, 在接收了最后一个字节之后不发应答信号, 也称为非应答信号 (NOT ACK) 。当从器件不能再接收另外的字时也会出现这种情况。I2C总线的数据传送格式如图2所示。

I2C总线中每个器件都有唯一确定的地址, 启动条件后主机发送的第一个字节就是被读写的从器件的地址, 其中第8位为方向位, “0” (W) 表示主器件发送, “1” (R) 表示主器件接收。无论是主发、主收还是从发、从收都由主器件控制。在主发送方式下, 由主器件先发出启动信号 (S) , 接着发从器件的7位地址 (SLA) 和表明主器件发送的方向位0 (W) , 即这个字节为SLA+W。寻址的从器件在收到这个字节后, 返回一个应答信号 (A) , 在确定主从握手应答正常后, 主器件向从器件发送字节数据, 从器件每收到一个字节数据后都要返回一个应答信号, 直到全部数据都发送完止。在主接收方式下, 主器件先发出启动信号 (S) , 接着发从器件的7位地址 (SLA) 和表明主器件接收的方向位1 (R) , 即这个字节为SLA+R。在发送完这个字节后, SCL继续输出时钟, 通过SDA接收从器件发来的串行数据。主器件每接收到一个字节后都要发送一个应答信号 (A) 。当全部数据发送或接收完毕后, 主器件应发出停止信号 (P) 。图3、图4所示为主器件发送和接收数据的过程。

1 X1202工作原理

2.1 X1202的引脚功能

X1202是Xicor公司生产的一种具有I2C接口的实时时钟芯片, 使用32768Hz晶振输入, 可以精确地走时, 从秒、分、时到月、日、年, 并提供闰年校正, 能对2000年问题和小于31天的月自动进行调整。它有两个独立的闹钟, 报警可按秒、分、时、日、月及星期几设置。工作电源及备份电池电源都有宽的电压范围。

X1202还提供一个看门狗定时器, 具有3种定时时间可选择。

X1202有两种封装形式, 其引脚排列如图5所示。

(1) 串行时钟SCL。SCL输入端, 用于使所有数据随时钟同步输入或输出。此引脚上的输入缓冲器总是激活的 (不选通) 。

(2) 串行数据SDA。SDA是双向引脚, 用于把数据送入和送出器件。它具有漏极开路的输出, 可以与其它漏极开路或集电极开路输出端进行线“或”。输入缓冲器总是激活的 (不选通) 。

(3) VBACK输入端。接备用电源电压。在VCC电源故障时VBACK供电。

(4) 复位输出undefined。这是一个复位信号输出端。此信号通知主处理器:看门狗时间期限已超过, 或电源电压VCC已低于门限值。它是漏极开路低电平有效输出端。

(5) X1, X2外接晶体端。可在X1端接收外部32.768kHz的方波基准或被配置成片内振荡器。片内振荡器使用32.768kHz石英晶体。推荐使用的晶体是VT-200或EPSON C-002RX。晶体为时钟/振荡器提供时基。使用外部时基时, 内部时钟可由X1端的外部信号驱动, X2悬空。图6为推荐的晶体接法。

2.2 X1202的寄存器

X1202的寄存器分为状态寄存器、实时日历/时钟寄存器、控制寄存器和两组独立闹钟寄存器, 片内地址见表1。

两组闹钟寄存器分别与实时日历/时钟寄存器相对应, 其地址分别为:0000-0007, 0008-000F。

2.3 实时时钟读写

由于X1202具有双端口的时钟和闹钟寄存器, 使得读写操作不影响时钟的精确性。

启动读命令, 并指定对应于实时时钟 (RTC) 寄存器的地址可以读RTC。因为时钟是连续运行且读操作要花费一定的时间, 所以在读操作期间时钟可能有变化。为了避免在读操作期间时钟的变化, 用读命令 (在RTC数据输出之前ACK位时钟的下降沿) 把时间锁入单独的锁存器, 时钟继续运行。在读期间产生的报警不受读操作的影响。

从X1202的RTC寄存器中读出一个字节的过程为:先发出起始信号, 接着发出X1202的地址SLAW (R/W为0) , 再进行RTC寄存器地址的写入操作, 然后发出重复起始信号和X1202地址SLAR (R/W为1) , 开始接收来自RTC寄存器的数据值data, 如图7所示。

此外, X1202还包括现行地址读和序列读功能。

时钟和日期可通过写RTC寄存器来设置。

为了避免不完全的写操作改变当前时间, 在RTC数据输入此前ACK位时钟的下降沿, 当前时间值被装入单独的缓冲器, 时钟继续运行。新的串行输入数据代替缓冲器内的内容。这个新的RTC值由有效写时序末尾的停止位装回到RTC寄存器中。无效的写操作使时间更新过程失败, 缓冲器的内容被丢弃。在有效的写操作之后, RTC将反映新装载的数据, 它从停止位之后第一个一秒时钟周期开始。在RTC寄存器正在进行写的同时, RTC继续更新时间, 在任何非易失性写序列期间RTC继续运行。单个字节可以被写至RTC而不影响其它字节。

向X1202的RTC寄存器中写数据的过程为:先发出起始信号, 接着发出X1202的地址SLAW (R/W为0) , 再进行RTC寄存器地址的写入操作, 然后写入数据值data, 如图8所示。

注意:在进行写RTC寄存器的过程之前, 一定要先向RTC的状态寄存器中先写入02, 再写入06, 否则就不能进行写RTC寄存器的操作。此外, X1202还包括页写入功能, 可一次写入8个数据。

2 X1202的应用

X1202与89C51的接口电路如图9所示

由于51系列单片机没有内部硬件I2C总线接口, 下面采用C51实现模拟I2C总线接口的具体编程方法。

部分程序清单如下:

参考文献

[1]Philips Semiconductors.The I2C Bus Concept and Specification.1992.

I2C设备 篇5

一、I2C总线协议简介

利用I2C总线进行数据通信, SCL和SDA均通过上拉电阻接电源。当SCL和SDA都为高电平时, 总线为空闲状态;当SCL为高电平, SDA电平由高变低时, 数据传送开始;数据传送过程中, 当SCL为高电平时, SDA必须保持稳定, 当SCL为低电平时, SDA状态允许改变;当SCL为高电平时, SDA电平由低变高时, 数据传送结束。开始信号和结束信号都由主器件产生。I2C总线在标准工作方式下数据传送速率可达100Kbps, 在快速工作方式下速率可达400Kbps。

I2C总线上所有外围器件都有规范的器件地址, 该地址由7位组成, 该地址和1位方向位构成了I2C总线器件的寻址字节, 寻址字节格式见表1。

表1中DA3、DA2、DA1、DA0为器件地址, A2、A1、A0为引脚地址, 为方向位, 为0则主器件发送数据, 为1则主器件接收数据。

主器件发出开始信号后, 首先发送寻址字节, 然后等待响应以指示从器件被寻址。接下来主器件发送将要被操作的从器件的单元地址, 再次等待响应。响应完成后发送器件发送数据字节, 每个字节从高位到低位依次传送, 每次传送的数据字节数不限, 但每个字节传送完毕后必须等待接收器件发出的一个响应位。在响应的时钟脉冲期间发送器件释放SDA, 接收器件必须将SDA拉低, 使SDA在响应的时钟脉冲为高电平期间保持稳定的低电平[1], 否则表示接收器件未响应。若干个字节的数据可按以上方式传送, 直到主器件发出结束信号。

二、51单片机I2C总线接口的实现

若单片机自带I2C总线接口, 则将I2C器件连接到单片机该总线接口上即可;若单片机无I2C总线接口, 则可以采用I2C总线/并行转换装置实现单片机与I2C器件的通信, 也可以使用单片机的I/O口软件模拟I2C总线[2]。使用51单片机I/O口软件模拟I2C总线时, 硬件连接只需两条I/O口线即可, 在软件中分别定义成SCL和SDA。例如将51单片机的P1.0引脚作为SCL, P1.1引脚作为SDA, 根据I2C总线协议要求, 通过汇编语言或C语言编写的程序即可模拟I2C总线传送数据。

三、51单片机I2C总线接口仿真研究

下面以AT89C51与24C01的接口为例, 阐述51单片机I2C总线接口的仿真研究方法。24C01是容量为128B的E2PROM。本例要求实现以下功能:将常数01H至06H通过I2C总线写入24C01的30H至35H单元, 然后将24C01的30H至35H单元中的数据通过I2C总线读入AT89C51片内40H至45H单元。在Proteus中绘制的电路原理图如图1所示。图1中添加了I2C调试器和图表以方便调试分析。本例利用AT89C51的I/O口软件模拟I2C总线接口。

本例采用汇编语言编写源程序, 通过主程序初始化后调用开始子程序START、停止子程序STOP、发送响应信号子程序MACK、发送非响应信号子程序MNACK、检查响应信号子程序CACK、写字节子程序WRBYTE、读字节子程序RDBYTE等子程序实现AT89C51软件模拟I2C总线接口与24C01实现数据通信[3]。利用Keil将编写的源程序生成HEX文件后可添加到AT89C51中, 实现Proteus与Keil的联机调试[4]。调试过程中可在I2C Memory Internal Memory窗口和8051CPU Internal (IDATA) Memory窗口中查看24C01和AT89C51片内RAM存储单元中数据的变化, 如图2所示。

可利用I2C调试器观察AT89C51与24C01进行I2C总线通信的过程[5]。例如I2C调试器窗口中第二行数据“S A0 A 30A Sr A1 A 01 A 02 A 03 A 04 A 05 A 06 A N P”中, “S”表示开始;“A0”表示寻址字节, “A0”转换为二进制形式即为“10100000”, 其中“1010”为24C01的器件地址, “000”为24C01的引脚地址, 最低位的“0”表示AT89C51将要对24C01进行写操作;“A”表示响应;“30”表示将要被操作的24C01的单元地址;“Sr”表示重新开始;“A1”表示寻址字节, “A1”转换为二进制形式即为“10100001”, 其中“1010”为24C01的器件地址, “000”为24C01的引脚地址, 最低位的“1”表示AT89C51将要对24C01进行读操作;“01 A 02 A 03 A 04 A 05 A 06 A”表示六个被传送的字节数据, 每个字节数据传送完毕都要有一个响应位;“N”表示未响应;“P”表示停止。

在图表中添加仿真电路中SCL探针和SDA探针测得的信号图线, 程序运行结束后可生成I2C总线通信的时序, 如图3和图4所示。图3为AT89C51写24C01时序, 与I2C调试器窗口中第一行数据“S A0A 30 A 01 A 02 A 03 A 04 A 05 A 06 A N P”对应。图4为AT89C51读24C01时序, 与I2C调试器窗口中第二行数据“S A0 A 30 A Sr A1 A 01 A 02 A 03 A 04 A 05 A 06 A N P”对应。在DIGITAL ANALYSIS-PROSPICE窗口中可以使用左移、右移、放大、缩小等功能按钮查看每一时刻的波形, 利于分析理解I2C协议。例如在图3中的537us左右, SCL为高电平, SDA出现下降沿, 即数据传送开始。又如在图4中的2.478458s左右, SCL为高电平, SDA出现上升沿, 即数据传送结束。寻址字节、引脚地址、重新开始、传送的数据和响应信号都可以在时序图上直观的体现。另外, 可以将仿真得到的时序导出形成图片以便保存。

程序调试过程中若数据通信不正常, 程序运行过程中可查看I2C调试器窗口中的数据, 程序运行结束后可查看利用图表生成的DIGITAL ANALYSIS-PROSPICE窗口中的时序图, 以利于查找程序中的错误, 方便程序的调试。程序调试成功后, I2C Memory Internal Memory窗口和8051CPU Internal (IDATA) Memory窗口相应的存储单元中出现要求存放的数据。

四、结束语

根据I2C总线协议, 利用51单片机I/O口软件模拟可实现I2C总线接口, 该接口可通过Proteus与Keil联机仿真调试。利用Proteus软件自带的I2C调试器和图表功能, 可以更加直观的分析研究I2C总线的工作过程, 利于降低研究成本, 提高开发效率。

摘要:在介绍I2C总线协议的基础上, 以AT89C51与24C01的接口为例, 阐述了在Proteus环境中, 利用I2C调试器和图表进行51单片机I2C总线接口仿真研究的方法。

关键词:51单片机,I2C总线,Proteus

参考文献

[1]邹显圣.单片机原理与应用项目式教程[M].机械工业出版社, 2010

[2]凌六一, 伍龙.基于软件模拟的51单片机IIC总线的实现[J].电子技术, 200 (45) :13-16

[3]朱蓉.单片机技术与应用[M].机械工业出版社, 2011

[4]刘文光, 张铭铭.Proteus仿真在单片机课程项目式教学中的应用[J].信息技术与信息化, 201 (22) :3133

I2C设备 篇6

I2C总线是由NXP半导体(原Phlips半导体)在20多年前开发的一种简单的双向二线制串行通信总线。它具有总线协议简单、支持器件多、可裁减性好、通信速率高等优点。目前已成为业界嵌入式应用的标准解决方案,被广泛地应用在各种基于微控制器的专业、消费与电信产品中,作为控制、诊断与电源管理总线。

I2C总线的信号线包括串行数据线SDA和串行时钟线SCL,它们一起来完成全双工数据传送。原则上说,只要符合I2C总线标准的器件都可以通过同一条I2C总线进行通信,而不需要额外的地址译码器。在具体应用过程中,当前端处理器提供了I2C总线接口时,SCL、SDA信号线可以直接与外围芯片相应引脚相连。如果前端处理器不具备I2C总线接口时,有两种解决方法:①采用专用的I2C串行总线控制器;②利用软件模拟实现I2C总线接口功能。本文要做的就是利用Verilog HDL语言设计同步有限状态机在FPGA上实现I2C总线接口功能,并进行功能和时序仿真。

1 总线的工作原理

I2C总线在传送数据的过程中共有三种类型信号,它们分别是:启动信号、结束信号和应答信号。

启动信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,则判断为受控单元出现故障。

图1显示了I2C总线上一次数据传输的工作时序,在A段,SDA和SCL均为高电平,总线处于非忙状态;在B段,SCL为高电平时SDA产生下降沿,出现“启动”信号,数据传输开始;在C段,SCL为高时SDA产生上升沿,出现“停止”信号,数据传输停止;在D段,当SCL为高电平时,SDA所处状态就是要传送的数据,而SDA上数据的改变必须在SCL为低电平时完成。

2 I2C总线模块的设计与实现

2.1 接口模块的结构

图2为I2C总线接口框图,主要包括以下几个单元。

I2CXSR:发送移位寄存器,将地址信息或数据信息经过并/串转换后,在时序控制逻辑的控制下发送到SDA线上。

I2CRSR:接收移位寄存器,将SDA线上接收的数据经过串/并转换后存入数据寄存器,再由主机来读取。

I2CDXR:数据发送寄存器,存储I2C总线接口要发送的数据。

I2CDRR:数据接收寄存器,存储I2C总线接口已接收的数据。

总线仲裁和时钟同步:多个主设备开始一个数据发送时,由仲裁机制来决定到底谁掌握总线控制权,这就要求进行时钟同步,可利用SCL线与的特性来完成。

分频器:由于FPGA外部时钟频率很高,需要经过分频来满足I2C总线接口协议规定的数据传输速率。

控制/状态寄存器组:传输所有时序控制逻辑都由它来产生,是整个I2C总线接口的核心。

本文接下来将设计一个对接口存储器进行读写的模块。

2.2 电路模型的搭建

为了实现对I2C接口存储器的读写,不仅要设计接口模块,还要搭建存储器的行为模型以及激励模块,本文选定二线制I2C串行EEPROM AT24C02作为存储器来构建行为模型,图3是在QUARTUSII 7.1环境下生成的三个模块的结构图。

其中SIGNAL为信号源模块,能产生读/写、并行地址和并行数据信号,并可以接收EEPROM读写器件的应答信号(ACK),并以此来调节发送或接收数据的速度;EEPROMWR为EEPROM读写器模型,它接收来自信号源模型产生的读/写、并行地址和并行数据信号,并把它们转换为相应的串行信号发送到EEPROM的行为模型中。它还可以发送应答信号(ACK)到信号源模型,以便让信号源调节发送或接收数据的速度;EEPROM为EEPROM的一个简化行为模型,能完成一个字节数据的读写。

在上面的三个模块中,EEPROM读写器模块可以综合,信号源模块和EEPROM模块只用于仿真验证,不可综合成电路网表。

2.3 用FSM设计I2C总线接口

根据I2C总线传输协议可知,I2C在传输过程中存在着几个固定的状态,对EEPROM读写来说,用5个状态时钟可以完成写操作,7个状态时钟可以完成读操作。而读写操作中有几个状态是一致的,因此用一个嵌套的同步有限状态机FSM来设计I2C总线接口。整个状态机共有7个状态:空闲(Idle)、准备(Ready)、启动(Start)、写(Write)、读(Read)、停止(Stop)、应答(Ack),状态转移如图4所示:

Idle:I2C总线处于空闲状态。

Ready:当从器件发出读/写信号(WR=1/RD=1)时,读写标志WF/RF置1 ,转入准备状态。

Start:当标志寄存器FF=1时,发送启动信号。

Write:向从器件发送写控制字和地址信号,若WRbit=1,则逐个写入数据并接收应答位,直到所有数据写完Stopbit=1时,转入Stop状态启动停止信号;若WRbit=0,则转入Read状态。

Read:重新启动I2C总线,发送读控制字。当WRbit=0时,则向从器件逐个读出数据并发送非应答位;直到所有数据读完Stopcit=1时,转入Stop状态启动停止信号。

Stop:发送停止信号。

Ack:从器件发出应答信号,FF置0, 转入应答状态。

该状态机采用FPGA器件常用的独热(one-hot)编码来完成状态分配,可以有效提高电路的速度和可靠性,也有利于提高器件资源的利用率。

3 仿真验证

用Verilog HDL语言编写好状态机实现代码和测试程序TestBech后,本文采用目前业界最流行的仿真工具ModelSim SE 6.3a来对I2C总线接口时序进行仿真,结果如图5所示。

图5是I2C总线写时序的仿真波形。从波形图中可以看到,在WR产生高电平信号后,当SDA在SCL高电平期间产生由高电平到低电平的跳变时,EEPROM读写控制器发出“启动”信号,I2C总线开始数据传输,先送出I2C总线器件特征编码1010和三位EEPROM芯片地址/页地址XXX,并加上写状态R/W位(=0)构成一个控制字节,然后EEPROM产生一个应答位,接着读写控制器发送一个字节的EEPROM存储单元地址,EEPROM接收到这个地址后,又一次产生应答信号,使读写控制器发送要写入的一个字节数据到EEPROM存储单元。传送完毕后,EEPROM再次产生一个应答信号,读写控制器收到后,当SDA在SCL高电平时产生由低电平到高电平的跳变时,EEPROM读写控制器发出“停止”信号,数据传输停止,并等待写入下一个字节数据。

图6是I2C总线读时序仿真波形,同样也是在ModelSim SE 6.3a环境下的仿真结果。

由图6可知,在RD产生高电平信号后,当SDA在SCL高电平期间产生从高电平到低电平的跳变时,同样开始启动I2C总线,EEPROM读写控制器发送一个“启动”信号和控制字节(其中R/W=0)到EEPROM,EEPROM产生应答后,读写器通过写操作设置EEPROM存储单元地址(写入的是地址指针),之后EEPROM又产生一个应答信号,接着读写器重新发送另一个“启动”信号和控制字节(此时R/W=1),EEPROM收到后发出应答信号,然后,要寻址存储单元的数据就从SDA线上输出,EEPROM再次产生应答,然后当SDA在SCL高电平时产生由低电平到高电平的跳变时,EEPROM读写控制器发出“停止”信号,数据传输停止,并等待写入下一个字节数据。

4 结束语

从上面对读写时序波形的分析可以看出,利用有限状态机设计的I2C总线接口模块EEPROMWR在功能上完全满足I2C总线协议,而它的Verilog HDL代码也是可综合的,在布局布线后笔者在对其进行了后仿真,波形除SCL和SDA与CLK有些延迟外,信号的逻辑关系也与前仿真完全一致,这就表明可以将生成的配置文件加载到芯片中进行测试,并完成特定功能,这也体现了FPGA器件的特点。

参考文献

[1]何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社,1995.

[2]董春霞,安连祥,张胜利,等.I2C总线技术及其在智能仪表中的应用[J].中国仪器仪表,2003(4):102-105.

[3]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2003.

上一篇:格兰杰原因下一篇:防水技术措施论文