快捷搜索:  as  test  1111

基于延时比较的模拟I2C总线多主通信方法设计

I2C总线(Inter IC BUS)是PHILIPS公司推出的双向两线串行通信标准。因为它具有接口少、通信效率高等优点,现已获得广泛的利用]。它除了可以进行简单的单主节点通信外,还可以利用在多主节点的通信系统中。在多主节点通信系统中,假如两个或者更多的主节点同时启动数据传输,总线具有冲突检测和仲裁功能,包管通信正常进行并防止数据破坏。现在许多微节制器(MCU)都具有I2C总线接口,能方便地进行I2C总线设计。对付没有I2C总线接口的MCU,可以采纳两条I/O接口线进行模拟。今朝,一些先容模拟I2C的资料主要讲的是在单主节点系统中进行的通信,这使得模拟I2C总线的利器具有必然的局限性。本文根据总线仲裁的思惟,提出一种多主节点通信的思惟及实现流程。

1 I2C总线系统简介

I2C总线系统是由SCL(串行时钟)和SDA(串行数据)两根总线构成的。该总线有严格的时序要求,总线事情时,由串行时钟线SCL传送时钟脉冲,由串行数据线SDA传送数据。总线协议规定,各主节点进行通信时都要有肇端、停止、发送数据和应答旌旗灯号。这些旌旗灯号都是通信历程中的基础单元。总线传送的每1帧数据均是1个字节,每当发送完1个字节后,接管节点就响应给一应答旌旗灯号。协议规定,在启动总线后的第1个字节的高7位是对从节点的寻址地址,第8位为偏向位(“0”表示主节点对从节点的写操作;“1”表示主节点对从节点的读操作),另外的字节为操作数据。图1列出I2C总线上几个基础旌旗灯号的时序。

图1中包括肇端旌旗灯号、竣事旌旗灯号、应答旌旗灯号、非应答旌旗灯号以及传输数据“0”和数据“1”的时序。肇端旌旗灯号便是在SCL线为高时SDA线从高变更到低;竣事旌旗灯号便是在SCL线为高时SDA线从低变更到高;应答旌旗灯号是在SCL为高时SDA为低;非应答旌旗灯号相反,是在SCL为高时SDA为高。传输数据“0”和数据“1”与发送应答位和非应答位时序图是相同的。

图1 I2C总线上基础旌旗灯号的时序

图2表示了一个完备的数据传送历程。在I2C总线发送肇端旌旗灯号后,发送从机的7位寻址地址和1位表示此次操作性子的读写位,在有应答旌旗灯号后开始传送数据,直到发送竣事旌旗灯号。数据因此字节为单位的。发送节点每发送1个字节就要检测SDA线上有没有收到应答旌旗灯号,有则继承发送,否则将竣事发送数据。

图2 一次完备的数据传送历程

2 I2C总线的仲裁

在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被其余节点造访,同时它们都可以作为主节点向其他的节点发送节制字节和传送数据。然则假如有两个或两个以上的节点都向总线上发送启动旌旗灯号并开始传送数据,这样就形成了冲突。要办理这种冲突,就要进行仲裁的讯断,这便是I2C总线上的仲裁。

I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。SCL同步是因为总线具有线“与”的逻辑功能,即只要有一个节点发送低电日常平凡,总线上就体现为低电平。当所有的节点都发送高电日常平凡,总线才能体现为高电平。恰是因为线“与”逻辑功能的道理,当多个节点同时发送时钟旌旗灯号时,在总线上体现的是统一的时钟旌旗灯号。这便是SCL的同步道理。

SDA线的仲裁也是建立在总线具有线“与”逻辑功能的道理上的。节点在发送1位数据后,对照总线上所出现的数据与自己发送的是否同等。是,继承发送;否则,退出竞争。图3中给出了两个节点在总线上的仲裁历程。SDA线的仲裁可以包管I2C总线系统在多个主节点同时妄图节制总线时通信正常进行并且数据不损掉。总线系统经由过程仲裁只容许一个主节点可以继承盘踞总线[1]。

图3因此两个节点为例的仲裁历程。DATA1和DATA2分手是主节点向总线所发送的数据旌旗灯号,SDA为总线上所出现的数据旌旗灯号,SCL是总线上所出现的时钟旌旗灯号。当主节点1、2同时发送肇端旌旗灯号时,两个主节点都发送了高电平旌旗灯号。这时总线上出现的旌旗灯号为高电平,两个主节点都检测到总线上的旌旗灯号与自己发送的旌旗灯号相同,继承发送数据。第2个时钟周期,2个主节点都发送低电平旌旗灯号,在总线上出现的旌旗灯号为低电平,仍继承发送数据。在第3个时钟周期,主节点1发送高电平旌旗灯号,而主节点2发送低电平旌旗灯号。根据总线的线“与”的逻辑功能,总线上的旌旗灯号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接管状态。这样主节点2就赢得了总线,而且数据没有损掉,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继承接管数据,同样也没有损掉落SDA线上的数据。是以在仲裁历程中数据没有损掉。

图3 两个主节点的仲裁历程

3 多主通信的道理及着实现流程

多主通信便是在总线上有多个节点。这些节点既可以作为主节点造访其他的节点,也可以作为从节点被其他节点造访。当有多个节点同时妄图占用总线时,就必要总线的仲裁。对付模拟I2C总线系统,如何实现总线的仲裁是现在钻研模拟I2C总线系统的难点。文献[4]提出在系统中增添1根BUSY线,在占用总线之前先检测BUSY线,看总线是否被占用。若总线余暇,则设置BUSY线并向总线上传送数据;否则,接管数据,直到总线余暇时才占领总线。这种实现多主通信的措施有两个毛病:① 由于I2C最大年夜的优点便是接口少、效率高,这样做不仅增添了应用资本而且削减了I2C总线的上风;② 当主节点数对照多时,等待光阴对照长,效率不高。本设计根据总线的仲裁道理,提出一种基于延时对照的仲裁措施。当主节点想要占用总线时,先检测总线上是否余暇,假如总线是余暇的就发送数据。在发送数据的同时,将总线上的数据接管并与发送的数据进行对照。假如不合,阐明总线上同时还存在其他节点,于是就退出;否则,不停到发送完数据。这种措施既表现了I2C总线的高效性,同时还具有优越的扩展性。

图4 多主通信流程

图4给出了基于延时对照的多主通信流程,此中MCU作为从节点部分的流程在图5中给出。在节点发送肇端旌旗灯号之前先要检测一下总线上是否为余暇状态(BUSY是否为0)。这里应用的检测措施是,持续检测一段光阴看总线上的电平是否不停为高,若是阐明总线上为闲状态,否则阐明有其他的节点正在应用总线,要等一段光阴再发送。当总线余暇时,发送肇端旌旗灯号,接着发送要造访的从节点的地址字节。每发送1位数据就接管对照1次,看发送和接管的是否同等,若是则继承,否则跳出到从节点的接管状态。假如没有孕育发生冲突,MCU作为主节点继承发送数据,直到义务停止,然后发送竣事旌旗灯号并返回。假如数据不一样,MCU将跳转到从节点状态。因为在跳转到从节点接管状态的历程中累加器(ACC)和事情寄存器(Ri)的数据没有发生变更,以是数据没有损掉,作为从节点可以继承接管总线上的数据。这样全部通信的历程没有中断,数据也没有损掉。

图5 从节点部分的流程

图5给出了从节点的流程。进入从节点时,要将BUSY置为高,阐明MCU现在正在事情,不能完成其他的义务。在MCU作为从节点完成接管义务后,要将BUSY置为低。MCU在接管到寻址字节后与自己的地址字节进行对照。假如是造访自己的就进入到下面的接管法度榜样,否则跳出。在造访自己的时刻,还要判断主节点是读取数据照样写数据,以便进入响应的法度榜样。在写字节的子法度榜样中,从节点每发送1个字节的数据后都要不雅察是否有应答旌旗灯号(ACK),有则阐明数据接管到了;否则要跳出等待,从新发送。在读字节的子法度榜样中,每接管1个字节的数据就要发送1个应答旌旗灯号(ACK),以示接管正常,否则主节点将竣事继承发送。在现有的资猜中,关于从节点的道理和源代码对照少,这里给出作为从节点时写字节子法度榜样的源代码。因为篇幅有限其他的子法度榜样没有列出。

4 部分源代码

本节是在MCU多主通信中的部分源代码。多主通信的实现中有几个难点和重点。一是在作为主节点时的写字节子法度榜样,里面要包括发送的每位数据和总线的数据进行对照并做出判断。假如数据不合,要跳出并进入从节点的状态。因为子法度榜样返回主法度榜样时改变的只是PC的值而累加器(ACC)和事情寄存器(Ri)里面的值是不变的,是以MCU进入从机状态后继承接管总线剩下的数据,这样总线的数据并没有损掉。二是作为从节点时的写字节的子法度榜样。因为时钟线是由主节点的MCU节制的,以是如何根据SCL线来读取SDA线的数据是此中的一个难点。三是在具有子地址的从节点关于是写字节照样读字节时的判断。假如是写字节时主节点会给出新的肇端旌旗灯号,并再次发送从节点的地址数据。这时从节点必要做出判断是读取数据照样写数据,并进入响应的子法度榜样。这里给出以上三个重点和难点的子法度榜样的源代码,以供读者参考。这些源代码经实践证实都是精确的。

主节点的写字节子法度榜样:

;此中的NOP可根据时钟的快慢自己加减

WRBYTE:MOV R0,#08H

CLR BUSY;将BUSY值清零

WLP:  RLC A;取数据位

JC   WR1

SJMP WR0;判断数据位

WLP1: DJNZ R0,WLP

NOP

OUT1: RET

WR1:  SETB SDA;发送1

NOP

SETB  SCL

MOV  C,SDA;判断是否与发送的数据相同

JC   GOON

SETB  BUSY

AJMP  OUT1

GOON: NOP

NOP

NOP

CLR SCL

SJMP WLP1

WR0:  CLR SDA;发送0

NOP

SCL

NOP

NOP

NOP

NOP

NOP

CLR

SCL

SJMP  WLP1

从节点的写字节子法度榜样(返回为ACK):

SWRBYTE:MOV R0,#08H

WAGAIN: RRC A

MOV B,#37H

WWAIT1: JB SCL,WWAIT1;等待SCL为低

JC WR1;判断是发送“1”照样发送“0”

SETB SDA;发送“1”

AJMP COM

WR1:  CLR SDA;发送“0”

COM:  DJNZ R0,WWAIT2;判断是否发送完毕

WWAIT3: JNB SCL,WWAIT3;发送完毕等待应答旌旗灯号

WWAIT4: JB SCL,WWAIT4

WWAIT5: JNB SCL,WWAIT5

CLR ACK

JB  SDA,ST0

SETB ACK

ST0:  RET;返回

WWAIT2: JNB SCL,WWAIT2;等待SCL为高

SJMP WAGAIN

从节点的读字节同时判断是否有肇端旌旗灯号的子法度榜样。假如有肇端旌旗灯号,则转为写字节子法度榜样:

SRDBYTE:MOV R0,#08H

SETB 20H;设置标志位判断是读照样写

SETB SDA;开释总线

RWAITJ: JNB SCL,RWAITJ;等待SCL为高

MOV C,SDA;从总线上读取数据

RRC A;存入累计器

DEC R0

MOV C,ACC.7;判断是否为肇端旌旗灯号

JNC RWAITJ1;为低继承读取数据

REWAIT: JNB SCL,RWAITJ1;开始判断是否为肇端旌旗灯号

JB  SDA,REWAIT

CLR 20H;是,则清标志位并返回

AJMP SjRDOUT

RWAITJ1:JB SCL,RWAITJ1;等待SCL为低

RWAITJ3:JNB SCL,RWAITJ3;等待SCL为高

MOV C,SDA

RRC A

DJNZ R0,RWAITJ2

SjRDOUT:RET

RWAITJ2:JB SCL,RWAITJ2;等待SCL为低继承读数据

SJMP RWAITJ3

5 总结

根据总线协议中的仲裁道理,提出的基于延时对照的模拟I2C多主通信的措施,不仅能够表现了I2C总线的高效性,而且还具有优越的扩展性。它使通俗不具有I2C接口的MCU可以利用在多主通信的系统中,既增添了通俗MCU的应用范围,又冲破了模拟I2C总线的利用局限性,为I2C总线的推广起到了积极的感化

您可能还会对下面的文章感兴趣: