再谈I2C,硬件问题汇总及死锁解决办法
面包板社区 2020-08-14

一般情况下, 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设备,单独使用一个总线,避免干扰,或者单独一个独立引脚,控制电源。


来源:RT-Thread

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
热门推荐
  • 相关技术文库
  • 工业
  • 安防
  • 航空
  • CAN
  • 运动控制T型曲线速度规划的matlab、 C语言实现

    ★ 本文介绍了运动控制中常用的梯形速度曲线规划的原理和程序实现,最后给出了测试结果; ” 1 前言 2 理论分析 3 matlab 实现 4 测试结果 5 C语言实现 6 总结 1 前言 在伺服系统以及控制系统的加减速动作中,为了让速度更加平滑,可以引入T型速度曲线规划(T

    03-31
  • CAN总线和RS485总线应用概述

    CAN总线和RS485总线的定义 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为

    03-30
  • 传感器这么多种,你都知道怎么工作的吗

    布料张力测量及控制原理 ▼ 直滑式电位器控制气缸活塞行程 ▼ 压阻式传感器测量液位的工作原理 ▼ MQN型气敏电阻结构及测量电路 ▼ 气泡式水平仪的工作原理 ▼ 扩散硅式压力传感器 ▼ 应变加速度感应器 ▼ 称重式料位计 ▼ 电子皮带秤重示意图 ▼ 电子吊车秤

    03-26
  • 一文看懂I2C(FPGA实测I2C波形)

    据非官方统计,90%电子行业的公众号都介绍过3种串行通讯协议:UART、SPI和I2C。这3种串行协议也是电子开发行业最常用的协议。前面介绍了 及其 , 。本篇文章介绍I2C通讯协议及其FPGA实测波形。 文末有【I2C官方标准文档下载方法】。 有哪些内容 I2C是什么 5种

    03-25
  • 红电线,黄电线,绿电线,各种颜色电线都代表什么?

    1、依导线颜色标志电路 黑色——装置和设备的内部布线。 棕色——直流电路的正极。 红色——三相电路的C相; 半导体三极管的集电极; 半导体二极管、整流二极管或可控硅管的阴极。 黄色——三相电路的A相; 半导体三极管的基极; 可控硅管和双向可控硅管的控

    03-26
  • 总线隔离后接地出现通讯异常该如何改善?

    在已为大家介绍隔离后接地的ESD作用机理,那么面对总线隔离后由于接地而出现的通讯异常问题该如何改善,本文将为大家介绍对应的改善措施以及电路作用详解。    前言 为保证总线网络的通讯稳定性,通讯接口通常会做隔离,隔离的主要目的: 安规考虑:保护设备

    03-19
  • 常用的电气电路图集

    1 单相照明双路互备自投供电电路 2 双路三相电源自投电路 3 茶炉水加热自动控制电路 4 简单的温度控制器电路 5 简易晶闸管温度自动控制电路 6 用双向晶闸管控制温度电路 7 XCT-101动圈式温度调节仪控温电路 8 电接点压力式温度表控温电路 9 TDA-8601型温度指

    03-08
  • 常见CAN总线干扰现象

    CAN总线由其高可靠和实时性被广泛应用于新能源汽车、轨道交通、医疗、工程机械等行业,但是由于大部分行业工作环境都比较恶劣,所以提高总线抗干扰能力是目前行业用户最为关注的方向。   常见CAN总线干扰现象 如下为一条流水线有两路CAN总线,一条总线有22个

    03-11
  • 电气专业学生,更好地出路在哪里?

    注 | 文末免费领万用表 知乎有人问: 题主目前华电在读大二学生,家里无电力背景,大二上靠专业成绩成功转入王牌专业电气自动化,满心欢喜的期待着好好学习保研毕业后进国网…… 最近在知乎上了解到,国网公司并没有想象中那么光鲜,非电力子弟在国网的生活更

    03-02
  • RS-485总线知识:什么情况下需要加上下拉电阻?

    RS-485总线广泛应用于通信、工业自动化等领域,在实际应用中,通常会遇到是否需要加上下拉电阻以及加多大的电阻合适的问题,下面我们将对这些问题进行详细的分析。 一、为什么需要加上下拉电阻? 1)当485总线差分电压大于+200mV时,485收发器输出高电平。 2

    02-23
  • SPI协议,4线制还是3线制?

    有哪些内容? SPI协议简介 4线还是3线? 4种工作模式 多种传输速率 SPI协议的时序 SPI协议的升级版 FPGA实现SPI协议 SPI和IIC的对比 总结 SPI协议简介 板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI,之前写过及其,今天我们来介绍SPI协议,SPI

    02-22
  • RS485总线典型电路介绍

    什么是RS485通讯? RS485总线是一种常见的串行总线标准,采用平衡发送与差分接收的方式,因此具有抑制共模干扰的能力。在一些要求通信距离为几十米到上千米的时候,RS485总线是一种应用最为广泛的总线。而且在多节点的工作系统中也有着广泛的应用。 RS485总线

    03-11
下载排行榜
更多
广告
X
广告