I2C总线协议

news2024/11/28 13:54:19

什么是I2C

I2C(Inter-Integrated Circuit),也可以叫IIC、I2C,译作集成电路总线,是两线式串行通信总线,用于设备间的通讯等,标准情况下最高传送速率达100Kbps。顾名思义,I2C通讯只需要两根线,一根是数据线SDA(Serial Data Line),一根是时钟线SCL(Serial Clock Line)。主设备控制时钟线决定I2C的波特率,配合数据线进行数据的传输,这两根线分别通过上拉电阻连接到电源

特点

  • 一种相对简单的通信协议,适合短距离(比如小于1m)通信
  • 总线通信速率 100kHz 或 400kHz,相比其他协议,通信速率较低
  • 只需要四个引脚(VCC,GND,SDA,SCL)
  • 半双工
  • 没有严格的波特率要求
  • 最大主设备数:无限制;
  • 最大从机数:理论上是127;
    在这里插入图片描述
    和SPI通信类似,I2C通信的两个数据线分别为SCL时钟线和SDA数据线。所有的数据操作都是在这两个数据线的输出的共同作用下产生的,类似于SPI的CS/SS、SCLK、MOSI之间的相互作用。

I2C的高阻态

漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻高阻状态:高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。电路分析时高阻态可做开路理解。我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,那么这时候其余的空闲设备可能会受到总线干扰,或者干扰到总线,怎么办呢?为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备

数据传输协议
主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。串行数据序列的结构可以分为:
在这里插入图片描述

  • 总线空闲状态:SCL和SDA都处在高电平。
  • 起始信号:SCL高电平时SDA从高到低。
  • 终止信号:SCL高电平时SDA从低到高。
  • 数据传输:按字节发送、SDA在时钟低电平切换、高电平保持。
  • 回应(应答位):I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。应答信号: 出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应
  • 停止位:当主设备决定结束通讯时,需要发送结束信号, 先将SDA线从低电平切换到高电平;再将SCL线从高电平拉到低电平;

标准流程总结为:

  1. Master发起STARTMaster发送I2C addr(7bit)和w操作0(1bit)
  2. 等待ACK
  3. Slave发送ACKMaster发送reg addr(8bit)
  4. 等待ACK
  5. Slave发送ACKMaster发送data(8bit),即要写入寄存器中的数据,
  6. 等待ACK
  7. Slave发送ACK
  8. 第6步和第7步可以重复多次,即顺序写多个寄存器
  9. Master发起STOP

仲裁机制
如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I2C总线上的仲裁。I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。

  1. SCL同步: SCL同步是由于总线具有线 “与”
    的逻辑功能(开漏输出),即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号,这就是SCL的同步原理。
  2. SDA线的仲裁:
    总线仲裁是为了解决多设备同时竞争中线控制权的问题,通过一定的裸机来决定哪个设备能够获得最终的总线控制权。SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致,低电平优先(类似于CAN总线的回读机制)。是,继续发送;否则,退出竞争;
    I2C总线的控制逻辑:低电平优先SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失,总线系统通过仲裁只允许一个主节点可以继续占据总线。

I2C死锁

在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。在I2C主设备进行读写操作的过程中,主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,在这个时候,从设备输出应答信号,将SDA信号拉为低电平。如果这个时候主设备异常复位,SCL就会被释放为高电平。此时,如果从设备没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。而对于I2C主设备来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作,I2C从设备应答后输出数据,如果在这个时刻I2C主设备异常复位而此时I2C从设备输出的数据位正好为0,也会导致I2C总线进入死锁状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用示波器测量放电波形

示波器那么重要,你确定不进来看看?_哔哩哔哩_bilibili 5分钟搞明白示波器的 带宽 采样率 存储深度_哔哩哔哩_bilibili 年轻人的第一台示波器选手持还是台式?_哔哩哔哩_bilibili 以示波器为例,测量某设备波形。 1、开机&#xff…

在Excel中使用SQL

说明: Excel中许多函数虽然能代替SQL的功能,但是比起SQL,还是有一些逊色,特意做了这个教程,主要有: 分组统计,Excel中用数据透视表,SQL中用Group By去重,Excel中可以用条件标识功能(开始->条…

Lyft 计划开源人工智能算法测试工具

共享租车公司 Lyft 投入大量时间和资源开发工具来测试机器学习算法,近日 Lyft 宣布将向公众开源这些工具。正式投入生产环境之前,一款机器学习算法的测试和更替非常耗费时间,Lyft 开发的测试工具,是属于一种模拟器,能够…

LLM 03-大模型的有害性

LLM 03-大模型的有害性 3.1 引言1 在这次内容中,我们将开始探讨大型语言模型的有害性(危害)。在这门课程中,我们将涵盖几种这些危害: 性能差异社会偏见和刻板印象有害信息虚假信息 另外在之后的课程中会讲述其他更多层面的危害…

内存管理机制

aCoral内存管理机制 aCoral内存管理机制在伙伴系统基础上,采用了位图法方式提高内存分配和回收速度的确定性,更能满足系统实时性的需求。 aCoral内存管理机制分为两级,上一级采用改进的伙伴系统,负责确定要分配的内存的大小&…

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告,但不能保证该广告变现能力强。莫比乌斯做了如下两点创新: 在召回阶段,引入CPM等业务指标作为召回依据在召回阶段,引入CTR模型,从而召回更多相关性高且变现能力强的广告 参考 百度…

【ROS】Ubuntu20.04+ROS Noetic 配置PX4-v1.12.2和Gazebo11联合仿真环境【教程】

【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】 文章目录 【ROS】Ubuntu20.04ROS Noetic 配置PX4-v-v1.12.2和Gazebo11联合仿真环境【教程】0. 安装UbuntuROS1. 安装依赖2. 安装QGC地面站3. 配置PX4-v1.12.23.1 安装PX43.2 测试PX4是否成功安装…

大数据Flink(八十):Checkpoint的状态后端和重启策略

文章目录 Checkpoint的状态后端和重启策略 一、状态后端

第21章_瑞萨MCU零基础入门系列教程之事件链接控制器ELC

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

Django:二、模板、静态文件及请求相应

一、HTML 在app01中创建文件夹“templates”,在templates中创建HTML文件。 二、静态文件 创建静态文件夹,并把相关包导入 在HTML中引入Jquery等包,需要完成几步: 三、模板语法 1、字符串和列表 2、字典 3、if语句

TouchGFX之缓存位图

位图缓存是专用RAM缓冲区,应用可将位图保存(或缓存)在其中。 如果缓存了位图,在绘制位图时,TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快(特…

济南某类国企单位面试复盘

题目 背景1. 多线程有哪些基本参数?2. 线程池是如何实现的?3. ThreadLocal是怎么存的?4. JVM内存模型(JDK1.8)了解吗?5. 直接内存是用来存什么的?6.NIO采用的是Linux哪种IO模型7.常用的限流算法…

linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)

一、字符设备驱动注册的内部过程 1.分配struct cdev对象空间 2.初始化struct cdev对象 3.注册cdev对象 二、注册字符设备驱动分步实现 1.分配字符设备驱动对象 2.字符设备驱动对象初始化 3.设备号的申请 4.根据申请的设备号和驱动对象注册驱动 三、open函数回调驱动中…

了解冒泡排序

package com.mypackage.array;import java.util.Arrays;public class Demo07 {public static void main(String[] args) {int[] a {3,2,6,7,4,5,6,34,56,7};int[] sort1 sort1(a); //调用我们自己写的排序方法后,返回一个排序后的数组System.out.println(Array…

密码学概述

密码学的概念 密码,最初的目的是用于对信息加密,计算机领域的密码技术种类繁多。但随着密码学的运用,密码还被用于身份认证、防止否认等功能上。密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变…

5.k8s jenkins集成k8s一键发布案例

文章目录 前言一、jenkins配置1.1 jenkins配置git1.2 jenkins 配置maven1.3 jenkins配置java 二、jenkins流水线配置2.1.新增项目2.2 springboot项目配置git仓库2.3 springboot项目配置maven打包2.4 系统配置 ssh到hadoop1配置,也就是k8s的master节点2.6 springboot…

Handler原理

Handler原理 前言1. Handler作用2. Handler概述3. 核心类 一、Handler源码分析1.创建Handler2.发送消息3.取消息4.消息处理5.线程切换 二、相关内容1.Handler原理2.epoll机制2.1什么是epoll机制?2.2 select/poll/epoll2.3 Handler中epoll是如何实现消息队列的阻塞和…

誉天在线项目~ElementPlus Tag标签用法

效果图 页面展现 <el-form-item label"课程标签"><el-tagv-for"tag in dynamicTags":key"tag"class"mx-1"closable:disable-transitions"false"close"handleClose(tag)"style"margin:5px;">…

解决Custom EmptyStringException: The string is empty

解决Custom EmptyStringException: The string is empty 解决Custom EmptyStringException: The string is empty摘要引言正文1. 理解异常的根本原因2. 处理空字符串问题3. 用户输入验证4. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&…

gitlab runner 不清理云端已经删除的tag和branch问题记录

在使用gitlab runner的过程中&#xff0c;发现由于git存储限制&#xff0c;不允许在a/b分支后创建a/b/c的分支。所以移除云端a/b分支后创建a/b/c分支。 但是由于gitlab runner出于拉取代码的速度考虑&#xff0c;将本地代码路径做了持久化缓存。 在上述场景中&#xff0c;新建…