I2C电平半高问题详解

最近遇到了I2C半高电平的问题,简单来说就是推挽模式输出强高电平+主机没有发送NACK导致的,想直接看问题解答请跳转至本文最后一小节。

I2C介绍

I2C是一个半双工、多主从的串行总线,仅由两条线就能完成多机通信,一条SCL时钟线,一条双向数据线SDA。本文只讨论一主多从的情况。

严格来说,I2C总线要求每个设备SCL、SDA都是开漏模式。但在我们的应用场景下,MCU总是作为主机来与其他从设备通信,SCL一直在MCU的控制之下;在这种情况下,仅要求SDA为开漏模式。

下图很明晰地展示了I2C的通信原理,高电平由外部上拉电阻产生,而串联在总线上的每一个设备都可以拉低其电平,因此主从设备需要按照一定的时序进行通信。

I2C时序

起始信号和停止信号

空闲状态时,SCL和SDA线会由于外部上拉电阻处于高电平状态。I2C规定数据不允许在SCL为高时变化,如果SCL为高时SDA发生改变,那么这种信号就是起始信号和停止信号。

  • 起始信号:SCL保持高电平,SDA由高向低跳变。

  • 停止信号:SCL保持高电平,SDA由低向高跳变。

  • 重启信号:即本该是停止信号的地方给起始信号,就会重新开始一个周期。

字节传送

每个字节为8bit,数据传送时,先传送最高位,后传送低位。在SCL为高时数据保持稳定。每发送一个字节后接收方必须发送一位应答位,即一帧共有9位。

ACK与NACK

在每8bit的数据传输完成后,主机或从机需要对接收到的数据做出反应,所以第9个bit位就是应答位,放置应答信号(ACK)或非应答信号(NACK)。其中应答信号就是希望对方继续发送数据,非应答信号就是希望对方停止发送数据。

  • 应答信号(ACK):电平为低

  • 非应答信号(NACK):电平为高

写与读

在此仅讨论向从机写一个字节和读一个字节数据的情况。

  • 写时序:开始信号 --> 7位从机地址 + 写位(0) --> 应答信号 --> 写地址 --> 应答信号 --> 八位数据 --> 停止信号

  • 读时序:开始信号 --> 7位从机地址 + 写位(0) --> 应答信号 --> 写地址 --> 应答信号 --> 重启信号 -->

    7位从机地址 + 读位(1) --> 应答信号 --> 八位数据(由从机写入) --> 应答位(1,由主机应答) --> 停止信号

I2C半高电平问题解答

在开发中遇到读从机同一地址多次值却不同的问题,经查看波形发现SDA电平半高现象,并且大多出现在读周期。最终解决方案如下:

  • 使用推挽模式模拟IIC,MCU不主动输出高电平

  • 在读完8个bit位后主机给出NACK信号

半高电平出现的原因毫无疑问是主机与从机进行了争抢,如果是开漏状态下争抢只会造成电平为低而不是半高(一低俱低),因此“半高”的罪魁祸首是推挽模式输出的强高电平,即使从机拉也拉不下去,导致了半高电平的出现。因此,如果要使用推挽模拟IIC输出,就不能在SDA输出高电平,高电平也需要依靠外部上拉电阻。

而争抢出现的原因是由于读的时候,从机发送完一个字节并没有收到主机的NACK信号,即应答位为低,由于是ACK信号,IIC时序要求从机继续发送,而该从设备因为程序或是寄存器原因,继续发送的数据为全0,导致主机也无法拉高SDA。所以主机应当在读完数据后给出正确的非应答信号以拿回SDA的控制权。

推挽输出模拟IIC

输出高电平:将SDA设置为输入模式,靠外部上拉将SDA稳定在高电平

输出低电平:将SDA设置为输出模式且输出低电平

输入状态:将SDA设置为输入模式

参考

利尔达-I2C问题分享

一步一磕头的菜鸡-I2C详解

I2C电平半高问题详解的更多相关文章

  1. Docker Swarm 高可用详解

    Docker Swarm 高可用详解 Manager管理节点宕机后其他管理节点仍然可以使用管理 intermal distributed state store:内部分布式状态存储同步共享到每个节点. ...

  2. MySQL异步复制、半同步复制详解

    MySQL数据复制的原理图大致如下: 从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现: 其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O ...

  3. 为什么PMOS比NMOS的沟道导通电阻大,速度慢,价格高-透彻详解

    原文地址点击这里: 在前一节,我们对PMOS与NMOS两种增强型场效应管的开关电路作了详细的介绍, 并且还提到过一种广为流传的说法:相对于NMOS管,PMOS管的沟道导通电阻更大.速度更慢.成本更高等 ...

  4. 【OpenStack】OpenStack系列15之OpenStack高可用详解

    高可用 概念 级别 陈本 如何实现 分类 Openstack的HA 虚拟机的HA 虚拟机HA 比较 应用级别HA,Heat的HA模板   组件的HA 示意图 Mysql的HA 三种方式之一——主从同步 ...

  5. Redis高可用详解:持久化技术及方案选择

    文章摘自:https://www.cnblogs.com/kismetv/p/9137897.html 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关 ...

  6. python之xlwt模块列宽width、行高Heights详解

    今天用python操作excel时,发现xlwt的API中没有对width.height有更多介绍,且使用时也不知道width取多少合适.现在这做个详细介绍 使用版本: python:2.7.5 xl ...

  7. Redis高可用详解:持久化技术及方案选择 (推荐)--转载自编程迷思博客www.cnblogs.com/kismetv/p/8654978.html

    一.Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义. 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常 ...

  8. MariaDB主从半同步复制详解

    半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...

  9. Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别

    谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...

  10. 原生JS获取元素宽高实践详解

    开篇的话 任何不是亲身实践中求得的知识,都不是属于你的.任何求得的知识不去时常温习运用,也不是属于你的. 记录由来 在做个上拉广告功能中遇到了一个"理所当然"觉得对的用法,慢慢才排 ...

随机推荐

  1. spring的控制反转DI---基于注解实现

    首先在pom.xml里面导入依赖: <dependencies> <!--要使用spring需要添加4个包但是maven会把他的几个依赖包同时下好--> <depende ...

  2. ChatMoney让你体验古诗词的快乐

    本文由 ChatMoney团队出品 介绍说明 在中华传统文化的璀璨星空里,诗词宛如熠熠生辉的明珠,而飞花令则是其中一颗独特而耀眼的星辰.如今,我们自豪地为您推出专为孩子精心打造的飞花令机器人,为孩子们 ...

  3. AAAI 2025-FEI: 频率掩码嵌入推理:一种非对比学习的时间序列表示学习

    title:Frequency-Masked Embedding Inference: A Non-Contrastive Approach for Time Series Representatio ...

  4. 电气设计软件有哪些?EPLAN让你成为专业工程师

    作为一名电气设计师,掌握适合自己的设计软件至关重要.在本文中,我们将向您介绍五款广受欢迎的电气设计软件,无论您是初学者还是专业设计师,这些软件都能帮助您轻松完成各类电气设计任务.让我们一起来了解这些实 ...

  5. PHP判断PC还是手机登录

    <?php function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AG ...

  6. qt软件开发中cef库的使用

    qt软件中需要嵌入浏览器,用到qcefview,如何是使用的详细步骤. 使用QCEFView的详细步骤(含CEF处理) 使用QCEFView确实需要先准备好CEF库,但不需要你从源码完整编译CEF.以 ...

  7. Xamarin.Android C#layout_weight错误:必须指定一个单位,例如“ px”

    https://mlog.club/article/5879658 解决办法: 关闭VS 删除解决方案根目录中的.vs文件夹 开始VS

  8. 【6】树形DP学习笔记

    前言 教练说过,树形 DP 是一个抽象的东西,很多状态比较难以理解,后面具体的学习方法,忘了. UPD on \(2024.11.21\):修复了例题 \(5\) 的假做法和假代码. 普通树形 DP ...

  9. Typora的快捷键

    嗯,用户想要Typora的所有快捷键及对应的Markdown格式显示.首先,我需要从我搜索到的资料中整理出所有相关的快捷键信息.资料里有很多不同的证据,每个证据里可能都提到了一些快捷键,但可能有重复或 ...

  10. "Academy of Management" and the journal "Academy of Management Perspectives"

    Academy of Management 555 Pleasantville Road, Suite N200 Briarcliff Manor, NY 10510-8020, USA Phone: ...