I2接口

2024-07-17

I2接口(通用5篇)

I2接口 篇1

I2C总线是Philips公司开发的双向两线制同步串行总线, 它只需两根线即数据线SDA和时钟线SCL, 即可使连接于总线上的器件之间实现数据传送, 它对器件进行软件寻址而非硬件片选寻址, 对51单片机系统来讲可节省单片机I/O口资源。I2C总线提供了一种高效、实用、可靠的串行总线体系结构, 应用领域广泛, E2PROM、ADC/DAC、LCD、时钟芯片、数字电位器等器件都有I2C总线产品。

一、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

[5]刘小燕.Proteus软件的I2C调试器在单片机设计性实验中的应用[J].赣南师范学院学报, 2009 (3) :105-108

I2接口 篇2

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.

I2接口 篇3

关键词:I2C总线,写模式,ADuC702x

0前言

目前世界上采用的I2C总线有两种规范, 它们分别是由荷兰飞利浦公司和日本索尼公司提出的。现在广泛采用的是飞利浦公司的I2C总线技术规范, 它已成为被电子行业认可的总线标准。由于I2C总线具有标准的规范及众多带I2C接口的外围器件, 使得使用I2C总线设计计算机系统变得十分方便、灵活, 体积也小, 因此在各类实际应用中得到广泛使用。

1 I2C总线结构与数据传送

1.1 I2C总线结构

I2C总线由串行数据 (SDA) 线和串行时钟 (SCL) 线组成, 采用线与 (line and) 的结构。通过这两条线实现总线上的任意两个器件之间的数据传递, 这两个器件一个叫做主机 (Master) , 一个叫做从机 (Slave) , 每一次完整的数据传递的时间段内, 只能有一个固定主机和一个固定从机。在I2C总线上, SCL始终是由主机发起, SDA的数据流向决定了主机/从机是处于发送器状态还是接收器状态。

SDA、SCL都是双向的, 输出电路用于向总线上发送数据, 输入电路用于接收总线上的数据。当总线空闲时, 两根线都是高电平。I2C总线可工作在标准模式 (Standard-mode) , 快速模式 (Fast-mode) 和高速模式 (High-Speed) 。标准模式的最大速率为100kbps, 快速模式的最大速率为400kbps, 高速模式的最大速率为1.7Mbps (Cb=400pF) 、3.4Mbps (Cb=100pF) 。原先的标准模式使用7bit地址, 最大从设备的数量仅为112。由于从设备数量的增加, I2C总线引入了10bit的地址长度。

快速模式下, 从设备增加了很多有用的特性:最大数据速率增加到400kbps, 允许系统使用4倍于标准模式的速率收发数据。快速模式下, I2C总线不再支持速率不兼容的类似总线。为抑制毛刺, 快速设备的输入要求采用施密特触发器结构;另外还要求从设备的电源掉电时SCL和SDA为高阻状态。

高速模式数据速率是标准模式的36倍。I2C总线工作在高速模式时, 最主要的影响是SCL线上电平由低到高的瞬态响应;因为标准和快速模式下的总线上拉电阻不能产生更快的上升时间。其它的变换包括高速模式下的兼容性需求, 如标准和快速模式下主设备是8位的代码。如果Not-Acknowledge (I2C帧结构中的一bit位称呼) 在主设备代码运行之后能够迅速变为高电平, 那么在停止位出现之前所有的通信都可以工作在高速模式。

1.2 I2C总线数据传送方式

I2C总线数据传输时必须遵循规定的数据传送格式, 如图1所示为一次完整的数据传送格式。启动信号表明一次传送的开始, 其后为寻址字节, 该寻址字节由高7位地址和最低1位方向位组成:方向位为“0”表明写操作, “1”表明读操作;在寻址字节后是由方向位指定读、写操作的数据字节与应答位;在数据传送完成后为停止信号。在“启动”与“停止”之间传送的数据字节数从理论上来说没有限制, 但每个字节必须为8位, 而且每个传送的字节后面必须跟一个应答位。

当SCL为高电平时, SDA由高电平跳变为低电平, 定义为启动信号;当SCL为低电平时, SDA由低电平跳变为高电平, 定义为停止信号。

在SCL为高电平时, SDA上数据需保持稳定方被认为有效;只有在SCL为低电平时, 才允许SDA电平状态变化。

在I2C总线上传送信息时的时钟同步信号是由挂接在SCL线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将影响到这些器件, 一旦某个器件的时钟信号下跳为低电平, 将使SCL线一直保持低电平, 使SCL线上的所有器件开始低电平期。如图2所示, 此时, 低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态, 于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时, 低电平期结束, SCL线被释放返回高电平, 即所有的器件都同时开始它们的高电平期。其后, 第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见, 时钟低电平时间由时钟低电平期最长的器件确定, 而时钟高电平时间由时钟高电平期最短的器件确定。

2 I2C总线仲裁与写操作

2.1 总线仲裁

主机只能在总线空闲时启动 (也就是在STOP发生之后, START发生之前) 传输, 两个或多个主机可能在起始条件的最小持续时间 (THD;STA) 内产生一个起始条件, 结果在总线上产生一个规定的起始条件。

当SCL线是高电平时 (可能发生在数据传送过程中) , 仲裁在SDA线发生, 这样在其他主机发送低电平时, 正在发送高电平的主机将断开它的数据输出级, 因为总线上的电平与它自己的电平不相同。把这点结合上面2.4.1的理解, 就可以认为在传输过程中的SDA变化将引起一个RESTART信号产生, 正在传送数据的主机应该停止发送, 而其他从机应该认为总线上产生了一个正常的START信号。

2.2 写操作

2.2.1 连续写

连续写操作是从指定地址开始, 连续写入N个字节数据到从机。整个连续操作是个完整过程, 不能在中间插入其他的操作 (比如读操作) 。每一次完整的写操作结束后, 主机会产生唯一的STOP信号, 释放总线回到初始状态, 之后可以主机继续进行其他操作。一次完整的连续写操作只包含一次主机设置I2C操作地址的过程和N次主机连续发送数据的过程。时序图见图3。

连续写操作过程如下: (1) 主机发起START信号, 发送写I2C设备地址命令, 接收到正确应答ACK; (2) 主机发送操作地址数据 (范围是0-0xFF) , 接收正确应答ACK; (3) 主机连续向从机发送数据项, 每发送一个字节, 主机都要求得到从机的正确应答信号 (ACK) ; (4) 主机产生STOP信号释放总线, 并等待一个擦写时间。

2.2.2 随机写

随机写操作是指对任意地址的写操作, 每一次的写操作都是一个独立的、完整的操作。之所以叫做随机写, 是因为该操作只针对某一个特定的地址, 不与它前后的操作发生影响。每次随机写操作结束, 主机都产生一个STOP信号, 使总线回到空闲, 之后主机可以继续进行其他操作。如果要用随机写操作写入多个字节数据到从机, 则需要连续调用随机写的函数, 相邻的两次操作中, I2C操作地址可以是连续的, 也可以是不连续的。

随机写操作是个独立完整的操作, 过程如下: (1) 主机发起START信号, 发送写I2C设备地址命令, 接收到正确应答ACK; (2) 主机发送操作地址数据 (范围是0-0xFF) , 接收正确应答ACK; (3) 主机向从机发送一个8位的数据项, 从机产生ACK应答, 并把该数据写到第2步接收到的I2C操作地址中; (4) 主机产生STOP信号, 释放对总线的控制。

3 基于AduC702x的I2C接口设计

ADuC702x系列MCU支持2个I2C接口, 这两个接口设计相同, 我们在这里采用I2CX来标志。这两个I2C接口都支持主机和从机工作模式。管脚SDA和SCL采用线与方式连接, 允许在多器件的仲裁竞争。

I2CX总线的器件地址可以由用户自己编程配置, 在不进行数据传输的时候, 可以随时 (动态) 更改ID号。用户最多可以同时设置4个从器件地址。

3.1 从接收模式及其中断响应描述

I2C从设备把接收到的数据 (8bit) 写入接收缓冲 (FIFO) , 在第9个时钟产生之后触发I2C中断, 程序在中断服务程序中读出FIFO中的数据, 同时清空FIFO, 准备接收下一个数据。如果在第3个字节数据到来之前, FIFO中的数据还没有被读出, 接口会自动产生一个NACK信号, 并设置接收缓冲溢出标志[I2C0SSTA:4], 工作模式见图4。

当从接收器接收到数据后会设置从接收中断请求标志[I2C0SSTA:3], 通过问I2C0SRX可以读取FIFO中的数据, 同时清除从接收中断请求标志, 值得注意的是, 刷新FIFO的操作不能清除该标志位。

主控方在发送完最后一个字节数据后, 会自动产生一个STOP信号, 结束数据传输。

3.2 从发送模式及其响应描述

设备在每次数据发送请求时会产生一个中断请求。在应答读请求命令ACK之后, 会产生第一个中断请求, 在这个中断FIFO缓冲中的BYTE0会被发送。数据需要预先放入从发送FIFO缓冲区, 否则第一个从主机发出的读数据请求会产生一个NACK, 如果FIFO预先被写入两字节数据, 会在设备地址ACK响应之后和每个字节发送ACK响应之后各产生一个中断 (3个中断) 。如果FIFO只被写入一个字节数据, 就只会在设备地址ACK响应和发送数据ACK响应之后产生中断 (2个中断) , FIFO在发送完第一个字节后被清空。

如果一个字节发送出去之后, 主机继续要求读后续数据 (ACK) , 从设备就会继续产生一个中断请求。如果设备不需要继续读数据, 则应答NACK, 从设备收到STOP信号后, 进入中断处理。

设备每向主机发送一个字节数据, 都会把发送中断请求标志置‘1’, 该标志会在下次向TX FIFO中写数据时候被自动清零。

参考文献

[1]阮园, 李静.I2C总线接口逻辑分析[J].电子与封装, 2008 (8) .

[2]佚名.I2C总线的验证与实现[EB/OL].http://www.elecfans.com/ar-ticle/84/119/2009/2009042353105.html.

I2接口 篇4

随着电子技术的不断发展和进步, 集成电路向着高速度、高集成度和低功耗的系统集成方向发展。系统设计规模不断趋于小型化和快速化。以SOPC为嵌入式系统核心, 集软硬件为一体, 并追求产品系统最大包容的集成, 是电子领域IP设计的必然趋势和最终目标。采用SOPC技术来设计牛乳检测仪, 在单片FPGA上集成多个控制IP软核, 能极大地减小系统硬件规模, 且编程配置灵活, 开发周期短, 能够满足数据处理的实时性[1]。

在牛乳检测系统中, 系统检测精度是系统的关键性能指标。仪器采用激光散透比法来检测牛乳中蛋白质和脂肪含量。采用两支光电池采集激光经过比色皿后的透射光和散射光。经过放大电路将放大的电压值送往AD转换器, 进行数据处理。为提高系统检测精度, 必须要设计高精度的模拟量数据采集系统。本文采用两片I2C总线接口的ADS1110作为系统AD转换器件。通过在FPGA上构建I2C的控制器IP核, 再将其挂到AVALON总线上, 方便在Nios IDE中进行数据处理。

1 系统硬件组成

I2C 接口是一个2线漏极开路输出接口, 支持多个器件和主机共用一条总线。整个系统利用I2C总线的多主机特性, 将两路ADS1110挂接到I2C总线控制器上。I2C控制器负责与ADS1110进行通信, 同时采集透射光强和散射光强转换后的电压值。上拉电阻对SDA和SCL线都是必要的, 因为I2C总线驱动器是漏极开路驱动器, 这些电阻的大小取决于总线的工作速度和总线电容。系统硬件图如图1所示。系统采用1kΩ的上拉电阻接正电源, 使I2C总线在空闲期间保持高电平。

2 ADS1110简介

ADS1110是精密的连续自校准模/数A/D转换器, 带有差分输入和高达16位的分辨率。片内2.048V的基准电压, 提供范围为2.048V的输入差分电压。ADS1110使用可兼容的I2C串行接口, 在2.7V至5.5V的单电源下工作。ADS1110可每秒采样15、30、60或240次以进行转换。片内可编程的增益放大器PGA提供高达8倍的增益, 并且允许以高分辨率对较小的信号进行测量。

2.1 ADS1110的读操作

用户可从ADS1110中读出输出寄存器和配置寄存器的内容。为做到这一点要对ADS1110寻址, 并从器件中读出三个字节。前面的两个字节是输出寄存器的内容, 第三个字节是配置寄存器的内容。不要求一定要读出配置寄存器字节, 在读操作中允许读出的字节个数少于三个。从ADS1110中读取多于三个字节的值是无效的。从第四个字节开始的所有字节将为FFH。ADS1110的读时序如图2所示。

2.2 ADS1110的写操作

为了对配置寄存器进行写操作, 要对ADS1110寻址, 并写入一个字节。这个字节被写入配置寄存器中。注意输出寄存器不能被写入。对ADS1110写入多个字节无效。ADS1110将忽略第一个字节以后的任何输入字节, 并且它只对第一个字节作出应答。对ADS1110写操作的时序如图3所示[2]:

3 I2C控制器IP核设计

一条I2C总线由两条线路组成:SDA线和SCL线。SDA传送数据, SCL提供时钟。I2C总线是双向的, SDA线可用来发送和接收数据。当主机从从机中读取数据时, 从机驱动数据线;当主机向从机发送数据时, 主机驱动数据线。主机总是驱动时钟线, ADS1110 绝不会驱动SCL, 因为它不能用作主机。在ADS1110 中SCL 只是一个输入端。每个连接到总线的器件都有一个唯一的地址。ADS1110的I2C地址是1001aaa, 其中aaa是出厂时的默认设置。ADS1110有8种不同的类型, 每种类型都有一个不同的I2C地址。例如ADS1110A0的地址为1001000, 而ADS1110A3的地址则为1001011。

主机可以作为主机发送器或主机接收器。如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。串行的8位双向数据传输位速率在标准模式下可达100kbit/s, 快速模式下可达400kbit/s, 高速模式下可达3.4Mbit/s。连接到相同总线的IC数量只受到总线的最大电容400pF限制[3]。

ADS1110通过一个I2C (内部集成) 电路接口通信。所有数据以8位为一组通过I2C总线传送。为了在I2C总线上传送1位数据, 须在SCL为低电平时驱动SDA线至适当的电平 (SDA为低则表明该位为0, 为高则表明该位为1) 。一旦SDA线稳定下来, SCL线被拉高, 然后变低。SCL线上的脉冲以时钟将SDA位一位一位地移入接收器的移位寄存器中。

I2C总线的读写控制逻辑:

(1) 开始条件

在开始条件下, 当SCL为高电平时, SDA由高转为低。

(2) 停止条件

在停止条件下, 当SCL为高电平时, SDA由低转为高。

(3) 确认信号

在接收方应答下, 每收到一个字节后便将SDA电平拉低。

(4) 数据传送

I2C总线启动或应答后SCL高电平期间数据串行传送;低电平期间为数据准备, 并允许SDA线上数据电平变换。总线以字节 (8bit) 为单位传送数据, 且高有效位 (MSB) 在前。

采用Verilog HDL硬件描述语言来编写I2C控制器IP核, 图4为I2C控制器在Quartus II下的BSF图。

图中addr为I2C模块给NiosII处理器的地址信号, 用于选择数据寄存器或状态寄存器;rst-l为异步复位信号, 低电平有效;clock为时钟信号;rd-wr-l为读写脉冲信号, 低电平时读, 高电平时写;cs-l为片选信号, 低电平有效;reg-clk-in用于锁存字地址信号。data为双向数据寄存器, 用于保存接受和发送的字节数据, 与AVALON总线同名信号相连;ack-l是I2C从设备给主机的应答信号;reg-clk-out产生锁存字地址信号;scl-pin为I2C时钟引脚;sda-pin为I2C数据引脚。片选信号假定与时钟信号同步;地址, 数据和读写信号只有在片选信号有效的情况下才能设为有效。

4 I2C控制器仿真

在ModelSim环境下, 编写测试程序对所设计的I2C控制器IP核进行功能仿真, 仿真图如图5所示。

所选FPGA的系统时钟为50MHz, 采用I2C-CLK计数模块来产生scl时钟, scl频率为10μs。当addr=01时, 指向数据寄存器, 这时的数据寄存器保存的是数据线的信息, 由时序控制模块data寄存器传递。当addr=10或11时, 指向状态寄存器, 输出的是I2C总线器件的信息, 包括总线准备好信号、错误信号和总线响应信号。当addr=00, 指向控制器的字地址寄存器, 这时触发状态机的启动信号, 在使能端, 或命令信号无效的时候, 或复位有效的时候, 总线处于空闲状态, 数据线SDA和时钟线SCL都处于高电平。否则, 在SCL高电平期间, SDA从高向低转换, 表示I2C总线开始, 先传送器件地址1001000, 紧接着在SCL高电平期间器件发出一个低电平响应位, 再继续传输数据。当写完一个字节数据后, 在SCL高电平期间, SDA从低向高跳变, 即发出停止信号。仿真结果表明时序合理, 逻辑正确。

5 结束语

采用FPGA来进行系统设计灵活, 方便, 易修改, 可反复编程。由于I2C总线与并行扩展总线相比具有电路结构简单、程序编写方便, 易于实现系统软硬件的模块比、标准化等特点。在FPGA开发中应用IC总线来控制两片ADS1110进行数据采集, 可以减少器件片选线的连接, 还可以对单个ADS1110工作状况进行检测, 从而实现对硬件系统简单灵活的扩展与控制。以上的设计, 经实际应用测试, 具有较好的性能。在牛乳检测仪中, Nios II处理器可以不间断无数据丢失地进行数据采集。达到了检测系统要求的检测精度。

参考文献

[1]吴继华, 王诚.Altera FPGA/CPLD设计 (高级篇) [M].人民邮电出版社, 2005.

[2]ADS1110数据手册[Z].2003.

I2接口 篇5

1.1 I2C总线构成

I2C是Inter-Integrated Circuit的缩写, 开发之前的初始目的是为了保证电路板上IC之间的通信, 它是由Philips在1980年开发的双向两线式串联汇流排, 因此具有I2C的元件只要有两根线就能够实现相互资料互传, 这种结构比平行结构的安全性和可靠性更好, 而且可以节省成本。

在I2C两根线中, 一根用于产生时钟脉冲, 名为SCL, 另外一根用于资料传输, 名为SDA, 每个I2C器件都有一个唯一的地址, 而且可以是单接收的器件 (例如:LCD驱动器) 或者可以接收也可以发送的器件 (例如:存储器) 。发送器或接收器可以在主模式或从模式下操作, 这取决于芯片是否必须启动数据的传输还是仅仅被寻址。I2C是一个多主总线, 即它可以由多个连接的器件控制。早期的I2C总线数据传输速率最高为100Kbits/s, 采用7位寻址。但是由于数据传输速率和应用功能的迅速增加, I2C总线也增强为快速模式 (400Kbits/s) 和10位寻址以满足更高速度和更大寻址空间的需求。

1.2 I2C总线上数据传输的过程

I2C总线是一个多主机的总线, 这就是说可以连接多于一个能控制总线的器件到总线。由于主机通常是微控制器, 让我们考虑以下数据在两个连接到I2C总线的微控制器之间传输的情况。这突出了I2C总线的主机--从机和接收器———发送器的关系。应当注意的是这些关系不是持久的, 是由当时数据传输的方向决定。

1.3 I2C总线仲裁

当连接一个以上的微控制器到I2C总线时, 可能会存在超过一个主机可以同时尝试初始化传输数据。为了避免由此产生混乱, I2C总线提出一个仲裁过程, 在实际工作中它依靠线与总线接口到I2C总线。在这种工作环境下, 如果两个或多个主机同时发送信息到总线, 在其他主机都产生信号“0”的情况下, 首先产生一个“1”的主机将丢失仲裁。仲裁时的时钟信号是用线与连接到SCL线的主机产生的时钟的同步结合。

在I2C总线上产生时钟信号通常是主机器件的责任, 当在总线上传输数据时每个主机产生自己的时钟信号。主机发出的总线时钟信号只有在以下的情况才能被改变:慢速的从机器件控制时钟线并延长时钟信号, 或者在发生仲裁时被另一个主机改变。

1.4 I2C总线电平兼容

I2C总线器件的电气规范和连接到它们的总线线路特性如下:它有1.5V和3V固定输入电平, I2C总线器件每个都有它们自己相应的电源电压上拉电阻, 此电阻必须连接到一个5V+-10%的电源。输入电平连接到VDD的I2C总线器件必须有1条公共的电源线连接到上拉电阻。当有固定输入电平的器件与输入电平连接到VDD的器件混合使用时, 后者必须连接到1条公共的5V+-10%电源线, 而且必须连接上拉电阻到SDA和SCL管脚。

通过使用双向电平转换器, 可以将电源电压和逻辑电平不同的两部分I2C总线连接起来。“低电压”部分有上拉电阻, 而且器件连接到3.3V的电源电压;"高电平"部分有上拉电阻, 器件连接到5V电源电压。两部分的器件都有与逻辑输入电平相关的电源电压和开漏输出配置的I/O。

每条总线线路的电平转换器是相同的, 而且由一个分立的N通道增强型MOS-FET管、串行数据线SDA的TR1和串行时钟线SCL的TR2组成。门极g要连接到最电源电压VDD1, 源极s连接到“低电压”部分的总线线路, 而漏极d则连接到“高电压”部分的总线线路。

2 ARM7TDMI简介

ARM7TDMI-S是目前比较低端的ARM核-ARM核, 它与其它部件如RAM、ROM、片内外设组合在一起才构成实际的芯片。ARM7是用于对成本和功耗都非常敏感的消费应用的低价位、低功耗的32位核。ARM7内核则只有一个存储器接口, 取指令或数据访问都得经由此接口。

ARM的编译器实现了代码调度优化, 可以减少互锁周期的数目。虽然不是百分之百, 但经常有可能找到一条有用的指令, 把它移到LDR和与之有依赖关系的指令之间。这意味着一条LDR指令的平均执行周期介于1到2之间。

ARM7TDMI实现了3级流水线设计。在执行级完成了多个操作, 包括从寄存器读取操作数, 传给移位寄存器, 传给算术逻辑单元ALU, 把运算结果写回寄存器。使所有这些操作在一个时钟周期内完成可以简化设计, 降低功耗, 减少晶体管数目、硅片面积但同时也限制了ARM7的最大的时钟频率。因为存储器读写也在执行级内完成, 这样指令会花费多个周期在流水线的执行级。简要流程如下:LDR: (1) 执行级周期1, 计算存储器读地址, 取下一条要执行的指令; (2) 执行级周期2从存储器读取数据; (3) 执行级周期3如果需要的话, 对读取结果作移位操作, 然后写回到目标寄存器。

LDM与LDR类似, 只是要重复周期3以回写其它的目标寄存器STR: (1) 执行级周期1计算存储器写地址, 取下一条要执行的指令; (2) 执行级周期2向存储器写数据。

3 ADμC702X简介

3.1 ADμC702X中I2C工作在从模式时的寻址方式

在ADμC702X中寄存器I2CxID0~I2CxID3用来保存用户配置I2C器件地址ID号。

当总线上产生起始信号, 并接收到第一个字节后, 设备把收到的高7位地址和寄存器I2CxID0~I2CxID3中的器件地址进行比较, 看是否匹配, 如果匹配, 则自动产生ACK信号, 同时设置对应的I2CXSSTA状态, 标识具体是哪个地址被主机寻址。设备继续判断第8位 (R/W) , 如果为‘0’, 设备将进入接收器模式, 如果为‘1’, 设备将进入发送器模式。

如果设备处于接收器状态, 在数据传输的第9个时钟 (ACK) 之后, 设备把接收到的数据放入数据寄存器中并设置一个状态位;如果使用了相应的中断, 则将由该状态位产生一个中断标志, 程序指针也将指向中断入口地址 (可以是FIQ也可以是IRQ) , 由程序调用对应的中断服务程序进行处理。同样, 程序也可以通过查询的方式来完成这些工作。

如果设备处于发送器状态, 在数据传输的第9个时钟之后的一个时钟脉冲之内, 程序应该把主机需要读取的数据放到发送寄存器, 该段程序执行所需要的时间, 决定了设备支持的I2C访问速率。

值得注意的是, ACK信号产生在进入中断之前, 也就是说由硬件自动产生。而在有些MCU中, ACK信号可能是在软件处理后通过设置标志位来决定是否发送ACK信号。

3.2 I2C中断服务程序流程

以SFP项目为例, I2C中断服务程序处理流程如图1所示。

摘要:阐明了I2C总线的特性, 以基于ARM7TDMI体系结构的新型ADμC702x系列MicroConverter ADμC7020为例, 介绍内带I2C接口的MCU的从设备设计要点和方法。

上一篇:语文命题下一篇:防碰撞性能