`

模拟I2C总线多主通信研究与软件设计

 
阅读更多

I2C总线(Inter IC BUS)是Philips公司推出的双向两线串行通信标准。由于它具有接口少、通信效率高等优点,现已得到广泛的应用/[1~3/]。它除了可以进行简单的单主节点通信外,还可以应用在多主节点的通信系统中。在多主节点通信系统中,如果两个或者更多的主节点同时启动数据传输,总线具有冲突检测和功能,保证通信正常进行并防止数据破坏。现在许多微控制器(MCU)都具有I2C总线接口,能方便地进行I2C总线设计。对于没有I2C总线接口的MCU,可以采用两条I/O接口线进行模拟/[2,3/]。目前,一些介绍模拟I2C的资料主要讲的是在单主节点系统中进行的通信,这使得的应用具有一定的局限性。本文根据总线的思想,提出一种多主节点通信的思想及实现流程。

1 I2C总线系统简介[1~3]

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 的原理及其实现流程

就是在总线上有多个节点。这些节点既可以作为主节点访问其他的节点,也可以作为从节点被其他节点访问。当有多个节点同时企图占用总线时,就需要总线的。对于系统,怎样实现总线的是现在研究系统的难点。文献/[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总线的推广起到了积极的作用。

参考文献

1 The I2CBus Specification, Version 2.1. January, 2000. http://www.philips.com/
2 张昆,邱扬,刘浩. 基于CPLD的系统中I2C总线的设计. 电子技术应用,2003(11)
3 何立民. I2C总线应用系统设计. 北京:北京航空航天大学出版社,1995
4 张冬梅,藩仕彬,何为民. 的通用软件包. 单片机与嵌入式系统应用, 2003(12)

分享到:
评论

相关推荐

    研究I2C总线多主通信与软件设计

    I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器(MCU)及其外围设备...现在许多微控制器都具有I2C总线接口,能方便地进行I2C总线设计。对于没有I2C总线接口的MCU,可以采

    嵌入式系统/ARM技术中的模拟I2C总线多主通信研究与软件设计

    摘要 介绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极...

    基于模拟I2C总线多主通信研究与软件设计

    介绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极作用...

    模拟I²C总线多主通信研究与软件设计

    绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极作用。

    单片机模拟I2C总线通信

    单片机模拟I2C总线通信,虚拟i2c的程序

    嵌入式系统/ARM技术中的模拟I2C总线多主通信的通用软件包

    摘要:本文给出软件模拟I2C总线应用在多主机系统中的解决方案。分析多主竞争出现原因及其时段,结合时序图和流程图阐述...本文提供了一种解决方案,可将模拟I2C总线应用在多主机系统中,实现模拟I2C的多主通信。1 模拟I

    (完整word版)模拟I2C总线多主节点通信原理及实现方法.doc

    (完整word版)模拟I2C总线多主节点通信原理及实现方法.doc

    用GPIO模拟I2C总线的通信过程及源代码

    用GPIO模拟I2C总线的通信过程及源代码,在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平。如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志。当SCL为高电平时,SDA...

    模拟I2C总线多主节点通信原理及实现方法

    绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极作用。

    嵌入式系统/ARM技术中的模拟I²C总线多主通信研究与软件设计

    摘要 介绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极...

    I2C.rar_I2C竞争_I2c 多机_多机通信 I2c_模拟I2C

    《模拟I2C总线多主通信的通用软件包》,支持多主竞争,比如有多个单片机和I2C器件同时工作。

    单片机模拟I2C总线及AT24C01应用实例

    I 2 C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。 例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可...

    I2C总线多主通信研究与软件设计

    目前,一些介绍模拟I2C的资料主要讲的是在单主节点系统中进行的通信,这使得模拟I2C总线的应用具有一定的局限性。本文根据总线仲裁的思想,提出一种多主节点通信的思想及实现流程。

    模拟i2c总线程序

    51单片机模拟i2c总线通信。只需要稍作修改就可以使用。

    软件模拟I2C总线的C51实现

    摘 要:介绍51系列单片机上的I2C总线主节点模拟程序,从而实现与具有I2C接口的器件通信。 1I2C总线简介1.1硬件结构 I2C串行总线支持所有NMOS、CMOS、I2L工艺制造的器件。从物理上看由两根双向I/O线组成,一根为...

    I2C总线器件的应用

    第一节 I2C总线器件应用概述 I2C总线工作原理 I2C总线系统结构 I2C总线系统结构如图7-1所示。 其中,SCL是时钟线,SDA是数据线。...二、I2C总线数据传输方式模拟 1、I2C总线软件包组成 ①启动信号子

    I2c.rar_8051 I2C_I2C 8051_i2c_i2c 单片机_模拟I2C

    模拟I2C总线的C51通用程序: 实现8051系列单片机与I2C总线器件的通信

    基于延时比较仲裁的模拟I^2C多主通信的软件设计实现.pdf

    根据模拟I C总线多主节点通信原理,提出采用延时接收比较来实现仲裁的软件实现方 法,为~-g-.备I c接口的普通微控制器(MCU)实现模拟12C总线的多主节点通信,促进对I c总线 的推广应用。

Global site tag (gtag.js) - Google Analytics