首页 > 其他分享 >I2C死锁产生机理与解决方法

I2C死锁产生机理与解决方法

时间:2023-08-03 12:45:02浏览次数:37  
标签:Slave 复位 机理 死锁 Master SDA I2C

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

产生机理

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

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死锁及恢复方法

标签:Slave,复位,机理,死锁,Master,SDA,I2C
From: https://www.cnblogs.com/wcat/p/17602998.html

相关文章

  • #yyds干货盘点#什么是死锁以及如何解决死锁
    死锁是指两个或多个线程在互相等待对方释放锁的状态,从而导致程序无法继续执行的情况。在Java多线程中,死锁通常是由于以下四种情况的组合所导致的:互斥:多个线程竞争同一资源(如锁),每次只能有一个线程占用,其他线程必须等待。占有且等待:线程在持有锁的同时,等待其他线程持有的锁。不可抢占......
  • MySQL加锁逻辑与死锁
    RC级别:create table t1(id int primary key, name varchar(30));insert into t1 values(1, 'a'),(4, 'c'),(7, 'b'),(10, 'a'),(20, 'd'),(30, 'b');commit;案例一--sess1           --sess2begin;              ......
  • RR 死锁一侧
    CREATE TABLE `t8` (  `id` bigint(20) NOT NULL AUTO_INCREMENT,  `d_id` varchar(40) NOT NULL DEFAULT '',  `b_id` varchar(40) NOT NULL DEFAULT '',  `is_dropped` tinyint(1) NOT NULL DEFAULT '0',  `u_c` varchar(10) NOT NULL DEFA......
  • 编写设备驱动之i2c_client -10
    编写设备驱动之i2c_client参考资料:Linux内核文档:Documentation\i2c\instantiating-devices.rstDocumentation\i2c\writing-clients.rstLinux内核驱动程序示例:drivers/eeprom/at24.c本节代码:GIT仓库中IMX6ULL\source\04_I2C\03_ap3216c_okSTM32MP15......
  • 编写设备驱动之i2c_driver -9
    参考资料:Linux内核文档:Documentation\i2c\instantiating-devices.rstDocumentation\i2c\writing-clients.rstLinux内核驱动程序示例:drivers/eeprom/at24.c本节代码:GIT仓库中框架:IMX6ULL\source\04_I2C\02_i2c_driver_exampleSTM32MP157\source\A......
  • 通用驱动i2c-dev分析
    参考资料:Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24cxx.pdf1.回顾字符设备驱动程序怎么编写字符设备驱动程序?确定主设备号创建file_operations结构体在里面填充drv_open/dr......
  • 用于查找 SQL Server 中死锁的 T-SQL 查询
    用于查找SQLServer中死锁的T-SQL查询 早些时候,我写了一篇关于使用扩展事件来查找SQLServer上发生的死锁的文章。扩展事件对于跟踪服务器上短时间内发生的死锁有很大帮助,尤其是在生产环境中。然而,在开发环境中,我遇到过当多个开发人员尝试对表执行dml语句时出现持续长......
  • 死锁
    1importthreading234#全局变量5g_num=0678#对g_num进行加操作9defsum_num1():10#上锁11print("sun_num1...")12print(f"sum_num1id(mutex){id(mutex)}")13mutex.acquire()1415foriinrange(100......
  • MySql —— 死锁场景
    参考:小林coding: https://xiaolincoding.com/mysql/lock/deadlock.html出世&入世:https://blog.csdn.net/weixin_54828627/article/details/129379140 死锁的四个必要条件:互斥占有且等待不可强占用循环等待一、批量更新/删除数据-同时加锁记录多InnoDB是边扫描边加锁......
  • Linux下的I2C驱动
    1.Linux中I2C需要编写的驱动......