实战分享:I2C总线详解

2023-11-08

大家好,我是阿荣。感恩遇见!

本文部分图文来源于网络,并经过整合、编辑和勘误。实战分享栏目将重点介绍嵌入式的基础知识,并融合一些实战经验,持续勘误和迭代,建议关注和收藏!WX同名。

I2C总线是一种常用的通信接口。让我们先来看看百度百科对它的定义。

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

由这个定义中我们可以知道,I2C总线采用双线形式串行传输,属于半双工模式

这里简单介绍下串行和并行的区别。

并行传输

从字面上就可以理解,意思是多个位拥有各自独立的数据线进行传输,如下图所示。

在这里插入图片描述

串行传输

数据公用一条数据线,数据需要一位一位的进行传输,如下图所示。

在这里插入图片描述
I2C总线标准文档为《THE I2C-BUS SPECIFICATION》,目前已经更新到V2.1版本。接下来将依据此文档对I2C总线进行讲解。

硬件特性

I2C总线由两条线组成——串行数据(SDA)和串行时钟(SCL)。每个器件相对应的脚连接到这两根线上,从而形成一个小型网络,如下图示。图中,I2C总线上挂载有微控制器,LCD驱动芯片,EEPROM等器件。连接到总线上的器件数量只由总线电容400pF的限制决定。

I2C总线支持三种传输模式。在标准模式下可达100kbit/s;在快速模式下可达400kbit/s;在高速模式下可达3.4Mbit/s。

在这里插入图片描述
I2C总线上允许多个主机存在。当多个主机要访问同一个从机时,这时会产生冲突。为了解决这种冲突,I2C总线有同步和仲裁的机制。讲解这种机制前,我们需要先搞清楚I2C的一些硬件特性。

连接到I2C总线上的器件的输出端采用漏极开路或集电极开路进行设计,执行的是线与的逻辑。如何理解这种线与的逻辑呢?我们知道,I2C的低电平代表0,高电平代表1。当总线上多个器件同时传输数据时,只要有一方为0,则总线上为0。因为0取与都为0。再回到硬件上看,由于采用线与的设计,输出端无法依靠自身输出高电平,只能通过外部上拉来实现高电平。其电平值由外部电源决定。因此,当总线空闲时,这两根线均为高电平。

位传输时,SCL处于高电平时,SDA数据有效(data line stable;data valid),可进行采样;SCL处于低电平时,运行SDA进行电平变换(change of data allowed)。

在这里插入图片描述

同步

主机在进行数据传输时需要在SCL线上输出自己的时钟波形。当多个主机需要传输数据时,时钟需要先同步。如下图示意,由上面的讲解我们知道,总线上总是优先呈现低电平状态。当SCL被从高电平拉低后,各个器件开始低电平周期计数。当短周期的器件CLK1低电平结束后,仍有器件CLK2处于低电平,因此,此时的CLK1进入等待状态(wait state)。最终直到CLK2低电平结束后,SCL电平切换到高电平。高电平情况类似。由此可得出结论:

“产生的同步SCL时钟的低电平周期由低电平时钟周期最长的器件(CLK2)决定,而高电平周期由高电平时钟周期最短的器件(CLK1)决定”。

在这里插入图片描述

仲裁

“当SCL线时高电平时,仲裁在SDA线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不同”。

数据传输格式

I2C总线数据帧通常由以下元素组成:起始条件(START condition)/重复起始条件(repeated START condition),从机地址(ADDRESS),数据(DATA),响应信号(ACK),不响应信号(NACK),停止条件(STOP condition)。波形如下图示意。

在这里插入图片描述
下面对每个元素进行讲解。
起始条件(START condition)/重复起始条件(repeated START condition)

这两个电平其实是一样的。当SCL处于高电平时,SDA从高电平切换到低电平。注意到了吗?通常在SCL高电平时采用SDA的电平作为比特位,此处用电平变化标记为起始条件或重复起始条件。这样就可以与位数据进行区分,因为位数据在SCL高电平时不变化。

从机地址(ADDRESS)

从机地址有两种,一种为7位,另一种为10位。从机地址后面跟一个比特位(R/W),当该位为0时表示写操作;当该位为1时表示读操作。

数据(DATA)

每个数据为8位,采用MSB方式传输。MSB指高位先传输,而LSB则指低位先传输。

响应信号(ACK)和不响应信号(NACK)

数据传输必须带响应。响应信号(ACK)为SCL处于高电平时,SDA处于低电平;不响应信号(NACK)为SCL处于高电平时,SDA处于高电平。

停止条件(STOP condition)

SCL处于高电平时,SDA从低电平切换到高电平,这就是停止条件(STOP condition)的电平情况。

清楚各个元素后,现在通过这些元素组合成一帧数据。I2C总线有以下几种数据传输格式:
图片中关键字解析如下:
S: 起始条件(START condition)。
Sr:重复起始条件(repeated START condition)
SLAVE ADDRESS:从机地址(ADDRESS)。
R/W(带上划线):读写比特位。
A:响应信号(ACK)。
DATA:数据(DATA)。
A/A(带上划线):响应信号(ACK)或不响应信号(NACK)。
P:停止条件(STOP condition)。

1.主机发送7位/10位地址寻址从机,并写入数据。.

在这里插入图片描述
2. 主机发送7位/10位地址寻址从机,并读取数据。

在这里插入图片描述
3. 由上述两种情况组合而成的复合情况。

在这里插入图片描述
至此,I2C总线的基本特性已经涵盖完了。由这些认知,我们可以开始做驱动开发了。下面举个例子。

实例

这是士兰微电子SC7A20加速度传感器芯片规格书中的截图。对比下之前的说明,相信能看得懂。

在这里插入图片描述
再看下SC7A20的数据帧格式。这里说明以下各个符号的意思。

ST:起始条件。
SAD+W:从机地址加写比特位。
SAD+R:从机地址加读比特位。
SAK:从机响应信号ACK。
MAK:主机响应信号ACK。
NMAK:主机不响应信号NACK。
SP:停止条件。
SR:重复起始条件。
SUB:寄存器地址。

在这里插入图片描述
下图是寄存器说明表格。这次从WHO_AM_I寄存器中读取设备ID值。

在这里插入图片描述
这个是逻辑分析仪采集的波形图。从机的地址为0x19,寄存器地址为0x0F,读取到的设备ID值为0x11。

在这里插入图片描述
有任何疑问,欢迎在评论区一块讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实战分享:I2C总线详解 的相关文章

  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 通过 MQTT 将 LoRa 测量结果发送到 Fiware IOT 代理

    我有 LoRa 传感器 它使用 Cayenne LPP 格式有效负载发送测量值 我的网关 LOrank8v1 捕获这些数据包并将其转换为 UDP 网关中有一个服务 lora gateway bridge 它将数据包从 UDP 转换为 TCP
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc

随机推荐

  • 【Revit二次开发学习笔记】选取元素之先选择元素后执行命令

    第一步 写代码 using System using System Collections Generic using System Linq using System Text using System Threading Tasks u
  • TOWARDS A UNIFIED VIEW OF PARAMETER-EFFICIENT TRANSFER LEARNING

    本文也是属于LLM系列的文章 针对 TOWARDS A UNIFIED VIEW OF PARAMETER EFFICIENT TRANSFER LEARNING 的翻译 关于参数有效迁移学习的统一观点 摘要 1 引言 2 前言 2 1 T
  • xxx.app已损坏,打不开。 您应该将它移到废纸篓。

    Mac最新的系统打开网上下载的应用程序时 会提示 xxx app已损坏 打不开 您应该将它移到废纸篓 解决方式 1 系统偏好设置 gt 安全性与隐私 gt 修改为任何来源 2 serria里面没有 任何来源 这一项 需要打开终端执行sudo
  • 【数据结构】 二叉树面试题讲解->贰

    文章目录 引言 二叉树遍历 https www nowcoder com practice 4b91205483694f449f94c179883c1fef tpId 60 tqId 29483 rp 1 ru activity oj qr
  • 关于链表的三个常用算法

    找到环的第一个入口点 static public SinglyLinkedListNode
  • (s2-048)Struts2 反序列化漏洞

    Struts2 Struts2是一个基于MVC设计模式 java 的Web应用框架 它本质上相当于一个servlet 在MVC设计模式中 Struts2作为控制器 Controller 来建立模型与视图的数据交互 Struts2 是 Apa
  • 【故障处理】java程序cpu飙高如何排查

    使用传统jstack手法来排查 如何使用原生top命令 jstack命令来做定位具体代码的位置处理 简单步骤有下面几步 执行top命令 查看CPU占用情况 找到进程的pid 12002 使用 top Hp
  • Win10增加右键以管理员方式打开cmd,可自定义右键文本图标。

    先上设置后效果 设置步骤 1 打开注册表找到表项 按 win r 输入 regedit 打开注册表 找到注册表项 HKEY CLASSES ROOT Directory Background shell 2 在shell上新建项 右键 sh
  • word显示修改痕迹

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 打开待修改的word 2 设置修订 审阅 修订 修订 3 显示修改痕迹 添加修改内容
  • Fisco Bcos学习(环境搭建)

    服务器搭建联盟链过程 一 docker方式部署单群组4节点区块链 1 安装依赖 1 安装curl openssl yum install y curl openssl openssl devel 2 下载安装脚本 curl LO https
  • 完美解决 vcpkg 下载速度慢

    vcpkg 下载慢非常令人头痛 下面是一位 github 用户的抱怨 非常真实 The download and compilation time of vcpkg is relatively long So during this wai
  • 人才画像--持续更新

    人力资源管理包括人力资源规划 招聘与配置 培训与开发 绩效管理 薪酬管理及员工关系 六大模块 六大模块之间相辅相成 相互联系 对解决企业人才的 留 选 育 用 问题具有极为关键的作用 大数据时代的到来 为其注入了新能量 有人认为 大数据将成
  • 【面试题】2、Docker和Spring相关

    1 Docker是什么 1 Docker是一个快速交互 运行应用的技术 可以将程序及其依赖 运行环境一起打包为一个镜像 该镜像可以迁移到任意的Linux操作系统 2 运行时利用沙箱机制形成隔离容器 各个应用之间互不干扰 3 移动和移除程序都
  • Oracle的三种高可用集群方案

    转载自 http www cnblogs com baiboy p orc2 html label1 Oracle的三种高可用集群方案 1 RAC Real Application Clusters 多个Oracle服务器组成一个共享的Ca
  • matlab 奇异值分解

    1 奇异值分解 关于matlab中的diag函数 矩阵对角元素的提取和创建对角阵
  • CPT104 习题笔记

    调度算法 时间 突发时间 Burst time 通常 我们忽略I O时间 只考虑进程的CPU时间 因此 突发时间是进程在CPU上执行所花费的总时间 Arrival Time 到达时间是流程进入就绪状态并为其执行做好准备的时间 Exit ti
  • Spring属性占位符PropertyPlaceholderConfigurer的使用

    Spring属性占位符PropertyPlaceholderConfigurer的使用 1 一个简单的Demo 1 1 创建conf xml
  • git clone remote: HTTP Basic: Access denied问题解决

    今天用git下载项目 突然提示 查阅资料才发现是因为最近更改gitlab密码的缘故 进入控制面板如下目录 修改对应的git普通凭据 问题解决
  • 华为这么容易进吗?轻轻松松拿到25K的offer...

    美本计算机专业 代码能力一般 之前有过两段实习以及一个学校项目经历 本人面试的是测试开发岗 期间经历了笔试 gt 性格测试 gt 技术一面 gt 技术二面 gt 总监面 gt OC这几个环节 基本上每周完成一个环节 由于华为面试环节全部完成
  • 实战分享:I2C总线详解

    大家好 我是阿荣 感恩遇见 本文部分图文来源于网络 并经过整合 编辑和勘误 实战分享栏目将重点介绍嵌入式的基础知识 并融合一些实战经验 持续勘误和迭代 建议关注和收藏 WX同名 I2C总线是一种常用的通信接口 让我们先来看看百度百科对它的定