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总线的接口。文献中给出了较具体的规划思路和部分程序代码。