在I2C实际使用过程中,最容易出现的一个问题就是死锁 ,其主要表现为:SCL持续为高,SDA持续为低。

产生机理

I2C死锁产生的机理是:当Slave输出应答信号或者输出数据0时,Master发生异常复位,此时SCL会保持或被释放为高电平,但因为Slave没有复位,就会继续应答,保持SDA为低电平,直到SCL变为低电平;Master复位后,检测到SCL为高,SDA为低,则认为I2C总线被占用,然后一直等待总线被释放(SCL、SDA均为高);最终Master和Slave相互等待,形成I2C死锁现象。

I2C死锁问题无法从根本上避免,除了Master异常复位导致I2C死锁,Slave在正常通信过程中也有可能异常拉低SDA导致死锁。

解决方法

I2C死锁问题的解决方法主要有两种:

  1. Master检测到SDA被拉低超过一段时间后,主动复位Slave,使其释放SDA;但这种方法需要Slave有复位引脚,且Master可以控制Slave的复位引脚使之复位。

  2. Master检测到SDA被拉低超过一段时间后,推送9个Clock到SCL总线上(当死锁发生在Slave发送的第1位数据上时,最多需要9个时钟周期才能结束通讯),使Slave释放SDA为高电平。

参考资料

  1. I2C总线协议和死锁原因

  2. I2C死锁及恢复方法

I2C死锁产生机理与解决方法的更多相关文章

  1. MSSQL死锁产生原因及解决方法

    一.    什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进 ...

  2. MySQL死锁问题分析及解决方法实例详解(转)

      出处:http://www.jb51.net/article/51508.htm MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1.MySQL常用 ...

  3. Python | 多线程死锁问题的巧妙解决方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第25篇文章,我们一起来聊聊多线程开发当中死锁的问题. 死锁 死锁的原理非常简单,用一句话就可以描述完.就是当多线程 ...

  4. informix 数据库锁表分析和解决方法

    一.前言 在联机事务处理(OLTP)的数据库应用系统中,多用户.多任务的并发性是系统最重要的技术指标之一.为了提高并发性,目前大部分RDBMS都采用加锁技术.然而由于现实环境的复杂性,使用加锁技术又不 ...

  5. I2C死锁原因及解决方法(转)

    源:http://blog.csdn.net/zyboy2000/article/details/5603091 死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM ...

  6. sqlserver 死锁原因及解决方法

    其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...

  7. I2C 读取总是 0xFF,但是 ACK 是正常的解决方法

    最近要读写 24C256,没有参考网上代码,自己撸了几个小时,总是不对,读取结果总是 0xFF,但是ACK的返回都是正确的,经过一番努力,终于找到问题所在了. 在芯片规格书里面时序图只有 START ...

  8. oracle中“ORA-00060: 等待资源时检测到死锁” 或存储过程编译卡死 解决方法

    之前在调试存储过程时,出现卡死情况,无法插入数据 解决方法 1.查看那些表被锁住: --1.查看那些表被锁住--- select b.owner,b.object_name,a.session_id, ...

  9. sqlserver2008 死锁解决方法及性能优化方法

    sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Serv ...

  10. SqlServer表死锁的解决方法

    SqlServer表死锁的解决方法   前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉.本文表锁住了的解决方法 ...

随机推荐

  1. Java Cache系列之Cache概述和Simple Cache

    前记:最近公司在做的项目完全基于Cache(Gemfire)构建了一个类数据库的系统,自己做的一个小项目里用过Guava的Cache,以前做过的项目中使用过EHCache,既然和Cache那么有缘,那 ...

  2. 我是如何从0开始,在23天里完成一款Android游戏开发的 – Part 1 – 开篇与前2天

    本文由 ImportNew - ImportNew读者 翻译自 bigosaur.如需转载本文,请先参见文章末尾处的转载要求. 本文是这个系列的第一篇文章,记录作者的开篇和前2天的情况.文章由 朱新亮 ...

  3. docker之网络与数据管理

    docker默认使用bridge(单主机互联)和overlay(可跨主机互联)两种网络驱动来进行容器的网络管理.如需要,还可以自定义网络驱动插件进行docker容器的网络管理. 1.docker默认网 ...

  4. manim边做边学--圆柱体

    Cylinder是Manim中用于创建圆柱体对象的类. Cylinder类在制作数学.物理或工程领域的动画时,可用于以下的场景中: 演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方 ...

  5. ant 表格中的分页属性

    组件中添加 属性 :pagination="paginationProps" 定义paginationprops const paginationProps = reactive( ...

  6. Linux 上使用Systemd 来进程守护Net应用

    Systemd Service 的方式,用于在 Linux 系统上管理和运行服务.Systemd 是一个系统和服务管理器,可以自动化和简化 Linux 系统的管理和维护,包括启动.停止和管理后台服务. ...

  7. 数据分层 ODS DW DM层级

    在数据仓库的设计过程中,数据分层是一种重要的组织方式,能够提高数据处理效率和数据质量.数据分层通常包括原始数据(Operational Data Store,ODS).明细数据(Data Wareho ...

  8. openEuler创建和root一样的账号

    1. 使用以下命令在 openEuler 操作系统的 root 用户下创建管理员用户: useradd -m -G root admin -m 表示创建用户的同时创建用户的主目录, -G 表示将用户添 ...

  9. Centos中keytool不起作用的解决方法

    ​keytool是Java开发中用于管理密钥和证书的工具,可以用于生成密钥.创建证书请求.导入和导出证书等操作.你可以在Oracle官网上下载和安装JDK,然后在JDK的 bin目录下找到 keyto ...

  10. vscode使用github

    1, vscode打开terminal,生成RSA密钥,并查看蜜月 PS D:\code\SQL> git init Reinitialized existing Git repository ...