【裸机开发】I2C 通信接口(一)—— I2C 通信时序协议及通信流程

news2024/11/15 10:50:57

目录

一、I2C 简介

二、I2C 的整体通信流程

三、主要通信时序和协议

3.1 开始 / 停止条件

3.2 地址传送

3.3 数据传输

3.4 应答条件

3.5 重复开始条件

四、总线仲裁机制(SDA)

1、什么是总线仲裁

2、总线仲裁的过程

五、时钟同步(SCL)


一、I2C 简介

I2C总线是一种同步、半双工双向的两线式串口总线。它由两条总线组成:串行时钟线SCL串行数据线SDA。I2C 总线有两种模式,标准模式下速度可以达到100Kb/s,快速模式下可以达到400Kb/s。

  • SCL:负责产生时钟脉冲。(由主设备控制,即由发送的一方控制)
  • SDA:负责数据的传输。(主、从设备都可以使用)

I2C 支持多从机,一个I2C控制器下可以挂多个I2C 从设备,不同从设备有不同的器件地址,I2C主控制器可以通过器件地址访问指定的 I2C 设备。

二、I2C 的整体通信流程

当总线处在空闲状态下,总线上任一设备都可以发起通信。发起通信的一方就是“主机”,主机指定通信的设备就是“从机”。主从机的整体通信流程如下:

① 准备阶段

  1. 主机发起开始信号占用总线(开始条件
  2. 主机发送一个字节的数据,指定通信设备和通信方向(地址传送
  3. 被寻址的设备发送一个应答信号回应主机(应答条件

② 数据传输阶段

  1. 发送方发送一个字节数据(数据传输
  2. 接收方接收到数据以后发送一个应答信号(应答条件)

③ 结束阶段

  1. 主机发送停止信号释放总线(停止条件

三、主要通信时序和协议

当总线处在空闲状态下,总线上任一设备都可以发起通信。(SCL 为高电平,SDA 为高电平)

3.1 开始 / 停止条件

SCL 为高电平,SDA 出现了下降沿的时候,此时表示总线上某个设备要开始通信了。

SCL 为高电平,SDA 出现了上升沿的时候,此时表示设备通信结束,释放总线。结束通信有两种情况:

  • 主机不想发了,发送停止信号
  • 从机不想收了,便不应答,主机发送停止信号

3.2 地址传送

开始通信以后,主机(发起通信的一方)向总线上发送一个字节的数据帧,相当于在广播寻人,这帧内容包含:

  • 通信设备地址:表明主机想和谁通信。一般是7 bit,有些标准是 9 bit
  • 通信方向:表明主机是准备发数据,还是准备收数据。0 表示写(发送),1 表示读(接收)

注意:阴影部分表示主机发送的,白色部分表示从机发送的。

3.3 数据传输

主机收到从机发送的应答信号以后,表明可以开始数据传输了。通信方向如果是“写”,主机发送数据;如果通信方向是“读”,从机发送数据。数据帧占 8 bit(1个字节)。白色部分为 DATA,表示从机发送数据;阴影部分是 A,表示主机对数据做出了应答。

注意:SCL 为低电平时,可以无需顾忌SDA的边沿变化,但是 SCL 处于高电平时,发送的数据不能有任何边沿变化。

3.4 应答条件

每当有一方向总线发送了数据,另一方必须发出应答信号表示自己已经收到。应答信号占 1 bit,分为 ACK 和 NACK。

  • ACK:表示接收方可以继续通信。SCL 为高,SDA 为低
  • NACK:表示接收方不想继续通信。SCL 为高,SDA 为高;或者发送开始信号,启动新一轮的通信

产生应答一般有两种情况:地址传输、数据传输

3.5 重复开始条件

在没有发出停止条件的情况下,开始条件可以在通信期间重复出现,这是一种特殊情况。一般用于改变通信传输方向、尝试重复传输等情况。

四、总线仲裁机制(SDA)

1、什么是总线仲裁

当一小段起始时间内,有两个及以上的主机产生了开始信号,此时需要通过仲裁决定最终由哪个主机占用总线。仲裁规则如下:

  • 当 SCL 为高电平时,让主机产生的信号进行“线与”(按位与)
  • 第 n 个周期:每个主机检测 “线与”的结果是否和自己产生的电平一致
    • 如果一致,则继续占用总线
    • 如果不一致,则退出仲裁
  • ... ...
  • 直至总线上只剩下一个产生开始信号的主机

2、总线仲裁的过程

假设某一小段时间内,SCL 处于高电平时,主机DATA1、主机DATA2向总线发送了起始信号(产生了下降沿),此时要对主机DATA1、主机DATA2进行冲裁。

SCL 的第一个周期内的高电平到来,DATA1 和 DATA2 线与的结果是高电平,DATA1为高电平,和线与结果一致,DATA2也为高电平,双方继续占用总线(继续仲裁)

SCL 的第二个周期的高电平到来,DATA1 和 DATA2 线与的结果是低电平,DATA1为低电平,和线与结果一致,DATA2也为低电平,双方继续占用总线(继续仲裁)

SCL 的第三个周期的高电平到来,DATA1 和 DATA2 线与的结果是低电平,DATA1为高电平,和线与结果不一致,退出仲裁;DATA2为低电平,和线与结果一致。

因此,DATA2 在仲裁中胜出,继续占用总线。

 

五、时钟同步(SCL)

有的时候,主机的速度快于从机的速度,或者从机需要处理其他事情而不能及时地从主机接收数据或者向主机发送数据。如果从设备希望主设备降低传输速率,可以通过将 SCL 主动拉低,延长SCL 低电平时间的方法来通知主设备。

由于“线与”的机制,即便有多个设备节点向总线发送时钟信号,但是在总线上表现的是统一的时钟信号。

参考文章:

一文搞懂I2C通信总线_i2c通信的详细讲解_不脱发的程序猿的博客-CSDN博客

I2C总线协议详解(特点、通信过程、典型I2C时序)_zhangduang_KHKW的博客-CSDN博客

i2c协议仲裁机制_i2c仲裁_wiyoo0的博客-CSDN博客

I2C中的时钟同步与仲裁_i2c时钟同步_小小verifier的博客-CSDN博客 

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

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

相关文章

QT学习笔记:TCP客户端的实现

QT一般用来做客户端&#xff0c;我这里就简单讲一下怎么开发基于QT的TCP客户端。 1、用QtCreator创建项目 2、界面 3、.pro文件添加network QT core gui network 4、mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include &l…

关于Unity动画卡在第一帧的处理方法

今天在制作人物的死亡动画时出现了题目所说的问题&#xff0c;以下是动画的状态机 因为任何状态都可能死亡&#xff0c;所以是从anyState进入的死亡动画 进入条件为isDead是true&#xff0c;当角色死亡时这个条件就会设置成true 结果出现了卡在这个动画的问题 经过检查发现&a…

Java连接数据库——JDBC使用步骤

步骤: 1.注册驱动 ——导入相应平台厂商的驱动jar包(zip为源码) 驱动版本 8&#xff1a;com.mysql.cj.jdbc.Driver 驱动版本 5&#xff1a;com.mysql.jdbc.Driver DriverManger.registerDriver( new Driver() ); 2.创建链接 —— connection Java程序连接数据库要调用方法,方…

网络推广技术和算法不断更新

网络推广技术和算法不断更新&#xff0c;以下是一些关于网络推广技术和算法的讨论。 1. 定向广告投放&#xff1a;定向广告投放是一种网络推广技术&#xff0c;它利用用户数据和行为分析&#xff0c;将广告投放给特定的受众群体。通过分析用户的兴趣、行为、地理位置等信息&am…

Go环境搭建[win10]

下载 https://golang.google.cn/dl/https://golang.google.cn/dl/go1.20.5.windows-amd64.msiGo环境变量配置 系统变量 GOROOT D:\Dev\Env\Go [Go语言安装目录] GOPROXY https://goproxy.io,direct [配置代理] GOPATH D:\Dev\PROJECTS_GO [Go语言工作目录] PATH …

Java Web JavaScript (1)23.7.1

JavaScript 1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#xff0c;不…

如何自己开发软件测试工具?一篇文章教会你

目录 序言&#xff1a; 一、自动化测试工具浅析 二、如何快速开发一个自动化测试工具 总结&#xff1a; 序言&#xff1a; 一说到自动化测试工具&#xff0c;大家很多人都会想到的是QTP、LR或者selenium之类的工具&#xff0c;要大家一开始设计一个这样的工具&#xff0c;其…

DevOps实现自动化发布实操

DevOps实现自动化发布流程 本篇文章来自 B站视频&#xff08;部分步骤与视频存在差异&#xff09; 流程图及原理 本地编写代码提交至远程仓库Jenkins&#xff08;基于Docker&#xff09;通过内置Git获取提交的代码&#xff0c;通过Maven进行打包&#xff0c;形成可执行文件&a…

数字信号处理实验:IIR数字滤波器设计及软件实现

目录 一、实验目的 二、实验原理 三、实验设备 四、实验内容及步骤 五、实验结果及分析 六、实验主程序框图及程序清单 七、实验总结 一、实验目的 熟悉用双线性变换法设计IIR数字滤波器的原理与方法&#xff1b;学会调用MATLAB信号处理工具箱中滤波器设计函数&#xff…

还在手动下载github项目?想要自动化下载github项目?基于python开发项目自动下载模块帮你实现自动下载存储

GitHub是一个基于Web的代码托管平台和开发者社区。它允许开发者存储、管理和分享他们的代码&#xff0c;并进行版本控制。开发者可以在GitHub上创建仓库来存储项目代码&#xff0c;并使用Git来跟踪和管理代码的变更历史。GitHub提供了一系列协作工具&#xff0c;如问题追踪、Pu…

一波三折|药学博士终获CSC资助赴瑞典隆德大学从事2年博士后研究

我们先为W博士获得美国哈佛大学布列根和妇女医院的邀请函&#xff0c;助其成功获得CSC公派资助&#xff0c;但后被哈佛大学国际中心以可能拒签为由&#xff0c;不予办理DS-2019表格。幸亏我们未雨绸缪先期又申请到瑞典隆德大学的2年博士后邀请函&#xff0c;最终顺利得到CSC改派…

CAS + 自旋 锁底层

多线程安全问题 为什么会出现多线程安全问题? 在多线程并发下, 假设有 A,B 两个线程同时操作 count 0 这个公共变量, 在A线程中count, 在B线程中count, 正常来说结果应该是 count 2, 可是同时在A, B两个线程中拿到 count 0 , 并且都执行count赋值, 结果就变成了 count 1…

【Java可执行命令】(十一)Java 密钥库和证书管理工具keytool:玩转密钥库和证书管理,深入解析keytool工具的应用与技巧~

Java可执行命令之keytool 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 生成证书请求&#xff1a;keytool -certreq3.3 导出证书&#xff1a;keytool -exportcert3.4 生成密钥对&#xff1a;keytool -genkeypair3.5 导入证书或证书链&#xff1a;keytool -importcert3…

基于STM32的直流电机调速系统

目录 基于STM32的直流电机调速系统一、原理图二、部分代码三、视频演示 基于STM32的直流电机调速系统 功能&#xff1a; 1.通过LCD屏幕显示实时两个电机的占空比 2.通过按键调整电机1和2的加减速 3.通过L298N驱动两个直流电机完成调速 一、原理图 二、部分代码 #include &qu…

基于Spring Boot + Vue社区管理系统的设计与实现

1、项目介绍 Spring Boot 是一个用于构建 Java 应用程序的开源框架&#xff0c;它使得开发者可以轻松地创建独立的、生产级别的 Spring 应用程序。Vue.js 是一个流行的 JavaScript 框架&#xff0c;用于构建现代化的、响应式的社区管理系统是一个用于管理社区活动、用户信息和…

Vue发布新版本,强制更新代码的方式

public下新建version.json文件定义版本 {"version":"1.1.0" } util下新建updateVersion.js import axios from axios; import { Loading } from element-ui; var t1; var t2; export async function isNewVersion() {var randomNumberMath.random() co…

[软件工具]左键连发工具左键连点工具使用教程

左键连发软件是一个可以点击一下自动左键连续点击指定次数的软件&#xff0c;比如你设置20次&#xff0c;当你点击一次松开鼠标后&#xff0c;会自动左键连续点击20次。具体使用教程为&#xff0c;我们打开软件 我们可以设置连发次数&#xff0c;默认15次&#xff0c;你可以设置…

Zabbix如何对接Prometheus

一、简介 云原生和容器广泛流行打破传统的技术堡垒&#xff0c;现在Prometheus监控得到越来越多企业应用和探索。对于已经存在Zabbix监控系统的用户又想尝试Prometheus而言&#xff0c;在Zabbix4.2版本及5.0 LTS版本正式发布增加了对Prometheus数据源的接入&#xff0c;后续都…

人机环境系统中的一多分有问题探讨

在一般的事物中&#xff0c;一多关系通常指的是一个事物与多个其他事物之间的关系。一多关系可以带来更多的选择和多样性&#xff0c;使事物更加丰富多样。不同的事物之间相互影响和交融&#xff0c;可以产生新的创意和发展机会&#xff1b;不同事物之间的各种关系需要平衡各自…

leetcode 203.移除链表元素

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;移除链表元素 1️⃣ 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*//*思路1&#xff1a;遍历链表&#xff0c;同时用另一个指针记录当…