【驱动】I2C驱动分析(一)-I2C驱协议简介
什么是 I²C
- I²C 叫集成电路总线
- 它是一种串行通信接口,具有双向两线同步串行总线,通常由两根线组成——SDA(串行数据线)和SCL(串行时钟线)和上拉电阻。
- 它们用于需要许多不同部件(例如传感器、引脚、扩展和驱动程序)协同工作的项目,因为它们可以将多达 128 个设备连接到主板,同时保持清晰的通信路径!
- 它用于将各种低速设备连接在一起,如微控制器、EEPROM、A/D 和 D/A 转换器等。
- 与 UART 或 SPI 不同,I2C 总线驱动器是漏极开路的,可防止总线争用并消除驱动器损坏的机会。
- I2C 中的每条信号线都包含上拉电阻,当没有设备将其拉低时,可将信号恢复至线路的高电平。
- 所有传输均由“主设备”发起和终止;“主设备”可以向一个或多个“从设备”写入数据,或者向“从设备”请求数据。“Master”和“Slave”在系统中并不是固定的。事实上,任何设备只要配置了适当的硬件或固件,都可以用作“Master”或“Slave”。
- 数据以一个字节传输,每个字节后跟一个1位握手信号作为ACK/NACK位(确认/无响应)。
为什么使用I2C
- I2C总线目前仍然是各种电路常用的通信外设,且实现简单。无论总线上连接多少个设备,只需要两条信号线(时钟SCL和数据SDA)。
- 它是真正的多主总线,优于SPI。
- 此外,I2C接口也很灵活,使其能够与慢速设备通信,同时还具有高速模式来传输大数据。标准模式下传输速率可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
- 由于其灵活性,I2C 将始终是连接设备的最佳通信外设之一。
特征
| 线数 | 2(SCL 和 SDA) |
|---|---|
| 数据帧大小 | 8 位数据包 |
| 最大速度 | 标准模式 = 100 Kbps |
| 快速模式 = 400 Kbps | |
| 高速模式 = 3.4 Mbps | |
| 超快速模式 = 5 Mbps | |
| 严格的波特率? | 否(与 UART 相比) |
| master数量 | 无限 |
| slave数量 | 视情况而定(最多 127,但电容可达 400 pf ) |
I²C通讯协议
I²C 如何工作?
- I2C 数据在消息中传输,消息被分解为数据帧。
- 每条消息包含:
- 启动条件
- 停止条件
- 读取和写入位
- ACK/NACK 位
- 从机地址
- 数据帧
启动和停止条件
启动
条件:
- 当主设备将SDA线从高电平切换到低电平,然后将SCL线从高电平切换到低电平时,传输将开始。
- 向其他从属设备发出信号,表明传输即将发生。
- 如果两个主机同时发送启动条件想要获得总线的所有权,那么谁先将 SDA 拉低,谁就“获胜”
停止
条件:
- 所有数据帧发送完毕后,将发送停止条件。
- SCL线先从低电平切换到高电平,然后SDA线从低电平切换到高电平
- 在正常数据写入操作期间,当 SCL 为高电平时,SDA 上的值不应更改,因为这可能会导致错误停止情况。
读/写位
- 单个位指定主机是否正在向从机传输(写入)数据(低电压电平)或从其请求(读取)数据(高电压电平)。
ACK/NACK 位
- 由接收设备在每个帧后发送,以向发送方发送信号是否成功接收到数据帧 (ACK) 或未成功接收 (NACK)
从机地址
- 与 SPI 相比,I2C 没有从机选择线,这导致从机设备无法知道数据何时发送给自己而不是其他从机。
- 为了解决这个问题,I2C 使用地址帧,它是新消息中起始位之后的第一帧。
- 主设备将首先发送它想要与之通信的从设备的唯一地址。
- 如果该地址与从机自己的地址匹配,它将向主设备发送回 ACK 位。
- 如果不匹配,从机将不执行任何操作,从而使 SDA 线保持高电平。
寻址
主设备将其想要与其通信的从设备的地址发送到与其连接的每个从设备。从设备将接收到的地址与自己的地址进行比较。
- 如果匹配成功,则从设备知道它将与主设备建立通信。它将向主设备发送回 ACK 位。
- 与 SPI 相比,I2C 没有从机选择线,这导致从机设备无法知道数据何时发送给自己而不是其他从机。
- 为了解决这个问题,I2C 使用地址帧,它是新消息中起始位之后的第一帧。
- 主设备将首先发送它想要与之通信的从设备的唯一地址。
- 如果该地址与从机自己的地址匹配,它将向主设备发送回 ACK 位。
- 如果不匹配,从机将不执行任何操作,从而使 SDA 线保持高电平。
7位/10位设备地址
- I2C 通常有 7 位地址,并且只有 127 个不同的 I2C 设备。然而,实际上,I2C 设备的类型要多得多,并且 I2C 设备很有可能在总线上具有相同的地址。
- 为了克服这一限制,许多器件通过外部配置引脚使用双地址以及 10 位地址方案。
- 10 位地址方案对普通 I2C 协议有两个影响:
- 地址帧现在有两个字节而不是 1 个字节。
- 第一个字节的前五个最高有效位用于标识 10 位地址,约定为“11110”。

数据帧(要传输的数据)
- 发送地址帧并且主设备从从设备接收到 ACK 位后,将开始传输 8 位长的数据,首先发送最高有效位 (MSB)。
- 当主设备定期生成时钟脉冲时,数据由主设备或从设备根据读/写位在 SDA 上发送。
- 每个数据帧后面都有一个 ACK/NACK 位,以表明数据是否已成功接收。在发送下一个数据帧之前,主机或从机必须接收到 ACK 位
- 此过程完成后,主设备将向从设备发送停止条件,从而结束传输。
I2C通信的步骤
步骤1:主设备将产生一个开始信号,向其他设备发出信号,开始监听总线并准备接收数据。(SCL高,SDA由高变低)当发送启动信号条件时,总线将进入繁忙状态,其中当前数据传输仅限于选定的主设备和从设备。只有在产生停止条件后,总线才会被释放并再次处于空闲模式。
步骤2:主设备向每个设备发送一个7位设备地址加上一位读写数据帧。该位还将指示下一个数据传输的方向。0 = 主设备向从设备写入数据。1 = 主设备读取数据到从设备。
步骤3:每个从机将主机发送的地址与自己的地址进行比较。成功匹配地址的从设备通过拉低 SDA 线返回 ACK 位。
步骤4:当主设备收到从设备的确认信号后,开始发送或接收数据。下图是向指定设备传输数据的过程图。
步骤5:接收设备发送完每个数据帧后,向发送方返回另一个ACK位,以确认该帧已成功接收,然后发送方继续发送该数据帧,以此类推。
步骤6:当数据传输完成后,主设备会向其他设备发出停止信号,释放总线,总线进入空闲状态。



I²C 总线操作
I2C总线的操作是主从设备之间的读写过程。主要分为3个流程:
- 主设备向从设备写入数据:

- 主设备从从设备读取数据:

- 重复启动条件:
- 在总线空闲状态期间使用,此时没有其他主机可以断言对总线的控制并且不存在停止条件
- 这是一个单主系统。重复/重新启动条件机制比使用停止信号结束传输并再次启动总线更有效
- 例如,
- 主设备向从设备写入数据然后重新启动启动条件,然后从从设备读取数据或
- 主设备从从设备读取数据然后重新启动启动条件,然后主设备向从设备写入数据:

I2C的优点和缺点
优点
- 即使总线上有许多设备,引脚/信号数量也很少
- 灵活=支持多主多从通讯
- 简单 = 仅使用 2 根电线
- 适应性强=适应各种从设备的需求。
- 可靠 = ACK/NACK 确认每个帧已成功传输。
- 设备可以随时在总线上安装或移除。
缺点
- 由于使用上拉电阻,因此速度比 SPI 慢。
- 开漏设计=有限速度。
- 由于使用电阻器,需要更多空间
- 随着设备数量的增加而变得复杂。
原文链接
https://blog.csdn.net/weixin_39939185/article/details/131834694
【驱动】I2C驱动分析(一)-I2C驱协议简介的更多相关文章
- linux驱动基础系列--Linux I2c驱动分析
前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...
- Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】
本文转载自:http://blog.chinaunix.net/uid-21558711-id-3959287.html 分类: LINUX 原文地址:Linux I2C驱动分析(三)----i2c_ ...
- linux i2c驱动架构-dm368 i2c驱动分析
linux i2c驱动架构-dm368 i2c驱动分析 在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinc ...
- 【Linux高级驱动】I2C驱动框架分析
1.i2c-dev.c(i2c设备驱动组件层) 功能:1)给用户提供接口 i2c_dev_init //入口函数 /*申请主设备号*/ register_chrdev(I2C_MAJOR(), &q ...
- 【驱动】linux下I2C驱动架构全面分析
I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线. ...
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】
转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...
- 基于Tiny4412的I2C驱动分析
本文以tiny4412平台上到三轴加速度器为例简单分析了Linux下到i2c驱动编程. http://pan.baidu.com/s/1c0H5vRq
- linux下I2C驱动架构全面分析【转】
本文转载自:http://blog.csdn.net/wangpengqi/article/details/17711165 I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...
- Linux 驱动框架---i2c驱动框架
i2c驱动在Linux通过一个周的学习后发现i2c总线的驱动框架还是和Linux整体的驱动框架是相同的,思想并不特殊比较复杂的内容如i2c核心的内容都是内核驱动框架实现完成的,今天我们暂时只分析驱动开 ...
- 3.4.2内核下的I2C驱动
1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...
随机推荐
- SQL动态化多个分组查询
现有以下三张表,分别为:diqu(地区表),zhiye(职业表),info(信息表) 最基本的分组查询 1 select dqID,jbID,COUNT(1) from info group by d ...
- Linux笔记03: Linux常用命令_3.3文件操作命令
3.3 文件操作命令 3.3.1 stat命令 ●命令名称:stat. ●英文原意:display file or file system status. ●所在路径:/usr/bin/stat. ● ...
- [AGC038E] Gachapon
Problem Statement Snuke found a random number generator. It generates an integer between $0$ and $N- ...
- net8获取泛微token以及访问api示例
工作中涉及到调用泛微的场景,官方的示例又臭又长,抽空用NET8简化了写法,为了简化http访问,用了Flurl.Http这个库.在座各位大佬,我们直接就看代码了 using System.Secu ...
- 推荐给前端开发的 5 款 Chrome 扩展 🚀
大家好,我是 dom 哥.这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星. 工欲善其事,必先利其器.Chrome 可能是前端开发中使用最多的浏览器.在日常开发中,下列几款 Ch ...
- nginx下的proxy_pass使用
之前的文章说到了,return,rewrite的使用,以及它们的使用场景,今天再来说一种代理的使用,proxy_pass,它属于nginx下的ngx_http_proxy_module模块,没有显示的 ...
- 一文聊透 Linux 缺页异常的处理 —— 图解 Page Faults
本文基于内核 5.4 版本源码讨论 在前面两篇介绍 mmap 的文章中,笔者分别从原理角度以及源码实现角度带着大家深入到内核世界深度揭秘了 mmap 内存映射的本质.从整个 mmap 映射的过程可以看 ...
- 火山引擎ByteHouse基于云原生架构的实时导入探索与实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着企业降本增效.智能化数据决策需求的增强,传统的商业数据库已经难以满足和响应快速增长的业务诉求.在此背景下,云原 ...
- 开源.NetCore通用工具库Xmtool使用连载 - 图像处理篇
[Github源码] <上一篇> 介绍了Xmtool工具库中的扩展动态对象,今天我们继续为大家介绍其中的图像处理类库. 在我们的软件系统中,经常需要对图片进行各种各样的处理:例如最常见的头 ...
- 数字孪生系统融合GIS系统能够在洪涝灾害防治上带来什么帮助?
数字孪生技术与GIS系统的融合,为防治洪涝灾害方式带来了巨大的改变.这种整合的力量超越了过去单一技术的局限,为防洪抗灾工作提供了更全面.更准确的决策支持和应急响应能力. 在过去,防洪抗灾工作主要依赖于 ...