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. k维背包

    题目链接:E - Product Development (atcoder.jp) 因为最多为5,因此可以暴力枚举 int dp[10][10][10][10][10]; int a[110][10] ...

  2. 游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用

    游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用 总结 视频讲解: https://www.bilibili.com/video/BV1P9jRzXEXU 在使 ...

  3. ShadowSql.net之正确使用方式

    ShadowSql是面向接口模块化可插拔可扩展的工具 ShadowSql不是全家桶 不把所有功能都做一个项目里面就是为了大家不一次引用所有的nuget包 大家可以先判断需要哪些功能,再引用对应的nug ...

  4. Vue的初步学习---基础

    VUE 数据都没有!你设置个屁的指令啊 先给数据再设置指令我们需要改变我们的思维 重点关注在数据上数据更新后 数据对应的元素 会同步更新this可以获取被实例化的vue对象的元素下的所有东西 从而拿到 ...

  5. 关于Design Review 的一些思考

    开发流程 这篇文章记录一些我对Design Review 的一些思考,下面是我当下对开发流程的理解: 开发流程: 收到需求 需求分析 设计分析 项目排期 项目开发 测试环境测试 线上回归测试 上线观察 ...

  6. BAPI_CUSTOMERRETURN_CREATE 创建退货订单

    READ TABLE s_head INDEX 1. IF sy-subrc = 0. ls_orders_h = s_head. *** 抬头 CLEAR: ls_header,ls_headerx ...

  7. VS2022 下载超详细安装教程(附安装包及秘钥):全能开发工具部署指南

    目录 一.VS2022软件核心功能与优势 二.VS2022下载及安装准备 1. 系统要求: 2. VS2022下载: 三.VS2022详细安装步骤 1. 解压VS2022安装包 2. 运行VS2022 ...

  8. 数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验

    在这个数据如潮的时代,SQL 已远远超越了简单的查询语言范畴,它已成为数据分析和决策制定的基石,成为撬动企业智慧决策的关键杠杆.SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度,对企业 ...

  9. SQL Server 链接服务器"XXXXXXX"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "没有活动事务。"。

    一.确保互联双方服务器MS DTC服务已启动并正确配置 打开"服务"管理控制台(services.msc) 找到"Distributed Transaction Coor ...

  10. Spring AI 玩转多轮对话

    AI "失忆"怎么办?本文带你用 Spring AI 一招搞定多轮对话,让你的 AI 应用拥有超强记忆!从 ChatClient.Advisors 到实战编码,三步打造一个能记住上 ...