用于多主总线协议的方法及装置与流程

文档序号:12287873阅读:314来源:国知局
用于多主总线协议的方法及装置与流程

本申请主张享有2014年2月7日提交的、发明名称为“METHODS AND APPARATUS FOR A MULTIPLE MASTER BUS PROTOCOL(用于多主总线协议的方法及装置)”的共同未决的美国临时专利申请No.61/937446的优先权,并且为了所有的目的,将该美国临时专利申请的全部内容以引用的方式并入本文中。

技术领域

本发明涉及总线协议,并且更加具体地,涉及用于多主总线协议的装置、系统及方法。



背景技术:

内置集成电路标准(Inter-Integrated Circuit standard,被称为I2C、I2C、i2c、I方C、I二C或IIC)规定了多主串行单端计算机总线,该总线是由飞利浦(Philips)半导体部门(今天的恩智浦半导体公司(NXP Semiconductors))发明的、且通常被用来将低速外围设备附接至母板、嵌入式系统、蜂窝电话或其他数字电子器件。这里所包括的I2C的概述提供了关于I2C系统的基本信息,而且额外的详细信息可以参见由NXP半导体公司发布的、且可通过链接http://www.nxp.com/documents/user_manual/UM10204.pdf获得的“I2C-bus Specification and User Manual”(Rev.5,9October 2012)(“I2C总线规范和用户手册”,2012年10月9日,修订版5),并且为了所有的目的,将这些额外的详细信息的全部内容以引用的方式并入本文中。

如下面将会更加详细地说明,I2C限制了总线主设备能够对I2C总线进行决断的控制量,且因此限制了哪些事务能够使用I2C总线而被可靠地执行。I2C也具有可能会使其不适合于一些应用的其他限制。因此,目前需要的是能够在I2C协议内提供改进型多主支持的系统、装置及方法。



技术实现要素:

在一些方面,本发明的实施例提供了一种用于仲裁多主计算机总线的装置。所述装置包括:多主串行计算机总线;与所述总线连接的第一主设备;与所述总线连接的第二主设备;与所述总线连接的从设备;从所述第一主设备通向所述第二主设备和所述从设备的第一I/O线;以及从所述第二主设备通向所述第一主设备和所述从设备的第二I/O线。每当任何一个所述主设备变成总线主设备时,所述总线的仲裁所用的总线仲裁协议就将所述两个主设备限于单个事务。而且,所述两个主设备分别被配置成使用所述两条I/O线来向彼此发出不变成总线主设备的信号。

在另一方面,本发明的实施例提供了一种用于仲裁多主计算机总线的系统。所述系统包括:多主串行计算机总线;与所述总线连接的多个主设备;与所述总线连接的多个从设备;多条I/O线,其中,每条所述I/O线从所述多个主设备中的相应一个主设备延伸而通向所述多个主设备中的所有其他主设备和所述多个从设备中的每个从设备。每当任何一个所述主设备变成总线主设备时,所述总线的仲裁所用的总线仲裁协议就将所述多个主设备限于单个事务。而且,所述多个主设备分别被配置成使用所述多条I/O线来向彼此发出不变成总线主设备的信号。

在又一方面,本发明的实施例提供了一种用于仲裁多主计算机总线的方法。所述方法包括:提供将第一主设备、第二主设备和从设备连接q起来的多主串行计算机总线;提供从所述第一主设备延伸到所述第二主设备和所述从设备的第一I/O线;提供从所述第二主设备延伸到所述第一主设备和所述从设备的第二I/O线;当任何一个所述主设备变成总线主设备时,将所述两个主设备中的各者都限于与所述从设备有关的单个事务;当所述第一主设备要在所述第二主设备不干预的情况下执行一系列连续的、不中断的与所述从设备有关的事务时,使用所述第一I/O线来向所述第二主设备发出不变成总线主设备的信号;并且当所述第二主设备要在所述第一主设备不干预的情况下执行一系列连续的、不中断的与所述从设备有关的事务时,使用所述第二I/O线来向所述第一主设备发出不变成总线主设备的信号。

根据本发明的上述这些实施例和其他实施例而提供了许多其他方面。根据下面的详细说明、随附的权利要求和附图,能够更加充分地了解本发明的各实施例的其他特征和方面。

附图说明

图1图示了根据现有技术而实施的示例性I2C系统的框图。

图2图示了用于说明图1的示例性I2C系统的操作的流程图。

图3图示了根据本发明一些实施例的改进型I2C系统的示例的框图。

图4至图6图示了用于说明图3的示例性改进型I2C系统的操作的流程图。

具体实施方式

本发明的实施例提供了如下的改进型I2C多主总线独占方法及装置:该方法及装置使得能够在不干预由其他主设备进行的与从设备有关的事务的情况下,在I2C总线上执行多个、不中断的与从设备有关的事务。标准I2C规范提供了使多个主设备中的一者在与从设备有关的单个事务之前获得对I2C总线的控制的仲裁方法,但是没有提供使该主设备保持独占控制以便例如完成不中断序列的多个事务(例如,读改写事务)的任何手段。本发明使得某一主设备(例如,微控制器)能够以不用与其他主设备的对从设备(例如,存储器)的访问发生竞争的方式保留对该从设备的独占访问以便进行多个连续事务。注意,这里使用的术语“单个事务”的意思是指在START(开始)标记与STOP(停止)标记之间的单个读取命令、单个写入命令或单个组合格式命令(其限于两个读取、两个写入、或者一个读取和一个写入)。

常规I2C仅使用通过电阻器上拉的两条双向开漏线(open-drain line),即串行数据线(SDA;Serial Data Line)和串行时钟(SCL;Serial Clock)。所使用的典型电压是+5V或+3.3V,然而使用其他电压的系统也是允许的。

I2C参考设计具有7位或10位(取决于所使用的器件)地址空间。通常的I2C总线速度是标准模式下的100千比特/秒和低速模式下的10千比特/秒,但是任意低的时钟频率也是允许的。最新修订版的I2C能够承载更多节点且以更快的速度运行(例如,快速模式下的400千比特/秒、快速模式+或Fm+下的1兆比特/秒、和高速模式下的3.4兆比特/秒)。与用在PC上相比,这些速度更加广泛地用在嵌入式系统上。也存在其他的可用的特征,例如16位寻址。

注意,位速率(bit rate)被引入以用于在没有时钟拉伸(clock stretching)或其他硬件开销(hardware overhead)情况下主设备与从设备之间的事务。协议开销包括从地址(slave address)和可能的在从设备内的寄存器地址以及每字节的ACK/NACK位。因此,用户数据的实际传输速率低于峰值位速率独自将会意味着的传输速率。例如,如果与从设备的每个交互活动都缺乏效率地仅允许数据的1个字节得到传输,那么数据速率将小于一半的峰值位速率。

节点的最大数量受到地址空间且也受到400pF的全部总线电容的限制,这把实际通信距离限定为几米。

参考设计是具有7位寻址时钟(SCL)和数据(SDA)线的总线。该总线具有用于节点的两个角色:主设备和从设备。主设备节点是产生时钟且发起与从设备的通信的节点。从设备节点是当被主设备寻址时接收时钟且做出应答的节点。

总线是多主总线,这意味着能够存在任何数量的主设备节点。此外,主设备和从设备的角色可以在消息之间(例如,在发送STOP之后)被改变。对于给定的总线器件,存在四种可能的操作模式,然而大多数器件仅使用单个角色及它的两个模式。这些模式包括主设备发送、主设备接收、从设备发送和从设备接收。在主设备发送模式下,主设备节点将数据发送到从设备。在主设备接收模式下,主设备节点接收来自从设备的数据。在从设备发送模式下,从设备节点将数据发送到主设备,且在从设备接收模式下,从设备节点接收来自主设备的数据。

主设备最初处于主设备发送模式,在该模式下:发送开始位,该开始位的后面跟随着该主设备希望与之通信的从设备的7位地址,最后面还跟随着表示该主设备是希望对从设备进行写入的一个位(0)或是希望对从设备进行读取的一个位(1)。

如果从设备存在于总线上,那么该从设备将会对该地址以ACK位(对于确认,低电平有效)做出应答。然后,主设备(根据它发送的读取/写入位)要么以发送模式要么以接收模式来继续,且从设备以主设备的互补模式(分别是接收或发送)来继续。

首先发送地址和数据字节的最高有效位。通过在SCL高电平情况下的SDA的高至低的转变来表明开始位;通过在SCL高电平情况下的SDA的低至高的转变来表明停止位。在SCL低电平情况下,发生SDA的所有其他转变。

如果主设备希望对从设备进行写入,那么主设备重复地发送字节且从设备发送ACK位。(在这种情况下,主设备处于主设备发送模式且从设备处于从设备接收模式。)

如果主设备希望对从设备进行读取,那么主设备重复地接收来自从设备的字节,且主设备在每个字节(但是最后一个字节除外)之后发送ACK位。(在这种情况下,主设备处于主设备接收模式且从设备处于从设备发送模式。)

然后,主设备要么使用停止位来结束发送,要么是如下的另一种情况:如果该主设备为了另一个传输(“组合消息”)而希望保留对总线的控制,那么该主设备可以发送另一个开始位。

I2C规定了消息的基本类型,每个消息都以START标记开始且以STOP标记结束。这些消息类型包括:其中主设备将数据写入从设备中的单个消息;其中主设备从从设备中读取数据的单个消息;以及其中主设备向一个或多个从设备发起至多两个读取和/或写入的组合消息。

在组合消息中,各个读取或写入都以START标记和从地址开始。在组合消息中的第一START标记之后,这些也被称为重复START位。重复START位不被STOP位超越,这就是从设备如何知道接下来的传输是同一消息的一部分。常规地,组合消息限于在START标记与STOP标记之间的两个读取、两个写入、或者一个读取和一个写入(以先读后写或先写后读的任一顺序)。因此,在使用组合格式的单个事务的期间内,能够在START标记与STOP标记之间发送多达两个的命令。

任何给定的从设备将会仅应答特定消息,这是由从设备的产品文件所规定的。I2C系统支持任意消息结构。仅有一些例外,I2C规范没有规定消息语义,例如消息中的数据字节的含义。否则,消息语义原本是特定于产品的。这些例外包括写给I2C通用调用地址(0x00)的消息。

实践中,大多数从设备采用请求/应答控制模型,在这样的模型中,跟随写入命令的一个或多个字节被视为命令或地址。这些字节决定了后续被写入的字节是如何被处理的和/或从设备对后续的读取是如何应答的。大多数I2C操作涉及单字节命令。

在物理层,SCL线和SDA线都是开漏设计,因此,需要上拉电阻器(pull-up resistor)。将上述线拉至地被认为是逻辑0,使上述线悬浮是逻辑1。这被用作通道访问方法。高速系统(以及一些其他系统)在至少SCL上也添加了电流源上拉;这就提供了更大的总线电容且能够实现更快的上升时间。

这样做的重要结果是多个节点可以同时驱动上述线。如果任何一个节点将上述线驱动为低电平,那么上述线将是低电平。试图发送逻辑1(即,使上述线悬浮为高电平)的节点能够看到这种情况,且因此知道另一个节点同时是有效的。

当被用在SCL上时,这被称为时钟拉伸,并且这向从设备赋予了流量控制机制。当被用在SDA上时,这被称为仲裁,并且这确保每次仅存在一个发送器。

当闲置时,两条线都是高电平。为了使事务开始,在SCL保持高电平的同时将SDA拉至低电平。释放SDA以再次悬浮为高电平将会是停止标记,其发出表明总线事务结束的信号。尽管符合规定,但是紧跟在开始后面通常无意义,所以接下来的步骤是要将SCL拉至低电平。

除了开始信号和停止信号以外,SDA线仅当时钟为低电平时才会变化;数据位的发送由以下行为构成:在将数据线保持为稳定地处于期望电平的同时,使时钟线跳到高电平。

当SCL为低电平时,发送器(最初为主设备)将SDA设定为所期望的值且(在让该值传播的小延迟之后)使SCL悬浮为高电平。然后,主设备等待SCL实际走到高电平;这将会因SCL信号的有限上升时间(上拉电阻器和总线的寄生电容的RC时间常数)而被延迟,且这可能还因从设备的时钟拉伸而额外地被延迟。

一旦SCL为高电平,主设备就等待最少时间(例如,对于标准速度的I2C而言,为4μs)来确保接收器已经看到该位,然后就将SCL再次拉至低电平。这完成一个位的发送。

在一个方向上的每8个数据位之后,在另一个方向上发送“确认”位。发送器和接收器对于一个位而言切换角色,先前的接收器将单个0位(ACK)发送回去。如果发送器反而看到1位(NACK),那么它就得知从设备不能接收数据,例如因为不存在这样的从设备、该命令没有被理解、或当主设备向从设备发送时接收器不能接收任何的更多数据。如果从设备向主设备发送且NACK被从设备接收回来,那么这表明主设备希望在当前的数据字节之后停止传输。

在确认位(acknowledge bit)之后,主设备可能做出下列三件事情中的一件:(1)准备传输另一个字节的数据:发送器设定SDA,且主设备使SCL跳到高电平;(2)发送“停止(Stop)”:将SDA设定为低电平,使SCL走到高电平,然后使SDA走到高电平,这释放了I2C总线;或者(3)发送“重复开始(Repeated start)”:将SDA设定为高电平,使SCL走到高电平,且将SDA再次拉至低电平。这在不释放总线的情况下开始了新的I2C总线事务。

I2C协议的多个显著特征中的一者是时钟拉伸。被寻址的从设备可以在接收(或发送)字节之后将时钟线(SCL)保持为低电平,从而表明该从设备还没准备好处理更多数据。与从设备通信的主设备可能未完成当前位的发送,但是必须等待直至时钟线实际走到高电平。如果从设备正在时钟拉伸,那么时钟线将会仍然为低电平(因为连接是开漏的)。如果较慢的第二主设备试图同时驱动时钟,那么同样是上述结果。(如果存在不止一个主设备,那么这些主设备中的除了一个主设备以外的所有主设备通常将会失去仲裁。)

主设备必须等待直至它观察到走到高电平的时钟线,以及将时钟再次拉至低电平之前的额外的最少时间(例如,对于标准的100千比特/秒的I2C而言,为4μs)。

尽管主设备也可以在如它所期望的那么长的时间内将SCL线保持为低电平,但是仅当从设备这样做时通常才会使用术语“时钟拉伸”。尽管在理论上任何时钟脉冲都可以被拉伸,但是通常所使用的是在确认位之前或之后的间隔。例如,如果从设备是微控制器,那么它的I2C接口可以在每个字节之后拉伸时钟,直至软件决定是发送肯定的确认还是发送NACK。

时钟拉伸是I2C内的当从设备对SCL进行驱动时的唯一时间。许多从设备不需要时钟拉伸,且因此将SCL严格地视为不被任何电路驱动的输入。一些主设备(例如在定制的ASIC内部发现的那些主设备)可能不支持时钟拉伸;这些器件通常将会被标明为“双线接口”和非I2C。

每个主设备都监控总线以监控开始位和停止位,且在单个事务期间内当另一个主设备正使总线忙碌的时候,通常不开始消息。然而,两个主设备可能大致上同时开始发送;在这种情况下,发生仲裁。当主设备寻址多个从设备时,从设备发送模式也可能被仲裁,但是这种情况不太常见。与在发出重试前使用随机退避延迟(random back-off delays)的协议(例如以太网)相比,I2C具有确定性的仲裁策略。每个发送器都检查数据线(SDA)的电平且将该电平与它预期的电平进行比较;如果这两个电平不匹配,那么该发送器已经失去仲裁,并且退出这一协议交互活动。

如果一个发送器将SDA设定为1(不驱动信号)且第二发送器将SDA设定为0(拉至地),那么结果是该线为低电平。然后,第一发送器观察到该线的电平异于所预期的电平,并且做出另一个节点正在发送的结论。注意到这样的差异的第一节点是失去仲裁的一个节点:它停止驱动SDA。如果它是主设备,那么它也停止驱动SCL且等待STOP;然后,它可以尝试重新发出它的整个消息。与此同时,另一个节点还没有注意到SDA上的预期电平与实际电平之间的任何差异,且因此继续发送。能够没有任何问题地这样做是因为:到目前为止信号一直恰好是所预期的信号;没有其他发送器干扰它的消息。

如果两个主设备正在向两个不同的从设备发送消息,那么发送较低的从地址的这一个主设备总是“赢得”地址阶段的仲裁。因为这两个主设备可能将消息发送到同一个从地址(有时,多个地址指多个从设备),所以仲裁必须延续到数据阶段。

仲裁很少发生,但是仲裁是适当的多主支持所必需的。正如时钟拉伸一样,不是所有器件都支持仲裁。支持仲裁的器件通常将它们自己标明为支持“多主”通信。

在两个主设备一起同时地发送相同的消息这一极其罕见的情况下,两者都将会认为通信是成功的,但是从设备将会仅看到一个消息。为此,能够被多个主设备访问的从设备必须具有幂等(idempotent)的命令。I2C也具有可能会使其不适合于一些应用的其他限制。

图1描述了现有技术的标准多主I2C系统100的框图,该系统100包括标准I2C总线102。标准I2C总线102使得多个主设备104、106(本示例中仅示出了两个主设备)与一个或多个从设备108(本示例中仅示出了一个从设备)之间能够通信。从设备108包括固定数量的地址引脚(例如,本示例中仅示出了三个地址引脚)。

图2是图示了图1的标准多主I2C系统100中所用的标准I2C总线仲裁处理200的流程图。当任何一个主设备104、106想要访问从设备108时,该主设备(例如,主设备A 104或主设备B 106)发出START命令(步骤202),然后判断该主设备是否为当前的总线主设备(步骤204)。如果是,那么该主设备使用从设备108的地址来选择所期望的从设备108(步骤206)。如果不是,那么所述处理200结束(步骤214)。如果该主设备未选择从设备108,那么接着进行检查以判断是否已经正确地选择了从设备(步骤208),并且如果不存在错误,那么执行与所选择的从设备有关的单个事务(例如,读取、写入或组合)(步骤210)。然而,如果确实发生了从设备选择错误,那么不执行上述事务。在执行了上述单个事务或不执行上述事务的任何一种情况下,发出STOP命令(步骤212),且所述处理200结束(步骤214)。

在主设备104、106中的各者同时执行这一标准I2C总线仲裁处理200的情况下,主设备104、106中的一者在与所选择的从设备有关的单个事务之前会获得对I2C总线的控制。然而,现有技术的这一仲裁处理200的显著限制是:一旦主设备变成总线主设备,那么该主设备就仅能够进行与所选择的从设备108有关的单个事务,然后当该主设备完成单个事务时,另一个主设备才可能变成总线主设备并且例如对从设备进行写入操作。问题是,如果从设备108例如是存储器,且要求执行不中断的读改写序列(read-modify-write sequence)的事务以确保例如数据一致性,那么标准I2C总线仲裁处理200是不能保证如下结果的:在原始主设备完成读改写序列的事务的所有部分前,第二主设备将不会获得对I2C总线102的控制、中断原始主设备和修改上述存储器。因此,因为系统100没有提供不中断的多事务序列,所以标准I2C总线仲裁处理200会导致数据非一致性问题。

为了更好地解释这一问题,考虑下面的两个示例性从设备访问序列。在第一示例性序列中,主设备A 104最初从等于0x01的从设备中读取数据,然后主设备A 104将数据写入等于0x02的从设备,最后主设备B 106从等于0x02的从设备中读取数据。这个第一序列带来了所期望的结果。主设备104、106都发现:所述从设备提供了一致的数据。

然而,在第二示例性序列中,主设备A 104最初从等于0x01的从设备中读取数据,然后主设备B 106从等于0x01的从设备中读取数据,最后主设备A 104将数据写入等于0x02的从设备。这个第二示例性序列导致了有问题的结果。两个主设备104、106体验到:所述从设备具有两个不同的值且因此具有非一致的数据。

本发明的实施例为了解决这种可能存在的数据非一致性问题,通过向系统100添加如下的一种能力来对标准I2C总线仲裁处理200进行了改进:该能力使得I2C总线主设备能够在防止所有其他I2C主设备执行任何干预性的I2C事务的同时执行多个、连续的I2C事务。通过为每个主设备都添加一个额外的通用输入/输出(I/O)引脚及某一软件逻辑,本发明提供了让主设备在不被其他干预性的主设备中断的情况下进行多个事务(例如,读改写事务序列)的能力。

图3描述了改进型多主I2C系统300的示例性实施例,该系统300提供了对从设备访问的互斥能力。与现有技术的标准系统100一样,本发明实施例的改进型多主I2C系统300包括使得多个主设备304、306(为了简单起见,本示例中仅示出了两个主设备)与一个或多个从设备308(为了简单起见,本示例中仅示出了一个从设备)之间能够通信的I2C总线302。需要理解的是,图3中描述的简单示例是用来更加清楚地解释本发明的特征,但是系统300中能够包括其他附加的主设备和从设备。本发明实施例的改进型多主I2C系统300除了包括标准I2C系统100的那些元件以外,还包括从系统300中的各个主设备304、306分别引出来的I/O线ADDR1和I/O线ADDR2,该I/O线ADDR1和该I/O线ADDR2分别与其他的每个主设备连接且分别与从设备308的动态地址引脚(例如,Address1、Address2)连接。这样的布置为各个主设备304、306都提供了在访问之前唯一地寻址从设备308的能力。在具有附加的主设备的系统中,将会添加与附加的主设备逐一对应的附加的I/O线。

让各个主设备304、306都具有在对从设备308进行访问时的唯一寻址能力可以通过实施下面的规则集合来予以实现,该规则集合是:I/O线ADDR1、ADDR2通常在当主设备304、306都未访问从设备308时的闲置状态下经由硬件而被保持在逻辑1;I/O线ADDR1仅能够通过在主设备A 304上执行的软件指令而被驱动至逻辑0;Address1(在I2C总线302上)仅能够通过在主设备A 304上执行的软件指令而被使用;I/O线ADDR2仅能够通过在主设备B 306上执行的软件指令而被驱动至逻辑0;且Address2(在I2C总线302上)仅能够通过在主设备B 306上执行的软件指令而被使用。下面的表格总结了该规则集合。

注意,在主设备304、306都将它们的I/O线ADDR1、ADDR2驱动得低至逻辑0的罕见情况下,从地址将会是Address0且将会仅应答于Address0,所以主设备304、306两者都不能够访问从设备308,这是因为它们将会使用I2C总线302上的非匹配地址(Address1或Address2)。这样的能力也使得本发明的实施例能够使用不具备常规I2C多主支持的主设备。也请注意,代替将I/O线在闲置状态期间保持为处于逻辑1的高电平且将I/O拉低至逻辑0以表明主设备正在访问从设备的是,系统300可供选择地可以被实施为使得逻辑0是I/O线的闲置状态值且逻辑1被用来表明主设备正在访问从设备。

下面的伪代码例子示出了主设备304、306各自将会遵循的对从设备308进行访问的协议。当主设备A 304想要访问从设备308时,主设备A304表现如下:

如果ADDR2=1,那么:/*主设备B不与从设备对话)*/

1.驱动ADDR1=0/*主设备A想要独占访问*/

2.发出START条件

3.如果主设备A变成I2C总线主设备,那么:

·通过I2C使用Address1来选择从设备

·通过I2C来访问从设备

·发出STOP条件

·对于更多事务,转到步骤2)

4.驱动ADDR1=1/*主设备A完成*/

当主设备B 306想要访问从设备308时,主设备B 306表现如下:

如果ADDR1=1,那么:/*主设备A不与从设备对话)*/

1.驱动ADDR2=0/*主设备B想要独占访问*/

2.发出START条件

3.如果主设备B变成I2C总线主设备,那么:

·通过I2C使用Address2来选择从设备

·通过I2C来访问从设备

·发出STOP条件

·对于更多事务,转到步骤2)

4.驱动ADDR2=1/*主设备B完成*/

图4至图6的流程图进一步图示了上述伪代码段中所呈现的本发明的示例性方法。需要注意的是,基于系统300的特定硬件实施方案的细节来确定重试的次数和延迟的长度。在一些实施例中,能够将延迟设定为如下的长度:这样的长度不是谐振间隔,从而避免不必要的额外重试/超时和潜在的竞争条件(race condition)。

图4描述了这样的流程图:其图示了本发明实施例的改进型I2C系统300的主设备A 304将会使用的对从设备308进行访问的示例性方法400。主设备A 304首先通过检查ADDR2是否处于逻辑1来判断另一个主设备(主设备B 306)当前是否正在访问从设备308(步骤402)。如果该系统包括了其他主设备,那么主设备A 304将会也检查其他主设备的I/O线。如果ADDR2处于逻辑1,这意味着主设备B 306不是正在访问从设备308,那么主设备A 304将ADDR1拉至逻辑0(步骤404)。这向主设备B 306表明:主设备A正在访问从设备308。然后,如图6所示和如下面所述,主设备A使用修订版的标准I2C协议经由Address1来访问从设备308(步骤406)。然后,主设备A 304检查是否有错误(步骤408),且然后,检查是否存在更多的将要进行的从设备访问(步骤410)。如果不再存在更多的与从设备308有关的事务,那么主设备A 304使ADDR1返回至逻辑1(步骤412),并且该方法结束(步骤414)。

如果在访问从设备308之后存在错误,那么主设备A 304中断访问从设备308,使ADDR1返回至逻辑1(步骤412),并且该方法结束(步骤414)。如果在初始访问(步骤406)和错误检查(步骤408)之后存在额外的将要进行的从设备访问,那么主设备A 304再次使用标准I2C协议经由Address1来访问从设备308(步骤406),且流程从此处继续。

如果当主设备A 304检查ADDR2时主设备B 306正在访问从设备308(如处于逻辑0的ADDR2所表明的情况)(步骤402),那么主设备A 304退避一个延迟时间段(步骤416),然后检查是否已经超过最大重试限制(步骤418)。如果还没有超过最大重试限制,那么主设备A 304再次检查ADDR2(步骤402),并且流程从此处继续。如果已经超过最大重试限制,那么该方法结束(步骤414)。

类似地,图5描述了这样的流程图:其图示了本发明实施例的改进型I2C系统300的主设备B 306将会使用的对从设备308进行访问的示例性方法500。主设备B 306首先通过检查I/O线ADDR1是否处于逻辑1来判断另一个主设备(主设备A 304)当前是否正在访问从设备308(步骤502)。如果该系统包括了其他主设备,那么主设备B 306将会也检查其他主设备的I/O线。如果I/O线ADDR1处于逻辑1,这意味着主设备A 304不是正在访问从设备308,那么主设备B 306将ADDR2拉至逻辑0(步骤504)。这向主设备A 304表明:主设备B 306正在访问从设备308。然后,如图6所示和如下面所述,主设备B 306使用修订版的标准I2C协议经由Address2来访问从设备308(步骤506)。然后,主设备B 306检查是否有错误(步骤508),且然后,检查是否存在更多的将要做出的从设备访问(步骤510)。如果不再存在更多的与从设备308有关的事务,那么主设备B 306使ADDR2返回到逻辑1(步骤512),并且该方法结束(步骤514)。

如果在访问从设备308之后存在错误,那么主设备B 306中断访问从设备308,使ADDR2返回至逻辑1(步骤512),并且该方法结束(步骤514)。如果在初始访问(步骤506)和错误检查(步骤508)之后存在额外的将要进行的从设备访问,那么主设备B 306再次使用标准I2C协议经由Address2来访问从设备308(步骤506),并且流程从此处继续。

如果当主设备B 306检查ADDR1时主设备A 304正在访问从设备308(如处于逻辑0的ADDR1所表明的情况)(步骤502),那么主设备B 306退避一个延迟时间段(步骤516),然后检查是否已经超过最大重试限制(步骤518)。如果还没有超过最大重试限制,那么主设备B 306再次检查ADDR1(步骤502),并且流程从此处继续。如果已经超过最大重试限制,那么该方法结束(步骤514)。

图6描述了这样的流程图:其图示了在上述的图4的方法400和图5的方法500中分别在步骤406和步骤506处调用的修订的标准I2C总线仲裁协议。需要注意的是,图6的方法600除了具有退避延迟和重试计数器及限制以外,在其他方面类似于图2的现有技术的方法200。当主设备304、306中的任何一者准备要访问从设备308时,该主设备(例如,主设备A 304或主设备B 306)发出START命令(步骤602),然后判断该主设备是否为当前的总线主设备(步骤604)。如果是,那么该总线主设备使用在调用方法400、500中所表明的从设备308的地址来选择所期望的从设备308(步骤606)。如果该主设备确实变成了当前的总线主设备且选择了从设备308,那么接着执行检查以判断是否已经正确地选择了从设备308(步骤608),并且如果不存在错误,那么执行与所选择的从设备有关的单个事务(例如,读取、写入或组合)(步骤610)。然而,如果确实发生了从设备选择错误,那么不执行上述事务。在执行了上述单个事务和不执行上述事务的任何一种情况下,发出STOP命令(步骤612),并且该处理600结束(步骤614)。

如果在步骤604处该主设备未变成当前的总线主设备,那么该主设备退避一个延迟时间段(步骤616),然后检查是否已经超过最大总线主设备重试限制(步骤618)。如果还没有超过最大总线主设备重试限制,那么该主设备发出新的START命令(步骤602),再次检查以看看该主设备是否已经变成总线主设备(步骤604),并且流程从此处继续。如果已经超过最大总线主设备重试限制,那么该方法结束(步骤614)。

前述的说明仅公开了本发明的示例性实施例。上面所公开的装置、系统及方法的落入本发明范围内的变型例对本领域的普通技术人员而言将会是显而易见的。因此,虽然已经结合示例性实施例而公开了本发明,但是应理解,其他实施例也可以落入由随附的权利要求所限定的本发明范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1