0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C基本用法,硬件问题汇总

5RJg_mcuworld 来源:嵌入式资讯精选 2019-11-27 15:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一般情况下,I2C设备焊接没什么问题,按照设备手册一步步来,基本上就顺风顺水能够用起来。如果这么一个简单的东西,有时候想要的结果死活不出来,反复的检查问题的原因,查询解决办法,核查设备的数据手册,甚至发送和接收的每一条命令与数据都知道是什么意思,仍然无法解决问题,那该怎么办呢?

本文主要针对I2C设备,讲解如何解决I2C设备主机与从机直接无法正常数据交互的问题,侧重点是针对硬件设计不太合理、I2C设备设计不标准导致总线故障的情况,并且通过分析现象,提出解决方案。对于在设备初始化中,没有设置相应的寄存器或者发送命令,而导致的无法获取想要的数据情况,不作详细介绍。

1 I2C基本用法

I2C总线是一种简单、双向二线制同步串行总线。所有主机在 SCL 线上产生它们自己的时钟来传输总线上的报文,SDA 线传输每个字节必须为 8 位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位。在空闲状态时,SCL 与 SDA 均为高电平。

通常一些低功耗I2C设备,芯片引脚使用上拉输出即可满足与其正常数据交互,还有一些I2C设备,则需要在总线上外加一个上拉电阻,此时相应的 I/O 配置成开漏输出,其他的按照芯片手册进行标准配置。

2 硬件问题汇总

2.1无法正常拉高拉低引脚

首先确定 SDA 与SCL 引脚能够被拉高、拉低,检测方式直接软件控制 I/O 口输出引脚低电平/高电平,测量引脚电压是否能够随着芯片引脚的设置输出相应的状态。

如果不能被拉低,检测虚焊、上拉电阻断开、I2C设备是否正常、芯片引脚是否损坏等问题,确保能够正常被拉高或者拉低。

2.2电气特性无法满足

如果正常拉高、拉低的情况下,依然无法正常读取数据。通常建议,根据负载电流更换小阻值的电阻。

如果需要详细知道原因,就具体查询I2C设备电气特性。大多数I2C设备电气特性,大致下图所示

通常这块内容在I2C设备电气特性这一块,主要讲解电平拉高拉低的最长时间、最短时间,以及处于高电平与电平的阈值与持续时间等等内容。

硬件设计,为了降低单片机的功耗与保护芯片引脚,在满足负载电流和负载电容相关要求的前提下,阻值设置通常比较大。如果同一个总线上挂载多个I2C设备, 即使在 I/O口配置正确的前提下,也会导致驱动能力不足。

现象是拉高电压不足,在拉高、拉低过程中消耗时间过长。这两个问题通常还引起数据线与时钟线:拉高时,高电压持续时间过短;拉低时,低电压持续时间过短。用示波器抓取图形:从波形上看,显示是尖波、斜波、杂波等不符合I2C设备电气特性的波形;从数据上看,数据线高电平持续时间过小 ,上升沿时间过长 ,下降沿时间过长等等数据超出设备电气特性的有效值。典型杂波图,如下所示

如果出现此类异常,建议更换小一点的电阻,用来增强总线驱动能力,提高电平转换速度。应当注意的是每个MCU的耐受电流不一样,减小电阻应避免超过相应引脚承受电流的最大值。

3 SDA 死锁

如果I2C设备的数据偶尔能够正确获取,但是仍然会在总线发送数据或者命令的时候,爆出总线读写错误,那么有可能遇到下面的死锁问题,死锁时候,就是数据线被拉低,主机无法拉高。死锁一般发生在从机上,且为数据线死锁。因为I2C总线是共享的,如果需要确定,是否是从机死锁,可以参照下面两幅图,串联电阻进行测试

如上图所示,如果从机死锁,即从机拉低电平,此时检测到的电压为1/3 Vcc。

如上图所示,如果主机死锁,即主机拉低电平,此时检测到的电压为 1/11 Vcc。依据这个原理,可以准确判定死锁的具体位置,多个传感器依据类似方式进行定位。

3.1 反复重启导致死锁

3.1.1 现象

如果设备需要反复重启,很有可能在从机设备返回数据的时候,SDA被锁住。具体原因是从机设备在回数据,还没有发送完成,主机时钟消失,从机等待时钟信号, MCU重启,如果从机设备的电源没有复位,从机继续等待 MCU 时钟信号,数据一直被钳住,总线无法完成数据交互。

3.1.2 解决方式

解决重启导致总线死锁,一种方式可以如同 rt-thread 驱动解决方式一样,在系统复位的时候,提供9个时钟信号,解初总线死锁;另一种是在按下复位键初始化的时候,给从机设备电源断电重启,这个需要引脚控制。

3.1.3 9 个时钟信号

I2C设备进行读写操作的过程中,在从机钳住总线的期间,MCU 异常复位,会导致 SDA 死锁,异常产生出现在俩个阶段:从机响应阶段、从机发送数据阶段。下面将针对这两种异常,对时钟信号进行解释,并且总结其他原因,得出结论。

(a) 从机响应阶段

MCU 在开始信号后发送地址,得到从机设备响应,准备开始返回数据,在这个时候,从机将 SDA 信号拉为低电平,如果 MCU 异常复位,会导致总线上 SCL 停止发送时钟信号,从机等待 MCU 的时钟信号,产生钳住并且拉低 SDA 的现象。如果想要解锁 SDA,从机需要 9 个时钟信号,使得从机完成响应,释放 SDA 。

(b) 从机发送数据阶段

如果从机响应完成了,开始给MCU返回数据。这个数据有八位,每一位都有可能为低,如果在数据低位,MCU异常复位,停止发送时钟信号,从机就会等待 MCU的时钟信号,产生钳住并且拉低SDA的现象。如果想要解锁SDA,从机需要 1-8个时钟信号,使得从机完成数据响应,释放 SDA 。

(c)其他情况

在从机一个8位数据发送完成后,等待MCU响应, 即使属于MCU的,从机不再钳住 SDA,没有时钟,数据交互停止。

在主机发送数据阶段,总线所有权在主机,主机异常,数据交互停止,总线释放。所以,这些情况下,不存在SDA死锁的情况。

(d)结论

综上所述,解锁SDA从机最多需要 9 个时钟信号,也就是异常复位后,MCU至少发送需要9个时钟信号,完成 i2c 总线的SDA解锁。所以,RT_Thread 为了避免此类问题的产生,在i2c驱动初始化,对总线进行判断,判断是否需要解锁,如果需要,就进行解锁,确保 i2c设备不会因为这个问题导致数据交互失败。

3.2 多个I2C设备导致死锁

多I2C设备除了异常复位导致死锁,还会形成相互干扰的问题,一般情况下,不会把同种从机地址挂在同一条总线上,但除此之外,有些I2C设备设计不是按照标准的I2C总线协议设计,在I2C总线共享的前提条件下,有的设备只要总线上从机地址就会有响应。这样由于从机的错误响应,使得各个I2C总线异常,甚至钳住总线,导致 I2C总线进人一种死锁状态。

解决方式,这样的不标准i2c设备,单独使用一个总线,避免干扰,或者单独一个独立引脚,控制电源。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    463

    文章

    54414

    浏览量

    469200
  • I2C总线
    +关注

    关注

    8

    文章

    422

    浏览量

    63492
  • SCL
    SCL
    +关注

    关注

    1

    文章

    244

    浏览量

    18067

原文标题:“I2C”的那些坑,如何迈过去?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK平台I2C开发:从硬件原理到实战排查

    在嵌入式开发中,I2C 总线是连接外设的 “桥梁”—— 小到传感器、EEPROM,大到 LCD 驱动器、音频芯片,都离不开它的控制。而瑞芯微(Rockchip)系列芯片作为主流嵌入式方案,其 I2C 控制器的开发是很多工程师的必备技能。
    的头像 发表于 02-05 13:42 2400次阅读
    RK平台<b class='flag-5'>I2C</b>开发:从<b class='flag-5'>硬件</b>原理到实战排查

    I2C 为什么只要两根线就能搞定通信?

    到目前为止,我们已经讨论了SPI通信和UART通信的基础知识,现在让我们讨论本系列的最后一个协议,即集成电路间协议(I2C)。如果您曾经构建过使用OLED显示器、气压传感器或陀螺仪/加速度计模块
    的头像 发表于 01-04 09:14 2048次阅读
    <b class='flag-5'>I2C</b> 为什么只要两根线就能搞定通信?

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的头像 发表于 12-26 09:48 5938次阅读
    基于FPGA的<b class='flag-5'>I2C</b>控制模块设计

    AS32X601的I2C模块操作EEPROM详解

    国科安芯推出的AS32X601系列MCU芯片内置的I2C模块提供了符合工业标准的两线串行制接口,可用于MCU和外部I2C设备的通讯。I2C总线使用两条串行线:串行数据线SDA和串行时钟线SCL
    的头像 发表于 12-21 21:39 1583次阅读
    AS32X601的<b class='flag-5'>I2C</b>模块操作EEPROM详解

    I2C死锁的问题

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。 在I2C主设备进行读写操作的过程中,主设备在开始信
    发表于 12-04 06:00

    SPI、I2CI2S、UART:通信协议解释

    , SCLK, CS) 全双工、主从 高速(可达几十 MHz) Flash、传感器、显示屏 硬件简单、速率高,但线多,扩展性差 I2C Int
    的头像 发表于 11-18 10:53 711次阅读

    深入剖析I2C协议

    I2C是由Philips开发的简单的双向两线总线,在深入浅出理解SPI协议中,我们区分了单工,半双工,全双工协议数据流向的区别,根据特征,I2C协议属于半双工协议(即同一时刻,数据单向流动)。此外
    的头像 发表于 08-21 15:10 3877次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    I2C总线通信,为什么要进行电气隔离?

    I2C总线采用双向二线制,支持多主机多从机通信,具备高可靠性、抗干扰能力强,广泛应用于嵌入式系统中。
    的头像 发表于 08-11 11:04 2662次阅读
    <b class='flag-5'>I2C</b>总线通信,为什么要进行电气隔离?

    第十八章 I2C通信测试

    本章介绍了I2C协议,其物理层用SDA和SCL双线,支持多设备:协议层含起始/停止信号、应答机制等。还讲解W55MH32的I2C外设及初始化,并进行了通信测试代码的分析。
    的头像 发表于 06-19 17:07 1465次阅读
    第十八章 <b class='flag-5'>I2C</b>通信测试

    STM32H7CubeMX配置硬件I2C,读写失败是什么问题呀?

    STM32H7CubeMX配置硬件I2C,读写失败什么问题呀,同样的操作F4和F1都能正常使用,应该不存在i2c地址错误,操作都是一样的,但H7就是用不了。I2C_WaitOnFlag
    发表于 06-12 06:21

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 06-09 06:22

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 06-05 08:17

    SPC574s如何使用SPC5Studio自带的I2C库实现I2C通信?

    SPC574s并没有硬件I2C外设,可以使用SPC5Studio自带的SW I2C库来实现,但是由于SPC5Studio软件资料太少,I2C一直没有数据,各位有相关的资料吗?
    发表于 05-14 07:10

    简单了解I2C接口

    在电子电路的复杂世界里,各种电路模块设备需要相互通信才能协同工作 ,I2C接口就像是电路模块设备间的沟通桥梁,今天就带大家深入了解它。
    的头像 发表于 05-08 14:15 2816次阅读
    简单了解<b class='flag-5'>I2C</b>接口

    基于RT-Thread的I2C(软件) 实践 | 技术集结

    一、软硬件介绍(一)I2C(软件)I2C是一种广泛应用于嵌入式系统中的短距离串行通信协议,支持多主多从设备模式,主机通过时钟信号SCL和数据线SDA与从机进行数据交互。在RT-Thread操作系统中
    的头像 发表于 05-06 18:44 1216次阅读
    基于RT-Thread的<b class='flag-5'>I2C</b>(软件) 实践 | 技术集结