(完整word版)模拟I2C总线多主节点通信原理及实现方法_第1页
(完整word版)模拟I2C总线多主节点通信原理及实现方法_第2页
(完整word版)模拟I2C总线多主节点通信原理及实现方法_第3页
(完整word版)模拟I2C总线多主节点通信原理及实现方法_第4页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、仅供个人参考摘要 介绍模拟I2C 总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有 I2C 接口的普通微控制器(MCU )能够实现模拟I2C 总线的多主通信,同时对I2C 总线的推广起到了积极作用。I2C 总线( Inter IC BUS)是 PHILIPS 公司推出的双向两线串行通信标准。由于它具有接口少、通信效率高等优点,现已得到广泛的应用13 。它除了可以进行简单的单主节点通信外,还可以应用在多主节点的通信系统中。在多主节点通信系统中,如果两个或者更多的主节点同时启动数据传输,总线具有冲突检测和仲裁功能,保证通信正常进行并防止数据破坏。现在

2、许多微控制器(MCU )都具有 I2C 总线接口,能方便地进行I2C 总线设计。对于没有I2C 总线接口的MCU ,可以采用两条I/O 接口线进行模拟 2 ,3 。目前,一些介绍模拟I2C 的资料主要讲的是在单主节点系统中进行的通信,这使得模拟I2C 总线的应用具有一定的局限性。本文根据总线仲裁的思想,提出一种多主节点通信的思想及实现流程。1I2C 总线系统简介 13I2C 总线系统是由SCL(串行时钟)和SDA (串行数据)两根总线构成的。该总线有严格的时序要求,总线工作时,由串行时钟线SCL 传送时钟脉冲,由串行数据线SDA 传送数据。总线协议规定,各主节点进行通信时都要有起始、结束、发送

3、数据和应答信号。这些信号都是通信过程中的基本单元。总线传送的每1 帧数据均是1 个字节,每当发送完1 个字节后,接收节点就相应给一应答信号。协议规定,在启动总线后的第1 个字节的高7 位是对从节点的寻址地址,第8 位为方向位( “0”表示主节点对从节点的写操作;“1”示主节点对从节点的读操作),其余的字节为操作数据。图表1 列出 I2C 总线上几个基本信号的时序。图 1 中包括起始信号、停止信号、应答信号、非应答信号以及传输数据“0”和数据 “1”的时序。起始信号就是在SCL 线为高时 SDA 线从高变化到低;停止信号就是在SCL 线为高时SDA 线从低变化到高;应答信号是在SCL 为高时 S

4、DA 为低;非应答信号相反,是在SCL 为高时 SDA 为高。传输数据“0”数据和 “1”与发送应答位和非应答位时序图是相同的。For personal use onlyin study and research; not for commercial use图 1I2C 总线上基本信号的时序图 2 表示了一个完整的数据传送过程。在I2C 总线发送起始信号后,发送从机的7 位寻址地址和1 位表示这次操作性质的读写位,在有应答信号后开始传送数据,直到发送停止信号。数据是以字节为单位的。发送节点每发送1 个字节就要检测SDA 线上有没有收到应答信号,有则继续发送,否则将停止发送数据。不得用于商业用

5、途仅供个人参考图 2一次完整的数据传送过程2 I2C 总线的仲裁在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I2C 总线上的仲裁。I2C 总线上的仲裁分两部分:SCL 线的同步和SDA 线的仲裁。 SCL 同步是由于总线具有线“与 ”的逻辑功能, 即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与

6、”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。这就是SCL 的同步原理。SDA 线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1 位数据后, 比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。图3 中给出了两个节点在总线上的仲裁过程。SDA 线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线 1 。图 3 是以两个节点为例的仲裁过程。DATA1和 DATA2 分别是主节点向总线所发送的数据信号,SDA 为总线上所呈现的数据信号, SC

7、L 是总线上所呈现的时钟信号。当主节点1、 2 同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2 个时钟周期, 2 个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3 个时钟周期,主节点1 发送高电平信号,而主节点2 发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1 检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2 就赢得了总线,而且数据没有丢失,即总线的数据与主节点2 所发送的数据一样,而

8、主节点1 在转为从节点后继续接收数据,同样也没有丢掉SDA 线上的数据。因此在仲裁过程中数据没有丢失。图 3两个主节点的仲裁过程3 多主通信的原理及其实现流程多主通信就是在总线上有多个节点。这些节点既可以作为主节点访问其他的节点,也可以作为从节点被其他节点访问。当有多个节点同时企图占用总线时,就需要总线的仲裁。对于模拟I2C 总线系统,怎样实现总线的仲裁是现在研究模拟I2C 总线系统的难点。文献4 提出在系统中增加1 根 BUSY 线,在占用总线之前先检测BUSY 线,看总线是否被占用。若总线空闲,不得用于商业用途仅供个人参考则设置 BUSY 线并向总线上传送数据;否则,接收数据,直到总线空闲

9、时才占有总线。这种实现多主通信的方法有两个缺点: 因为 I2C 最大的优点就是接口少、效率高,这样做不仅增加了使用资源而且减少了I2C 总线的优势;当主节点数比较多时,等待时间比较长, 效率不高。 本设计根据总线的仲裁原理, 提出一种基于延时比较的仲裁方法。 当主节点想要占用总线时,先检测总线上是否空闲,如果总线是空闲的就发送数据。在发送数据的同时,将总线上的数据接收并与发送的数据进行比较。如果不同,说明总线上同时还存在其他节点,于是就退出;否则,一直到发送完数据。这种方法既体现了I2C 总线的高效性,同时还具有良好的扩展性。不得用于商业用途仅供个人参考图 4多主通信流程图 4 给出了基于延时

10、比较的多主通信流程,其中MCU 作为从节点部分的流程在图5 中给出。在节点发送起始信号之前先要检测一下总线上是否为空闲状态(BUSY 是否为 0)。这里使用的检测方法是,持续检测一段时间看总线上的电平是否一直为高,若是说明总线上为闲状态,否则说明有其他的节点正在使用总线,要等一段时间再发送。当总线空闲时, 发送起始信号,接着发送要访问的从节点的地址字节。每发送1 位数据就接收比较1 次,看发送和接收的是否一致,若是则继续,否则跳出到从节点的接收状态。如果没有产生冲突,MCU 作为主节点继续发送数据,直到任务结束,然后发送停止信号并返回。如果数据不一样, MCU 将跳转到从节点状态。由于在跳转到

11、从节点接收状态的过程中累加器(ACC )和工作寄存器(Ri)的数据没有发生变化,所以数据没有丢失,作为从节点可以继续接收总线上的数据。这样整个通信的过程没有中断,数据也没有丢失。图 5从节点部分的流程图 5 给出了从节点的流程。进入从节点时,要将BUSY 置为高,说明MCU 现在正在工作,不能完成其他的任务。在MCU 作为从节点完成接收任务后,要将BUSY 置为低。 MCU 在接收到寻址字节后与自己的地址字节进行比较。如果是访问自己的就进入到下面的接收程序,否则跳出。在访问自己的时候,还要判断主节点是读取数据还是写数据,以便进入相应的程序。在写字节的子程序中,从节点每发送1 个字节的数据后都要

12、察看是否有应答信号(ACK ),有则说明数据接收到了;否则要跳出等待,重新发送。在读字节的子程序中,每接收1 个字节的数据就要发送1 个应答信号( ACK ),以示接收正常,否则主节点将停止继续发送。在现有的资料中,关于从节点的原理和源代码比较少,这里给出作为从节点时写字节子程序的源代码。由于篇幅有限其他的子程序没有列出。4 部分源代码不得用于商业用途仅供个人参考本节是在 MCU 多主通信中的部分源代码。多主通信的实现中有几个难点和重点。一是在作为主节点时的写字节子程序,里面要包括发送的每位数据和总线的数据进行比较并做出判断。如果数据不同,要跳出并进入从节点的状态。由于子程序返回主程序时改变的

13、只是PC 的值而累加器(ACC )和工作寄存器(Ri )里面的值是不变的,因此MCU 进入从机状态后继续接收总线剩下的数据, 这样总线的数据并没有丢失。二是作为从节点时的写字节的子程序。由于时钟线是由主节点的MCU 控制的,所以怎样根据SCL 线来读取 SDA 线的数据是其中的一个难点。三是在具有子地址的从节点关于是写字节还是读字节时的判断。如果是写字节时主节点会给出新的起始信号,并再次发送从节点的地址数据。这时从节点需要做出判断是读取数据还是写数据,并进入相应的子程序。这里给出以上三个重点和难点的子程序的源代码,以供读者参考。这些源代码经实践证明都是正确的。主节点的写字节子程序:;其中的 N

14、OP 可根据时钟的快慢自己加减WRBYTE:MOVR0,#08HCLRBUSY; 将 BUSY 值清零WLP:RLCA;取数据位JCWR1SJMPWR0; 判断数据位WLP1:DJNZR0,WLPNOPOUT1:RETWR1:SETBSDA; 发送 1NOPSETBSCLMOVC,SDA; 判断是否与发送的数据相同JCGOONSETBBUSYAJMPOUT1GOON:NOPNOPNOPCLRSCL不得用于商业用途仅供个人参考SJMPWLP1WR0:CLRSDA; 发送 0NOPSCLNOPNOPNOPNOPNOPCLRSCLSJMPWLP1从节点的写字节子程序(返回为 ACK) :SWRBYT

15、E:MOVR0,#08HWAGAIN:RRC AMOVB,#37HWWAIT1:JBSCL,WWAIT1; 等待 SCL 为低JCWR1; 判断是发送 “1”还是发送 “0”SETBSDA; 发送 “1”AJMP COMWR1:CLR SDA; 发送 “0”COM:DJNZR0,WWAIT2; 判断是否发送完毕WWAIT3:JNBSCL,WWAIT3; 发送完毕等待应答信号WWAIT4:JBSCL,WWAIT4WWAIT5:JNBSCL,WWAIT5不得用于商业用途仅供个人参考CLRACKJBSDA,ST0SETBACKST0:RET; 返回WWAIT2:JNBSCL,WWAIT2; 等待 S

16、CL 为高SJMPWAGAIN从节点的读字节同时判断是否有起始信号的子程序。如果有起始信号,则转为写字节子程序:SRDBYTE:MOVR0,#08HSETB20H; 设置标志位判断是读还是写SETBSDA; 释放总线RWAITJ:JNBSCL,RWAITJ; 等待 SCL 为高MOVC,SDA; 从总线上读取数据RRC A; 存入累计器DECR0MOVC,ACC.7; 判断是否为起始信号JNCRWAITJ1; 为低继续读取数据REWAIT:JNBSCL,RWAITJ1; 开始判断是否为起始信号JBSDA,REWAITCLR20H; 是,则清标志位并返回AJMPSjRDOUTRWAITJ1:JB

17、SCL,RWAITJ1; 等待 SCL 为低RWAITJ3:JNBSCL,RWAITJ3; 等待 SCL 为高MOVC,SDARRCADJNZR0,RWAITJ2不得用于商业用途仅供个人参考SjRDOUT:RETRWAITJ2:JBSCL,RWAITJ2; 等待 SCL 为低继续读数据SJMPRWAITJ35总结根据总线协议中的仲裁原理,提出的基于延时比较的模拟I2C 多主通信的方法,不仅能够体现了I2C 总线的高效性,而且还具有良好的扩展性。它使普通不具有I2C 接口的 MCU 可以应用在多主通信的系统中,既增加了普通MCU 的使用范围,又突破了模拟I2C 总线的应用局限性,为I2C 总线的推广起到了积极的作用不得用于商业用途仅供个人参考仅供个人用于学习、研究;不得用于商业用途。For personal use only in stu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论