电子发烧友网 > 接口/总线/驱动 > 接口/总线/驱动 > 正文

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

2020年01月18日 16:20 次阅读

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”与发送应答位和非应答位时序图是相同的。

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

图1 I2C总线上基本信号的时序

图2表示了一个完整的数据传送过程。在I2C总线发送起始信号后,发送从机的7位寻址地址和1位表示这次操作性质的读写位,在有应答信号后开始传送数据,直到发送停止信号。数据是以字节为单位的。发送节点每发送1个字节就要检测SDA线上有没有收到应答信号,有则继续发送,否则将停止发送数据。

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

图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线上的数据。因此在仲裁过程中数据没有丢失。

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

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

3 多主通信的原理及其实现流程

多主通信就是在总线上有多个节点。这些节点既可以作为主节点访问其他的节点,也可以作为从节点被其他节点访问。当有多个节点同时企图占用总线时,就需要总线的仲裁。对于模拟I2C总线系统,怎样实现总线的仲裁是现在研究模拟I2C总线系统的难点。文献[4]提出在系统中增加1根BUSY线,在占用总线之前先检测BUSY线,看总线是否被占用。若总线空闲,则设置BUSY线并向总线上传送数据;否则,接收数据,直到总线空闲时才占有总线。这种实现多主通信的方法有两个缺点:① 因为I2C最大的优点就是接口少、效率高,这样做不仅增加了使用资源而且减少了I2C总线的优势;② 当主节点数比较多时,等待时间比较长,效率不高。本设计根据总线的仲裁原理,提出一种基于延时比较的仲裁方法。当主节点想要占用总线时,先检测总线上是否空闲,如果总线是空闲的就发送数据。在发送数据的同时,将总线上的数据接收并与发送的数据进行比较。如果不同,说明总线上同时还存在其他节点,于是就退出;否则,一直到发送完数据。这种方法既体现了I2C总线的高效性,同时还具有良好的扩展性。

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

图4 多主通信流程

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

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

图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总线的推广起到了积极的作用

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

第二期:J1939通信数据链路层(上)

主题简介及亮点:J1939通信是商用车,军工,船舰 ,农机,发电机,特种设备等上面的常用通信标准,这两年在新能源车上应用
发烧友学院发表于 2019-03-07 00:00 1099次阅读
第二期:J1939通信数据链路层(上)

采用LPC2294四路CAN控制器实现智能通信卡...

LPC2294是PHILIPS公司推出的一款功能强大、超低功耗且具有ARM7TDMI内核的32位微控....
发表于 2020-01-18 09:28 28次阅读
采用LPC2294四路CAN控制器实现智能通信卡...

STM32与BQ2060a通信问题

STM32与BQ2060a通信问题 我使用407芯片 原子哥的模拟IIC 与BQ2060a通信 想读取电池组的电压 容量 温度等...
发表于 2020-01-16 13:56 409次阅读
STM32与BQ2060a通信问题

采用PC/104嵌入式模块与1553B总线卡实现...

随着我国航空事业的迅速发展,各种新型飞机和发控设备相继研制成功,以往一些测控设备在功能和性能上已无法....
发表于 2020-01-16 10:17 160次阅读
采用PC/104嵌入式模块与1553B总线卡实现...

RS 422通信接口芯片系统电路的设计及实验仿真...

目前通用的串行通信接口标准主要有RS 232,RS 422和RS 485,其中RS 232属于单端不....
发表于 2020-01-16 10:11 111次阅读
RS 422通信接口芯片系统电路的设计及实验仿真...

基于总线传输的智能型接口转换器实现城市互联网消防...

消防作为现代城市安全系统的一个组成部分,随着现代城市的迅速发展已越来越显示其重要性。但目前市场上的城....
发表于 2020-01-16 09:47 38次阅读
基于总线传输的智能型接口转换器实现城市互联网消防...

基于单片机AT89S52与总线技术实现小区周界防...

随着科学技术和经济的快速发展,人们对居家的概念已从最初满足简单的居住到注重对住宅的人性化需求,如安全....
发表于 2020-01-15 17:07 149次阅读
基于单片机AT89S52与总线技术实现小区周界防...

关于RS-485总线电平异常解决方案解析

RS-485总线电平异常解决方案解析
发表于 2020-01-15 17:05 197次阅读
关于RS-485总线电平异常解决方案解析

基于Compact PCI总线的热插拔技术的原理...

系统在X86系统主机下,设计为一个IO适配卡,通过以上分析可知,具备热插拔能力的CompactPCI....
发表于 2020-01-15 16:55 115次阅读
基于Compact PCI总线的热插拔技术的原理...

EtherCAT技术的原理、性能及应用优势

EtherCAT主张“以太网控制自动化技术” 。 它是一个开放源代码,高性能的系统,目的是利用以太网....
发表于 2020-01-15 16:22 125次阅读
EtherCAT技术的原理、性能及应用优势

浅析常用单片机通信方式、难点以及解决方案

越来越多的功能各异的单片机为我们的设计提供了许多新的方法与思路。对于莫一些场合,比如:复杂的后台运算及通信与高...
发表于 2020-01-10 23:53 860次阅读
浅析常用单片机通信方式、难点以及解决方案

采用单片机和MCP2510、MCP2551芯片设...

本文提出的基于CAN现场总线的集散型火灾报警控制系统的网络结构如图1所示,每个节点都以AT89C51....
发表于 2020-01-10 16:48 156次阅读
采用单片机和MCP2510、MCP2551芯片设...

利用ZigBee网络组网和总线技术实现新一代电子...

系统的ZigBee网络通信部分由一台主控制器、若干从控制器组成。系统的各个主、从控制器相对独立,各主....
发表于 2020-01-10 14:15 92次阅读
利用ZigBee网络组网和总线技术实现新一代电子...

双通道CAN总线扩展板可以应用在恶劣环境中

VersaLogic公司通过新的“ C1”模块扩展了其工业温度范围的耐用型Mini PCIe扩展产品....
发表于 2020-01-09 15:07 107次阅读
双通道CAN总线扩展板可以应用在恶劣环境中

总线时钟

/** @defgroup RCC_AHB1_Peripherals对应端口(port)所在的总线时钟   * @{   */ #...
发表于 2020-01-09 14:54 392次阅读
总线时钟

采用COTS新技术对各类工业以太网实时性能评价进...

根据文献,某种报文的实时性得到满足是指其报文响应时间小于规定的时限,某个节点的实时性合乎要求是指该节....
发表于 2020-01-08 16:34 373次阅读
采用COTS新技术对各类工业以太网实时性能评价进...

通过RS485串口实现开关信号的多点监测,提高总...

工业现场经常要采集多点数据,模拟信号或开关信号,一般用到RS485总线,使用一主带多从的通信方式,该....
发表于 2020-01-08 16:22 583次阅读
通过RS485串口实现开关信号的多点监测,提高总...

Linear LTC4266A/LTC4266C...

LTCR4266A是一个四通道电源设备(PSE)控制器,能够向兼容的LTPoE ++受电设备(PD)....
发表于 2020-01-07 16:29 593次阅读
Linear LTC4266A/LTC4266C...

空中软件更新确保互联汽车的数据安全性

最近许多起针对互联汽车的黑客攻击已经引起了巨大轰动,这对系统的安全性提出了挑战。通常情况下,可以使用....
发表于 2020-01-02 15:47 946次阅读
空中软件更新确保互联汽车的数据安全性

提个困难问题,labview如何通过DI DO来实现与I2C传感器通讯

这是完全可行的,找个题目与大家讨论一番。...
发表于 2019-12-30 16:22 152次阅读
提个困难问题,labview如何通过DI DO来实现与I2C传感器通讯

交换机堆叠的两种方式,与级联有什么不同之处

堆叠是指将一台以上的交换机组合起来共同工作,以便在有限的空间内提供尽可能多的端口。多台交换机经过堆叠....
发表于 2019-12-19 11:49 856次阅读
交换机堆叠的两种方式,与级联有什么不同之处

AXI总线的概念及基本特点是什么

AXI总线是一种多通道传输总线,将地址、读数据、写数据、握手信号在不同的通道中发送,不同的访问之间顺....
发表于 2019-12-19 10:02 849次阅读
AXI总线的概念及基本特点是什么

防盗报警系统的电话联网报警的重要性和必配性分析

当前防盗报警系统采用的联网方式主要有电话线、专用总线(RS485、CAN BUS等)、网络、电力线、....
发表于 2019-12-15 11:06 159次阅读
防盗报警系统的电话联网报警的重要性和必配性分析

U盘具有哪些应用优势及使用时该注意哪些事项

U盘主要目的是用来存储数据资料的,经过爱好者及商家们的努力,把U盘开发出了更多的功能:加密u盘、启动....
发表于 2019-12-11 11:41 1092次阅读
U盘具有哪些应用优势及使用时该注意哪些事项

i2c读写eeprom出现问题

同样的程序,我今天上午可以实现读取的数据是正确的,然后我把读取给注释掉了,再次写入,然后断电,注释掉写入程序,...
发表于 2019-12-10 03:07 286次阅读
i2c读写eeprom出现问题

UART总线工作原理全解析

通用异步收发传输器(Universal Asynchronous Receiver/Transmit....
发表于 2019-12-09 15:28 923次阅读
UART总线工作原理全解析

PLC使用脉冲方式控制伺服电机

伺服驱动器通过接收的脉冲频率和数量来控制伺服电机运行的距离和速度。比如,我们约定伺服电机每10000....
发表于 2019-12-09 08:51 713次阅读
PLC使用脉冲方式控制伺服电机

求STM32F0模拟I2C程序例程

各位大神,求一STM32F0 模拟I2C程序例程,谢谢!...
发表于 2019-12-05 20:47 769次阅读
求STM32F0模拟I2C程序例程

【梦翼师兄今日分享】 IIC通信协议程序设计讲解

写在前面的话 IIC的通信协议和通信接口在很多工程中有广泛的应用,如数据采集领域的串行AD,图像处理领域的摄像...
发表于 2019-12-04 10:36 3929次阅读
【梦翼师兄今日分享】 IIC通信协议程序设计讲解

编写的i2c三段式状态机,编译出现问题,说我产生了多驱动,请问怎么解决?谢谢

发表于 2019-12-02 11:12 276次阅读
编写的i2c三段式状态机,编译出现问题,说我产生了多驱动,请问怎么解决?谢谢

如何在树莓派上启用SPI / I2C

I2C非常适合需要大量输出的任何项目。 LCD屏幕的典型用途是使用,最多需要16个引脚。 I2C将其....
发表于 2019-12-02 10:14 794次阅读
如何在树莓派上启用SPI / I2C

【MYD-CZU3EG开发板试用体验】【图像篇】 Sii9022的IIC操作

做图像处理最终结果要么保存到文件内,要么通过一个设备显示出来,HDMI实现了显示渠道的接口,在MYD-CZU3E...
发表于 2019-11-26 20:17 875次阅读
【MYD-CZU3EG开发板试用体验】【图像篇】 Sii9022的IIC操作

恩智浦基于I2C接口的LED驱动器,高可靠性和高...

现在大街上随处可见的LED显示屏,还有装饰用的LED彩灯以及LED车灯,处处可见LED灯的身影,LE....
发表于 2019-11-22 17:42 282次阅读
恩智浦基于I2C接口的LED驱动器,高可靠性和高...

系统总线的特点_系统总线工作原理

本文首先介绍了计算机系统总线的特点,其次介绍了系统总线工作原理,最后介绍了系统总线技术规范。
发表于 2019-11-15 10:43 364次阅读
系统总线的特点_系统总线工作原理

系统总线是什么_系统总线分为哪三类

本文首先阐述了系统总线的概念,其次阐述了系统总线技术指标,最后介绍了系统总线的三大分类。
发表于 2019-11-15 10:38 2843次阅读
系统总线是什么_系统总线分为哪三类

有人用过AD7997这个芯片吗

这个芯片怎样通过I2C配置其工作模式,选择转换通道,寄存器地址这些。 我MCU用的ATMEGA64 ...
发表于 2019-11-11 11:01 379次阅读
有人用过AD7997这个芯片吗

如何才能读写24C02的串行EPROM

I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两....
发表于 2019-11-09 14:17 1550次阅读
如何才能读写24C02的串行EPROM

浅析六种常用的单片机通信协议

在单片机的应用中,通信协议是必不可少的一部分,上位机与下位机,单片机与单片机,单片机与外设模块之间的....
发表于 2019-11-08 16:36 513次阅读
浅析六种常用的单片机通信协议