书城工业技术智能仪器设计基础
13028600000021

第21章 通信接口技术(2)

MOVAL,00H;置产生9600波特率除数高位

MOVDX,3F9H

OUTDX,AL;写入波特率因子锁存器高位

MOVAL,1BH;设置数据格式

MOVDX,3FBH;写入通信线控制寄存器

OUTDX,AL

MOVDI,00H;设置偏移量

MOVBX,OFFSETSJ1;取出发送数据地址

MOVCX,03H;设置发送数据个数

L1:MOVDX,3FDH;检测发送数据寄存器是否为空

INAL,DX

TESTAL,20H

JZL1;不空,继续检测

MOVDX,3F8H;发送数据

MOVAL,[BX+DI+0]

OUTDX,AL

INCDI;调整地址指针

LOOPLl;将全部数据发送出去

L2:MOVDX,3FDH;检测接收数据寄存器是否为空

INAL,DX

TESTAL,01H

JZL2;不空,继续检测

MOVDX,3F8H;接收数据

INAL,DX

MOVDL,AL

TESTAL,0FFH;判断接收数据是否为结束标志

JZL3;如果有结束标志,程序结束

MOVAH,06H;将接收数据显示

INT21H

JMPL2;继续接收

L3:MOVAH,4CH;程序结束,返回DOS

INT21H

CODEENDS

END

6.2I2C总线

I2C总线(InterICBUS)是由Philips公司推出的一种基于两线的同步串行输出总线,被广泛应用于仪器仪表、通信产品及工业测控系统中。

6.2.1I2C总线的常用术语

I2C总线支持所有NMDS、CMOS等工艺制造的器件。通过两根线(SDA串行数据线,SCI串行时钟线)在连接到总线上的器件之间传送信息,根据地址识别每个器件:单片机、LCD驱动器、存储器、键盘接口。根据器件的功能是否工作于发送和(或)接收方式,I2C总线器件可以分为接受器或发生器。显然LCD驱动器只能是接收器,而存储器可以发生和接收数据。另外,对于发生器和接收器来说,在进行数据传送时可以分别认为是主器件或从器件。主器件是启动在总线上传送数据并产生时钟以允许传送的器件,这时任何被寻址的器件认为是从器件。

I2C是多主机总线,这意味着可由所连接的多个器件控制总线。主器件通常是一个单片机。

在总线上随时都可以找到主/从、发送/接收关系,但应注意这种关系不是永久的,而仅取决于此时数据传送的方向。数据传送是以下述方式进行的:

(1)若单片机A要把信息送至单片机B

单片机A(主器件)寻址单片机B(从器件);

单片机A(主发送)把数据送至单片机B(从接收);

单片机A终止传送。

(2)若单片机A要从单片机B接收信息

单片机A(主器件)寻址单片机B(从器件);

单片机A(主接收)接收单片机B(从发送)数据;

单片机A终止传送。

在这种情况下,主器件(单片机A)产生定时时钟和终止数据传送。

可能有多个单片机接到I2C总线上,即可能同时有几个主器件企图启动总线传送数据。

为了避免这种情况引起的总线混乱,就产生了总线仲裁。总线仲裁过程依赖于总线上各个器件的线“与”连接。如果有两个或两个以上主器件企图把信息送到总线上时,一旦一个主器件送“1”而另一个送“0”,这个送“1”的主器件就退出总线竞争。在竞争过程中,时钟信号是各个主器件产生的异步时钟的线“与”。

在I2C总线上产生的时钟总是对应于主器件的。在传送数据时,每个主器件产生自己的时钟,主器件产生的时钟仅在慢速的从器件拉宽低电平或在竞争中被另一个主器件所改变。

SDA和SCL都是双向线,它们通过上拉电阻接正电源。当总线空闲时,这两根线处于高电平状态。连到总线的器件的输出级必须是漏极开路或集电极开路,这样具有线“与”功能。I2C总线上数据传送的最高速率为100kbps,连到总线上器件的数量仅受总线电容400pF的限制。

6.2.2位传送及数据的有效性

由于不同工艺(NMOS、TTL等)制造的器件可以同时连到I2C总线上,因此逻辑0(低)和逻辑1(高)的电平是不固定的,它取决于相应的VDD,其中每传送一位数据产生一个时钟。

在时钟高电平期间,SDA上的数据必须保持稳定,只有在时钟线SCL上的时钟低电平期间,SDA线上的高电平或低电平状态才能变化。

6.2.3开始和结束信号

在I2C总线数据传送过程中,定义了一种开始和结束信号(有时也称启动和停止信号),这在I2C协议中具有十分重要的意义。当SCL为高电平时,SDA发生高到低跳变,定义为开始信号;当SCL为高电平时,SDA发生低到高跳变,定义为结束信号。开始和结束信号都是由主器件发出的。在开始信号以后,总线被认为是忙的。在结束信号后过一定时间,总线被认为是空闲的。如果连接到总线上的器件具有相应的硬件接口电路,开始和结束信号的检测还比较容易,但是没有这种硬件接口电路的微处理器必须在一个时钟周期内至少2次采样,SDA才能检测到这种跳变。

6.2.4I2C总线数据传送

1.字节格式

送到SDA线上的每个字节必须为8位长度,每次传送的字节数是不受限制的,每个字节后面必须跟随一个响应位。数据传送时先传送最高位。如果接收器件不能接收下一个字节(例如正在处理一个内部中断,在这个中断处理完之前不能接收I2C总线上的数据字节),可以使时钟保持低电平,迫使主器件处于等待状态。当从器件准备好接收下一个数据字节时就释放SCL线,以便数据继续传送。

2.响应

接收器件必须确认数据的接收,确认位相对于主器件产生一个时钟,在这个时钟内发送器件释放SDA线。

接收器件在这个时钟内必须将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。

通常,被寻址的接收器件必须在收到每个字节后发出响应信息。若一个从器件在处理一个实时事件不能接收数据时,从器件必须使SDA保持高电平。此时,主器件产生一个结束信号使传送异常结束。

如果从器件对地址作了确认,而在传送中不能接收更多的数据字节,主器件也必须异常结束传送。这是由于从接收器对数据字节不确认,使SDA线保持高电平,主器件产生结束信号来异常结束传送。

在主器件接收的传送中,主器件对最后一个数据字节不予确认,以从发送器指出数据传送的结束,从发送器释放SDA线,使主器件能产生一个结束信号。

6.2.5I2C总线和时钟同步

为了在I2C总线上传送信息,每个主器件在SCL线上产生时钟,数据仅在时钟的高电平期间有效,在发生一位位竞争的过程中就需要确定一个时钟。

时钟同步是由连在SCL线上的器件的“线与”完成的。SCL线上由高到低的跳变将影响有关的器件,使它们启动低电平期计数。一旦一个器件时钟跳为低电平,将使SCL线保持低电平,直至时钟到达高电平。如果此时其他器件时钟仍处于低电平期,则该器件时钟由低至高的跳变不影响SCL线的状态,因此SCL线上低电平时间由器件中各时钟的最长的低电平时间确定。此时,低电平周期短的器件进入等待高电平的状态。

当所有有关的器件对它们的低电平期计数时,时钟线被释放,返回高电平。这样使器件时钟之间没有差别,而所有的器件都同时开始它们的高电平期计数,第一个结束高电平期的器件又将SCL线拉成低电平。

这样就产生了一个同步的SCL线上的时钟,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。实现这一同步过程的基础就是“线与”逻辑,“线与”逻辑的基础是有关驱动器的集电极开路或漏极开路。“线与”这一概念在I2C协议及其他通信协议中具有十分重要的实际应用意义。

6.2.6I2C总线竞争

发生在SDA线上的总线仲裁(竞争)是以如下方式进行的:一个主器件发送高电平,另一个主器件发送低电平,该器件因总线电平和自身发送的电平不相符而关掉它的输出级,从而退出竞争。

总线竞争可以在许多位上进行。第一级的竞争是地址位的比较,如果主器件寻址同一个从器件,则继续竞争,进入数据位的比较,因为是利用I2C总线上信息进行仲裁,所以在竞争中信息不会丢失或破坏。

退出竞争的主器件在退出的这个字节期间仍旧发送时钟,这个字节以后就不产生时钟,如果主器件在低字节中退出竞争,则有可能被竞争成功的主器件所寻址。

在主器件内部产生的DATA1电平和SDA线上实际电平之间有一点不同。输出级截止时,意味着高电平就加到了总线上,但这并不影响竞争取胜的主器件的数据传送。因为,I2C总线的控制完全由竞争的主器件输出的地址和数据决定,在总线上既没有控制中心,也没有优先级。

利用竞争过程中时钟信号的同步机制,使接收器件能对快速传送的(位或字节)数据进行处理。对于字节一级,能以快的速率接收一个数据字节,但需花费较多时间存储一个接收到的字节或准备一个发送的字节。此时从器件在接收一个字节并确认以后,使SCL线保持低电平,迫使主器件处于等待状态,直至从器件准备好传送下一个字节为止。这一过程称为握手过程。

6.2.7I2C数据格式

I2C数据传送遵循的过程及格式。在开始信号以后送出一个从器件地址,地址为7位,第8位为方向位(R/W),其中,“0”表示写数据,“1”表示读数据。一次数据传送总是由主器件产生的结束信号而终止的。如果主器件还希望在总线上通信,它可以产生另一个开始信号和寻址另一个从器件,而不需要先产生一个停止信号。在这种传送方式中,就可能有读写方式的组合。

主接收方式中,在第一个响应位时主发送器变成主接收器,从接收器变成从发送器,但该响应位仍由从器件产生,结束信号仍由主器件产生。

在传送中方向改变时,要重复开始信号和发送地址,其中R/W位反向。

6.2.8I2C总线寻址

寻址是指开始信号后第一个字节确定主器件所选择的从器件。

1.第一个字节各位的定义

该字节的高7位组成从器件地址,最低位确定信息的方向。

最低位R/W为“0”时表示主器件把信息写到所选择的从器件中,为“1”则表示主器件将读取从器件中的信息。

信号开始后,系统中各个器件将自己的地址和主器件送到总线上的地址进行比较,如果匹配,该器件认为被主器件寻址,从接收或从发送由R/W确定。器件的从地址由固定部分和可编程部分组成,如在系统中使用一个以上相同的器件,从地址的可编程部分确定了在I2C总线上可连接这种器件的最多数目。一个器件从地址的可编程位数取决于该器件可用来编程的引脚数。如果一个器件从地址有4个固定位和3个可编程位,则在总线上可以接8个相同的这种器件,I2C总线约定可以调整I2C总线的地址分配。

地址“1111111”保留为扩展地址,即寻址过程将在第二个地址继续进行。不使用扩展寻址的器件收到这个地址后不做出响应。7位地址其他可能的组合中,高4位为1111也作为扩展目的用,目前还没有对它分配。

2.广播呼叫地址

广播呼叫地址应用于寻址I2C总线上的所有器件。若一个器件不需要广播呼叫寻址中所提供的任何数据,该器件可以忽略该地址,不作响应。如果器件的确需要广播呼叫寻址中提供的数据,该器件应对地址做出响应,其表现为一个从接收器。第二个和接着的数据字节被每个从器件所响应并接收处理。从器件对不能处理的字节应忽略并不作出响应。

广播呼叫的含义总是由第二个字节说明的。

当B为0时第二个字节有如下定义。

“00000110(06H)”:复位并由软件和硬件写入从地址的可编程部分。顺序接收这两个字节,所有的器件(设计成响应一般呼叫寻址)复位并接收地址的可编程部分,注意保证在加电后不要将SDA和SCL线拉成低电平,低电平将阻塞总线。

“00000010(02H)”:仅由软件写入从地址,所有由软件得到地址可编程部分的器件将进入编程方式,但并不复位。

“00000100(04H)”:仅由硬件写入从地址,所有可编程地址部分由硬件确定的器件在接收这两个字节时锁存可编程的地址。器件不复位。

“00000000(00H)”:这个编码的第二个字节不允许使用。余下的编码没有确定,器件必须忽略这些编码。

当B为1时,这两个字节是硬件广播呼叫,其含义是时序由硬件主器件发送(如键盘扫描器),不能对该器件发送从地址编程。因为事先不知道将信息传送给哪个器件,只能产生硬件广播呼叫,发送自己的地址,从而让系统识别自己。

第二字节的剩余7位为硬件主器件的器件地址,该地址由总线上微处理器之类的智能器件所识别,该器件处理来自硬件器件的信息。如果硬件主器件也能作为一个从器件,该从地址和主器件地址是一致的。