实战分享: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总线详解 的相关文章

  • ARM 9处理器的opencv交叉编译

    我需要为 ARM 9 处理器交叉编译 opencv 我有处理器的工具链 但不知道如何交叉编译 请告诉我为arm板交叉编译的过程 谢谢大家 看这个参考 http www airs com ian configure configure 5 h
  • arm64 汇编:LDP 与 LD4 执行时间

    假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器 一种方法是 ldp q0 q1 x0 ldp q2 q3 x0 32 根据ARM优化指南 https static docs arm com uan0016 a cort
  • 嵌入式 C++ (ARM9) 单元测试

    我来自 Java 和 JUnit 的世界 我演示了 Hudson 以及我使用 JUnit 取得的所有成果 我想在嵌入式设备上对 C 代码执行相同的操作 但找不到从哪里开始 该项目使用 iccarm exe IAR 编译器 进行编译 现在使用
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 将数据从 Azure HUB-IOT 保存到 Azure SQL 数据库

    我最近创建了一个 Azure Hub IOT 其中我从虚拟设备发送一些数据 我知道数据已到达 因为我可以从终端看到它们 但现在我想获取这些数据并将它们保存到 Azure SQL DataBase 中 我怎样才能做到这一点 如果有人可以向我解
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • Mosquitto 1.4.2 Websocket 支持

    我正在尝试利用 Mosquittos 最近的更新来支持代理中的 websocket 我正在运行 Mosquitto v1 4 2 并将以下几行添加到 mosquitto 配置文件 mosquitto conf 中 listener 1000
  • Raspberry 3 上的 GSM/GPRS 模块与 Android Things 原生集成

    我想知道是否有任何方法可以使 GPRS GSM 模块 SIM800L 作为 android 中的 默认 连接 允许浏览互联网并使用 Android 库发出请求 似乎不是 因为如this https stackoverflow com a 4
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • 请求/响应的 MQTT 主题名称

    我正在设计一个包含许多设备的系统 使用 MQTT 连接到中央代理 有些主设备可以向某些从设备发送请求 来自一台主机的请求通常会发送给一台从机 请求的主题可以是 mysystem slaveId req 因此从站可以订阅该主题 并且主站可以发
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • CC2538 的 Contiki UDP 数据包传输持续时间

    有人可以解释一下 Contiki OS 传输 UDP 数据包时发生了什么吗 以下是我的设备使用 CC2538 芯片运行时的详细电流消耗 我的问题是 既然理论上在 250kbps 下 408 位长度的数据包应该在大约 2ms 内传输 为什么要
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Android Ble GATT_ERROR 133 经常使用三星设备

    我正在研究 BLE 应用程序 我已经使用 Nexus Moto Samsung LG 等不同设备进行了测试 我仅在三星设备中收到 GATT 错误 133 三星 A5 2016 尝试连接 10 次 但只连接了 2 或 3 次 请帮助我 Non
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断

随机推荐

  • 【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总线是一种常用的通信接口 让我们先来看看百度百科对它的定