一种防止i2c读写错误的方法

文档序号:6432415阅读:381来源:国知局
专利名称:一种防止i2c读写错误的方法
技术领域
本发明涉及一种防止I2C读写错误的方法,特别是涉及一种防止I2C握手失败的方法。
背景技术
2C协议规定,在数据传输过程中,如果从设备要完成一些其他功能后才能接收或发送下一个完整的数据字节,此时从设备可以通过一个握手协议强行将时钟线SCL拉低, 迫使主机进入等待状态,当从设备准备好接收或发送下一个数据字节并释放SCL后,数据传输继续。当从设备强行拉低SCL时,理论上说应该把SCL拉到一个稳定的低电平,但是当 I2C接口为推挽方式时,如果总线上有串联电阻或设备I2C内部设计有保护电阻时,SCL可能会被拉到一个中间电平,驱动电流越大。中间电平会影响时钟SCL的低电平判断,很可能会导致握手失败,从而造成时钟不同步,影响总线的数据传输,甚至使数据传输出错。本发明的意图就是解决类似这种握手过程中CLK被拉到一个中间电平,进而影响握手,造成时钟不同步的问题。从而保证I2C总线数据传输的稳定性、可靠性。众所周知,I2C总线是PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线是微电子通信控制领域广泛采用的一种总线标准,具有接口线少,控制方式简单,器件封装小,通信速率较高等优点。正因为I2C总线的这些优点,现在越来越多的外围设备都采用I2C控制方式。正是由于外围I2C设备多,通常一个I2C总线上会挂接几个I2C设备。I2C协议虽然支持一个总线上挂接多个设备,但是其数量也要受到总线最大电容400pF的限制,因此有时在HOST端I2C接口有限的情况下,不得不用GPIO模拟I2C 的方式。我们知道,I2C总线一般都是开漏输出,因此可以保证高低电平的稳定。但是当使用GPIO模拟I2C时,有时只能采用推挽输出方式,这时,由于总线上串联电阻或设备I2C内部保护电阻的存在,就会出现图一的问题。从SCL波形看虽然影响到CLK低电平的判断,但还没有影响到数据的传输。有时甚至会直接影响数据传输。

发明内容
本发明的目的在于克服现有技术的不足,提供一种防止I2C读写错误的方法,保证I2C总线数据传输的稳定性,可靠性,且结构简单,易于实现。为了达到上述目的,本发明采用的技术方案是,一种防止I2C读写错误的方法,其步骤如下
步骤1、确定I2C速率,确定时钟周期T ; 步骤2、将高电平与低电平时钟的持续时间均设定为T/2 ; 步骤3、产生高电平与低电平时钟信号; 步骤4、判断SCL总线为高电平或低电平;
步骤5、SCL总线为高电平,则将GPIO配置为input no pull模式;SCL总线为低电平, 则将GPIO配置为push-pull模式;
3步骤6、判断时钟信号的高电平是否被设备拉低;
步骤7、被设备拉低则使时钟信号停止,达成与设备握手,直到设备释放时钟信号的下拉,使得时钟信号上产生高电平; 步骤8、时钟信号与设备同步。所述的input no pull模式为GPIO输入模式;所述的push-pull模式为推挽模式。与现有技术相比,本发明的有益效果是保证I2C总线数据传输的稳定性,可靠性,且结构简单,易于实现。


图1为本发明的方法流程图; 图2为本发明的具体实施图3为从设备强制拉低SCL时握手过程的流程图; 图4为本发明的标准的I2C总线结构图; 图5为本发明的主机端为推挽方式的I2C总线结构图; 图6为本发明的实际使用中主机端为推挽方式的I2C总线结构图。
具体实施例方式下面结合实施例参照附图进行详细说明,以便对本发明的技术特征及优点进行更深入的诠释。图4所示的是标准的I2C总线结构,可见主机和设备的内部都是开漏输出,这样就可以保证高低状态的稳定。然而实际使用中,有时我们不得不用推挽方式,例如用软件模拟 I2C时,其内部结构如图5所示。可见此时主机端是推挽方式的,而设备端是开漏方式的。由于推挽方式驱动时,总线上会有较大的驱动电流产生,同时,一般出于降噪的考虑会在I2C 总线上串小电阻(0-300欧),现在很多的I2C器件在芯片内部出于保护芯片的考虑也会串一个小电阻。因此实际使用中的I2C总线结构如图6所示。如图6所示,一种I2C总线电路结构,包括I2C总线及通过I2C总线连接的主机和设备,I2C总线为串行数据线SDA及串行时钟线SCL,串行数据线SDA上串联有电阻R1,且通过上拉电阻R3连接电源VDD,串行时钟线SCL上串联有电阻R2,且通过上拉电阻R4连接电源VDD,所述的主机为推挽输出结构,设备为开漏输出结构。主机与串行时钟线SCL相连的推挽输出结构的场效应管为Ql、Q2,主机与串行数据线SDA相连的推挽输出结构的场效应管为Q3、Q4,Ql与Q2、Q3与Q4分别为一对放大性能相同、导电极性相反的场效应管。在场效应管Ql的源极串联一电阻R5后接电源VDD,场效应管Q2的源极接地,场效应管Q1、Q2的漏极相互连接并组成推挽输出;在场效应管Q3的源极串联一电阻R6后接电源VDD,场效应管Q4的源极接地,场效应管Q3、Q4的漏极相互连接组成推挽输出。电阻R5与R6的阻值相等,设置为R。设备与串行时钟线SCL相连的开漏输出结构的场效应管为Q5,Q5的源极串联一电阻R7后接地;设备与串行数据线SDA相连的开漏输出结构的场效应管为Q6,Q6的源极串联一电阻R8后接地,电阻R7与R8的阻值相等,设置为Rs,场效应管Q5、Q6的漏极输出。
设总线驱动电流为I,SCL总线上串联电阻R2两端的电压分别为U1、U2,近似的计算出Ul,U2
Ul= (Rs+R2)*I ;U2=Rs*I 推挽输出时,I2C总线上会产生比较大的驱动电流,I近似等于VDD除以总线上的电阻, 场效应管的导通电阻很小,电阻R1、R2、器件内部的保护电阻R5、R6、R7、R8都是小电阻。假设VDD是1. 8V,线上总电阻为225欧,可算得总线上电流可达8ma,假设Rs为60欧R2为 100欧,通过上面的公式可近似得到Ul= (60+100) *8ma=U80mV,此时必然会导致握手失败, 进而会造成时钟数据不同步,使得数据传输错误。由此可见,导致SCL被拉到一个中间电平的原因在于两点一是推挽方式时总线上有较大的驱动电流;二是总线上靠近设备有串联电阻,包括内部保护电阻。本发明的方法流程图如图1所示,一种防止I2C读写错误的方法,其步骤如下 步骤1、确定I2C速率,确定时钟周期T ;
步骤2、将高电平与低电平时钟的持续时间均设定为T/2 ; 步骤3、产生高电平与低电平时钟信号; 步骤4、判断SCL总线为高电平或低电平;
步骤5、SCL总线为高电平,则将GPIO配置为input no pull模式;SCL总线为低电平, 则将GPIO配置为push-pull模式;
步骤6、判断时钟信号的高电平是否被设备拉低;
步骤7、被设备拉低则使时钟信号停止,达成与设备握手,直到设备释放时钟信号的下拉,使得时钟信号上产生高电平; 步骤8、时钟信号与设备同步。所述的input no pull模式为GPIO输入模式;所述的push-pull模式为推挽模式。本发明的具体实施图如图2所示,在push-pull方式下输出低电平T/2后,将GPIO 转换为input no pull模式,此时,由于外部上拉的存在,SCL会被拉为高电平,且此时GPIO 是输入状态,host可以检测到该高电平状态,持续T/2,再转换状态,产生低电平,依此类推。本发明的推挽输出流程图如图3所示,假设CLK在第二个高电平时被device强行拉低,从图示上可以看出,拉低时GPIO配置状态已经由push-pull转换成input no pull, 此时的GPIO作为输入引脚,对于正常的时钟信号来说,在这个阶段检测到的仍然是高电平,可以继续计时直到高电平计时结束再进入Push-pull的状态,但是当从设备拉低elk信号时,此时检测到的是低电平,软件上可以通过一定方式的处理,使得时钟信号停止,达成与从设备的握手,直到从设备释放elk信号的下拉,使得elk总线上产生高电平,此时GPIO 作为输入检测到CLK高的状态,继续按前面所述的方式产生时钟以使得从设备同步。由于, 在握手的过程中,GPIO是input no pull的,因此,此时总线上只有很微弱的电流,可忽略不计,这样便破坏了问题产生的第一个条件,所以,此时CLK不会被拉到一个中间电平。本发明的具体实现方式为当SCL总线要输出低电平时,将主机的GPIO配置为推挽输出,当SCL总线为高电平时,将主机的GPIO配置为GPIO输入模式,此时总线被外部上拉拉到一个稳定的高电平。在实际的应用中,当I2C的速率确定后,其时钟周期T确定,因
5此将高低时钟的持续时间均设定为T/2,产生一定时间的高低时钟信号,即产生一定周期的时钟。将信号的正半周和负半周分别有两个场效应管来完成,当信号正半周到来时,由一个场效应管完成放大,当负半周到来时,又由另一个场效应管完成放大,放大完后,最后合成一个完整的信号。保证I2C总线数据传输的稳定性,可靠性,且结构简单,易于实现。
以上所述仅为本发明的较佳实施例,凡依本发明权利要求范围所做的均等变化与修饰,皆应属本发明权利要求的涵盖范围。
权利要求
1.一种防止I2C读写错误的方法,其步骤如下 步骤1、确定I2C速率,确定时钟周期T ;步骤2、将高电平与低电平时钟的持续时间均设定为T/2 ; 步骤3、产生高电平与低电平时钟信号; 步骤4、判断SCL总线为高电平或低电平;步骤5、SCL总线为高电平,则将GPIO配置为input no pull模式;SCL总线为低电平, 则将GPIO配置为push-pull模式;步骤6、判断时钟信号的高电平是否被设备拉低;步骤7、被设备拉低则使时钟信号停止,达成与设备握手,直到设备释放时钟信号的下拉,使得时钟信号上产生高电平; 步骤8、时钟信号与设备同步。
2.根据权利要求1所述的防止I2C读写错误的方法,其特征在于所述的inputno pull模式为GPIO输入模式;所述的push-pull模式为推挽模式。
全文摘要
本发明公开了一种防止I2C读写错误的方法,其步骤如下步骤1、确定I2C速率,确定时钟周期T;步骤2、将高电平与低电平时钟的持续时间均设定为T/2;步骤3、产生高电平与低电平时钟信号;步骤4、判断SCL总线为高电平或低电平;步骤5、SCL总线为高电平,则将GPIO配置为inputnopull模式;SCL总线为低电平,则将GPIO配置为push-pull模式;步骤6、判断时钟信号的高电平是否被设备拉低;步骤7、被设备拉低则使时钟信号停止,达成与设备握手,直到设备释放时钟信号的下拉,使得时钟信号上产生高电平;步骤8、时钟信号与设备同步。本发明保证I2C总线数据传输的稳定性,可靠性,且结构简单,易于实现。
文档编号G06F13/42GK102298564SQ20111026026
公开日2011年12月28日 申请日期2011年9月5日 优先权日2011年9月5日
发明者曾元清 申请人:广东欧珀移动通信有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1