×
接口总线驱动 > 总线 > 详情

I2C总线接口扩展技术

发布时间:2020-05-25 发布时间:
|
  1 引言

  i2c总线(inter ic bus,又常写作iic总线或i2c总线)是philips公司推出的新一代串行通信标准总线。它与spi、microwire/plus串行接口不同,仅仅依靠两根连线实现了完善的全双工同步数据传送:一根为串行数据线(sda),一根为串行时钟线(scl)。由于i2c总线具有接口电路简单,可进行系统的模块化、标准化设计,灵活性强,可维护性好等特性,目前已成为一种重要的串行通信总线。除了philips公司,像 motorola公司,韩国三星,日本三菱,美国 a/d等许多大公司都陆续推出了带有i2c总线标准接口的产品,涉及微处理器(mcu),通用的外围设备(eeprom,i/o口,a/d,d/a ,lcd/led显示器,日历时钟,键盘,打印机接口等等)和家电、音像产品。i2c总线的应用日益广泛,i2c总线器件的接口电路设计也显得十分重要。

  2 i2c总线简介[1]

  自从philips推出i2c总线标准以来,经历了3个版本:version 1.0-1992,version2.0-1998和version 2.1-2000。这使得i2c总线标准不断完善,应用范围日益广泛。i2c总线标准规定有如下3种工作模式:

  (1) standard-mode(标准模式):线上最快传输速率为100kbps

  (2) fast-mode(快速模式):线上最快传输速率为400kbps

  (3) hs-mode(high-speed mode,高速模式):线上最快传输速率为3.4mbps

  (4) 这3种工作模式可以向前兼容,即hs-mode环境下允许以f/s-mode(fast or standard-mode)工作,fast-mode环境下允许以standard-mode工作。实际电路中的具体工作模式主要取决于系统中i2c器件接口的电气特性。

  i2c总线技术采用器件地址的硬件设置方法,通过软件寻址完全避免了器件片选线寻址的方法,从而使得硬件系统具有最简单而灵活的扩展方法。随着i2c技术的广泛应用,传统的7位从器件地址(slaver addresses)已经无法满足实际需要,在改进的i2c总线标准中增加了10位从地址寻址技术,这样可以把从器件地址由原来的100多个扩充为 1024个,为i2c总线技术的广泛应用奠定了基础。

  目前,实际应用的i2c器件都以f/s-mode 和7位从地址标准为主。关于hs-mode 的应用和10位从地址的设计方法可以参阅文献1。

  3 i2c总线协议要求[1,2]

  i2c总线协议有严格的时序要求。总线工作时,由时钟控制线scl传送时钟脉冲,由串行数据线sda传送数据。总线传送的每帧数据均为1个字节 (8bit),但启动i2c总线后,传送的字节个数没有限制,只要求每传送1个字节后,对方回应1个应答位(acknowledge bit)。在发送时,首先发送的是数据的最高位(msb)。协议规定,启动总线后的第1个字节的高7位是从器件的寻址地址(硬件地址),第8位为方向位 (“0”表示主器件对从器件的写操作;“1”表示主器件对从器件的读操作),其余的字节为操作的数据。总线每次传送开始时有起始信号,结束时有停止信号。在总线传送完1个或几个字节后,可以控制scl线的电平变低,从而使传送暂停。

  图1列出了i2c总线上典型的几个信号时序,图2表示了i2c总线上1次完整的数据传送过程。

  

 

  在i2c总线系统中,信号传输的具体时序描述如下:

  (1) 起始信号(s):在时钟scl为高电平期间,数据线sda出现由高电平向低电平的变化,启动i2c总线;

  (2) 停止信号(p):在时钟scl为高电平期间,数据线sda出现由低电平向高电平的变化,停止i2c总线上的数据传送;

  (3) 应答信号(a):i2c总线的第9个脉冲对应应答,对应sda线上显示低电平时为“应答”信号(a),sda线上显示高电平时为“非应答”信号(/a);

  (4) 数据位传送:i2c总线开始信号或应答信号之后的第1~8个时钟脉冲对应一个字节的8位数据传送。在脉冲高电平期间,数据串行传送;在脉冲低电平期间,数据准备,允许总线上数据电平变化。

  4 i2c总线的接口扩展技术

 

  i2c总线软硬件协议十分巧妙,它可以用于构成多主系统。系统中有多个i2c总线接口单片机时,会出现多主竞争的复杂状态。i2c总线软硬件协议,以及 i2c总线单片机中的sfr寄存器保证了多主竞争时的协调管理。i2c总线提供的状态处理软件包能自动处理总线上出现的26种状态。在使用i2c总线时,将这些软件在程序存储器中定位,利用这些软件编制出归一化的操作命令,设计起来十分简单,方便。对没有i2c总线接口的单片机,要构成多主系统,几乎不可能。因此,在多主的i2c总线系统中,一定要使用带i2c总线接口的单片机[7]。

  在单主方式的i2c总线系统中,总线上只有一个主器件,其余都是带有i2c总线的外围器件。由于总线上只有一个主器件成为主节点,该主器件永远占据总线,不会出现总线竞争,主节点也不必有自己的节点地址。在单主系统中,主器件可以是没有i2c总线接口的器件,此时用它的两根i/o口线来虚拟i2c总线接口,只要时序满足i2c总线的要求,就可以进行i2c总线操作。

  4.1基于单片机系统的i2c总线接口技术[2,3]

  i2c总线技术最早是基于单片机系统提出的,现在越来越多的单片机带有i2c总线接口,可以直接应用。但是更多的单片机系统并没有i2c总线接口,要在 i2c总线系统中应用,必须进行i2c总线虚拟。这一技术经过多年的发展,已经十分成熟,具有专门的虚拟通用软件包viic1.0[3],用户甚至可以不必了解i2c总线的协议,也可以进行i2c总线开发,实现了操作的“傻瓜化”,极大的方便了用户,扩展了单片机的应用领域,推动了i2c总线技术的发展。

  该软件包适用于80c51系列单主系统中i2c总线外围器件扩展的应用程序设计。由于软件中的时序模拟基于6mhz时钟设计,故在实际应用中可以根据具体的系统时钟来适当修改时序模拟子程序中的空操作指令,便可以直接应用。

  该软件包包含以下3部分共9个子程序:

  (1) 模拟i2c总线操作的典型时序:起始位(star)、停止位(stop)、发送应答位(mack)、发送非应答位(mnack) 。

  (2) 模拟i2c数据传送过程:应答位检查(cack)、发送1个字节数据(wrbyt)、接收1个字节数据(rdbyt)。

  (3) 模拟外围器件读写操作:i2c总线读操作过程(rdnbyt)(接收n个字节),i2c总线写操作过程(wrnbyt)(发送n个字节)。

  不论总线上扩展什么外围设备,都统一采用以下3条指令作为viic软件包与用户的操作接口界面,即:

  mov sla,#slar/slaw;总线上节点寻址并确定传送方向

  mov numbyt,#n;确定传送字节数n

  lcall rdnbyt/wrnbyt;读/写操作调用

  文献中对该虚拟软件包有详细的介绍,包括源程序和使用说明,并给出了应用实例。

  对应该软件包,文献4中介绍了基于franklin c51编写的虚拟i2c总线软件包viicc1.0。它由1个头文件和1个源程序组成。在使用时,用户同样不必关心i2c外围器件功能如何,都使用下面的指令:

  rdnbyt(uchar slar,uchar qq[],uchar number); ――单主系统的主接收方式

  wrnbyt(uchar slaw,uchar ff[],uchar number); ――单主系统的主发送方式

  其中:

  slar/slaw是从器件的地址 (读/写);

  number是需要读写的数据字节的个数;

  qq[]是从虚拟i2c总线上读出的数据数组;

  ff[]是需要向虚拟i2c总线上写入的数据数组。

  viicc1.0占用资源与viic1.0占用资源基本上一样。由于viicc1.0是基于 12mhz的时钟设计的,因此实际系统时钟变化时,需要在头文件中适当修改nop ( )的个数。实际应用时,只要把头文件和源程序写入相应的程序区,适当修改几个参数就可以应用,操作简单方便。

  4. 2 基于dsp系统的i2c总线接口的扩展

  如前文所述,i2c总线技术在以单片机为mcu的系统中应用最广泛,设计也最灵活简单。但在许多的系统中,采用dsp(数字信号处理器)作为mcu。若系统中含有i2c接口的外围器件,我们也可以直接用dsp进行i2c总线的开发。目前还没有专门带有i2c接口的dsp,所以也只能采用dsp的2根i/o 口线进行模拟。仿照文献3,4中的设计思路,文献5给出了基于tms320c2xx系列dsp的虚拟i2c总线软件包的设计和应用,极大的方便了以dsp 为mcu的i2c系统。

  该软件包含有2个宏定义和12个子函数,适用于单主系统的主发送和主接收方式,支持tms320c2xx系列对i2c总线外围器件n字节的读写操作,通信方式为对虚拟节点寻址后点对点的读写。该软件包采用4根通用i/o口线(i/o0~i/o3)的任意2根模拟sda和scl,他们的输入输出方向由 aspcr的低4位设定,相应口线状态的设定或读取由iosr寄存器控制。由于c2xx系列的dsp结构与单片机有很大的不同,口线的输入输出状态不是自动切换的,且aspcr 、iosr寄存器都不支持位寻址方式,所以该软件包与前文基于单片机的软件包viic1.0/viicc1.0有所不同。对用户而言,可不必了解软件细节,只要正确设置相应存储单元的内容,调用相应的子函数就可以应用,用户接口同样简单易用。

  另外,文献[6]给出了tms320vc5402实现i2c总线接口的2种设计思路。一是利用该型号dsp的多信道缓冲串口(mcbsp):通过设置 mcbsp的spcr1、spcr2和pcr 相应位,可以将mcbsp的clkr、fsr、clkx、fsx脚设置为通用i/o脚,然后按照i2c总线协议进行软件编程,就可以实现与i2c总线的接口;二是利用vc5402 的主机接口(hpi):通过设置hpi控制寄存器(hpic)、通用目的i/o状态寄存器(gpiosr)和通用目的i/o控制寄存器(gpiocr)相应位,就可以将8位的数据总线(hd0~hd7)转变成通用i/o口,然后进行编程,同样可以实现与i2c总线的接口。文献中给出了较详细的设计思路和部分程序代码。 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
串口通信属性及事件解析