I2C电平半高问题详解
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电平半高问题详解的更多相关文章
- Docker Swarm 高可用详解
Docker Swarm 高可用详解 Manager管理节点宕机后其他管理节点仍然可以使用管理 intermal distributed state store:内部分布式状态存储同步共享到每个节点. ...
- MySQL异步复制、半同步复制详解
MySQL数据复制的原理图大致如下: 从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现: 其中1个在主服务器上,另两个在从服务器上.当发出START SLAVE时,从服务器创建一个I/O ...
- 为什么PMOS比NMOS的沟道导通电阻大,速度慢,价格高-透彻详解
原文地址点击这里: 在前一节,我们对PMOS与NMOS两种增强型场效应管的开关电路作了详细的介绍, 并且还提到过一种广为流传的说法:相对于NMOS管,PMOS管的沟道导通电阻更大.速度更慢.成本更高等 ...
- 【OpenStack】OpenStack系列15之OpenStack高可用详解
高可用 概念 级别 陈本 如何实现 分类 Openstack的HA 虚拟机的HA 虚拟机HA 比较 应用级别HA,Heat的HA模板 组件的HA 示意图 Mysql的HA 三种方式之一——主从同步 ...
- Redis高可用详解:持久化技术及方案选择
文章摘自:https://www.cnblogs.com/kismetv/p/9137897.html 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关 ...
- python之xlwt模块列宽width、行高Heights详解
今天用python操作excel时,发现xlwt的API中没有对width.height有更多介绍,且使用时也不知道width取多少合适.现在这做个详细介绍 使用版本: python:2.7.5 xl ...
- Redis高可用详解:持久化技术及方案选择 (推荐)--转载自编程迷思博客www.cnblogs.com/kismetv/p/8654978.html
一.Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义. 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常 ...
- MariaDB主从半同步复制详解
半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay lo ...
- Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别
谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能. ...
- 原生JS获取元素宽高实践详解
开篇的话 任何不是亲身实践中求得的知识,都不是属于你的.任何求得的知识不去时常温习运用,也不是属于你的. 记录由来 在做个上拉广告功能中遇到了一个"理所当然"觉得对的用法,慢慢才排 ...
随机推荐
- k维背包
题目链接:E - Product Development (atcoder.jp) 因为最多为5,因此可以暴力枚举 int dp[10][10][10][10][10]; int a[110][10] ...
- 游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用
游戏开发godot+mcp等于事半功倍,分享一下如何安装godot相关的mcp及有何作用 总结 视频讲解: https://www.bilibili.com/video/BV1P9jRzXEXU 在使 ...
- ShadowSql.net之正确使用方式
ShadowSql是面向接口模块化可插拔可扩展的工具 ShadowSql不是全家桶 不把所有功能都做一个项目里面就是为了大家不一次引用所有的nuget包 大家可以先判断需要哪些功能,再引用对应的nug ...
- Vue的初步学习---基础
VUE 数据都没有!你设置个屁的指令啊 先给数据再设置指令我们需要改变我们的思维 重点关注在数据上数据更新后 数据对应的元素 会同步更新this可以获取被实例化的vue对象的元素下的所有东西 从而拿到 ...
- 关于Design Review 的一些思考
开发流程 这篇文章记录一些我对Design Review 的一些思考,下面是我当下对开发流程的理解: 开发流程: 收到需求 需求分析 设计分析 项目排期 项目开发 测试环境测试 线上回归测试 上线观察 ...
- BAPI_CUSTOMERRETURN_CREATE 创建退货订单
READ TABLE s_head INDEX 1. IF sy-subrc = 0. ls_orders_h = s_head. *** 抬头 CLEAR: ls_header,ls_headerx ...
- VS2022 下载超详细安装教程(附安装包及秘钥):全能开发工具部署指南
目录 一.VS2022软件核心功能与优势 二.VS2022下载及安装准备 1. 系统要求: 2. VS2022下载: 三.VS2022详细安装步骤 1. 解压VS2022安装包 2. 运行VS2022 ...
- 数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验
在这个数据如潮的时代,SQL 已远远超越了简单的查询语言范畴,它已成为数据分析和决策制定的基石,成为撬动企业智慧决策的关键杠杆.SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度,对企业 ...
- SQL Server 链接服务器"XXXXXXX"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息 "没有活动事务。"。
一.确保互联双方服务器MS DTC服务已启动并正确配置 打开"服务"管理控制台(services.msc) 找到"Distributed Transaction Coor ...
- Spring AI 玩转多轮对话
AI "失忆"怎么办?本文带你用 Spring AI 一招搞定多轮对话,让你的 AI 应用拥有超强记忆!从 ChatClient.Advisors 到实战编码,三步打造一个能记住上 ...