IIC(I2C)协议详解

2023-05-16

1.简介

IIC,即I²C,全称 Inter-Integrated Circuit,字面上的意思是集成电路之间,它其实是I²C Bus简称,所以中文应该叫 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

更多嵌入式/单片机/c语言/linux内容:IIC(I2C)协议详解

2. I2C 硬件连接

I2C 在硬件上的接法如下所示,主控芯片引出两条线 SCL(SCK)时钟线,SDA 数据线,在一条I2C 总线上可以接很多 I2C 设备,SDA和SCL这两根线必须要接一个上拉电阻,常用是4.7K,一般在4.7k-10k之间。

总线空闲的时候SCL和SDA处于高电平。

IIC总线标准模式下速度可以达到100Kb/s,快速模式下可以达到400Kb/s,高速模式可达3.4Mb/s。

3. I2C 信号

I2C 协议中数据传输的单位是字节,也就是 8 位。但是要用到 9 个时钟:前面 8 个时钟用来传输 8 数据,第 9 个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

开始信号( S): SCL 为高电平时, SDA 山高电平向低电平跳变,开始传送数据。

结束信号( P): SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。

响应信号(ACK):接收器在接收到 8 位数据后,在第 9 个时钟周期,拉低 SDA

SDA 上传输的数据必须在 SCL 为高电平期间保持稳定, SDA 上的数据只能在SCL 为低电平期间变化

I2C 协议信号如下:

4. IIC 传输数据的格式

4.1写操作

1)主芯片要发出一个 start 信号

2)然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)

3)从设备回应(用来确定这个设备是否存在),然后就可以传输数据

4)主设备发送一个字节数据给从设备,并等待回应

5)每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

6) 数据发送完之后,主芯片就会发送一个停止信号

7)下图:白色背景表示"主→从",灰色背景表示"从→主"

4.2读操作

1)主芯片要发出一个 start 信号

2)然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)

3)从设备回应(用来确定这个设备是否存在),然后就可以传输数据

4)从设备发送一个字节数据给主设备,并等待回应

5)每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

6)数据发送完之后,主芯片就会发送一个停止信号

下图:白色背景表示"主→从",灰色背景表示"从→主"

5. 协议细节

5.1如何在 SDA 上实现双向传输?

主芯片通过一根 SDA 线既可以把数据发给从设备,也可以从 SDA 上读取数据,连接 SDA 线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

5.2内部原理

设备的 SDA 中有一个三极管,使用开极/开漏电路(三极管是开极, CMOS管是开漏,作用一样),如下图:

真值表如下:

从真值表和电路图我们可以知道:

  • 当某一个芯片不想影响 SDA 线时,那就不驱动这个三极管

  • 想让 SDA 输出高电平,双方都不驱动三极管(SDA 通过上拉电阻变为高电平)

  • 想让 SDA 输出低电平,就驱动三极管

5.3为何 SCL 也要使用上拉电阻?

在第 9 个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL 拉低。

当 SCL 为低电平时候,大家都不应该使用 IIC 总线,只有当 SCL 从低电平变为高电平的时候, IIC 总线才能被使用。

当它就绪后,就可以不再驱动三极管,这是上拉电阻把 SCL 变为高电平,其他设备就可以继续使用 I2C 总线了。

5.4 I2C总线最多可以挂多少个设备

I2C是7位地址,2^7=128,但是地址0x00不用,那就是127个地址,所以理论上可以挂127个从器件。

尽管I2C协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。

管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。

实际设计中经验值大概是不超过8个器件

规定电容大小的原因:I2C的OD(漏极开路)要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。

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

IIC(I2C)协议详解 的相关文章

  • 第01课:技术成长的三阶段模型

    引言 作为整个系统课程的第一部分 xff0c 我想先跟大家分享的是如何选择技术方向 xff0c 我将结合技术成长的三阶段模型 xff0c 讨论在入行 构建技能树 技术转型 团队技术方案选型等常见场景中如何选择适合自己的技术 努力只有在方向正
  • 开篇词 | 程序员的成长课

    大家好 xff0c 我是安晓辉 xff0c 做过开发工程师 研发经理 技术总监等岗位 xff0c 现在自由职业 xff0c 专注写作和开发者生涯咨询 出版过 程序员的成长课 Qt Quick 核心编程 你好哇 xff0c 程序员 解忧程序员
  • const与define的区别

    1 define是预编译指令 xff0c const是普通变量的定义 xff0c define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量是在编译运行阶段使用的 2 const定义的是变量 xff0c 而define
  • 如何摆脱CRUD等打杂状态,从事更高价值工作

    每个月都会有十来个来询者向我抱怨工作低端 xff0c 程序员说自己每天CRUD xff0c 重复 枯燥 没技术含量 xff0c 销售助理说自己天天搜集客户信息 打印资料 帮老大带饭 xff0c 繁琐 无聊 不重要 xff0c 他们都说自己整
  • Windows下Qt 5.2 for Android开发入门

    Qt 5 2 发布了 xff0c 支持 Android 平台 xff0c 太好了 之前公司项目 xff0c 为了移植一个依赖 Qt 的程序到安卓平台上 xff0c 我自己交叉编译了 Qt Embedded 4 5 2 xff0c 费了老大劲
  • Qt Quick 之 QML 与 C++ 混合编程详解

    Qt Quick 技术的引入 xff0c 使得你能够快速构建 UI xff0c 具有动画 各种绚丽效果的 UI 都不在话下 但它不是万能的 xff0c 也有很多局限性 xff0c 原来 Qt 的一些技术 xff0c 比如低阶的网络编程如 Q
  • 漫谈程序员系列:一张图道尽程序员的出路

    推背图 相传由唐太宗时期的司天监李淳风和袁天罡合著 xff08 此两人其实是超级武学高手 xff0c 参见小椴的 开唐 xff09 xff0c 推算大唐以后中国两千多年的国运盛衰 xff0c 在中国七大预言书中居首 xff0c 是当之无愧的
  • 漫谈程序员系列:咦,你也在混日子啊

    戳你一下 xff0c 疼吗 xff1f 混日子的定义 来自百度百科的定义 xff1a 生活等方面过得不怎么好 xff0c 无目标 xff0c 混混沌沌 混日子 xff1a 即没有理想 xff0c 没有抱负 xff0c 糊里糊涂地生活 也指工
  • QtAndroid详解(1):QAndroidJniObject

    Qt 5 3之后 xff0c 新增了 QtAndroid 名字空间 xff0c 内有下列四个方法 xff1a QAndroidJniObject AndroidActivity int androidSdkVersion void star
  • freeSWITCH安装、配置与局域网测试

    这次来说说 freeSWITCH 的安装和配置 1 安装 freeSWITCH 下载页面 xff1a https freeswitch org confluence display FREESWITCH Installation 我们 Wi
  • 就 3 点,提升工作效率

    要想提高工作效率 xff0c 不论你看什么书 xff0c 看什么文章 xff0c 用什么工具 xff0c 只有下面这三点最重要 xff1a 动力剖析自己 xff0c 找到改善的切入点付诸行动并且坚持 目标驱动 有目标才能高效 我们爬山 xf
  • Python3 下 ROS 的使用 cv_bridge

    Python 3 下 ROSmsg 转 cv2 项目中用到的 Tensorflow2 4 的环境 xff0c 该环境只支持python3 版本 xff0c 项目中遇到不少需要和 ROS 交互的地方 xff0c 所以不断探索 python3
  • 深度图和RGB图对齐

    深度图 canny RGB canny Alignment xff1a code span class token function import span cv2 span class token function import span
  • 认识romfs文件系统

    1 1 什么是romfs romfs 是一个只读文件系统 xff0c 主要用在 mainly for initial RAM disks of installation disks 使用romfs 文件系统可以构造出一个最小的内核 xff0
  • Livox Lidar 特征提取方式总结

    传统的 旋转式雷达 xff0c 激光固定在雷达的旋转部件上 xff0c 依靠转子的转动而获得360的旋转视野 xff0c 由于旋转部件的存在 xff0c 为了获得更加精准的数据 xff0c 需要跟多的人工校准和更复杂的设计 xff0c 也因
  • C++ 菜鸟之路 (四) boost::thread 多线程全解析

    boost thread 的一般用法 boost thread的几个函数 锁 lock 函数多线程函数的限制 官方解释 xff1a http www cplusplus com reference thread thread joinabl
  • ROS 之 advertise 详解

    在学习过程中接触到如下的一段话 span class hljs comment ROS handles span ros span class hljs tag NodeHandle span node tf span class hljs
  • Linux 下 openMP 效率并未提升的解决方案

    OpenMP 正确观察计算时间OpenMP 经验总结 xff08 1 xff09 openmp 线程使用范围 xff08 2 xff09 openmp 多层嵌套的问题 OpenMP 正确观察计算时间 在使用 openmp的过程中 xff0c
  • C++ Yaml文件解析安装及使用 yaml-cpp

    C 43 43 Yaml文件解析安装及使用 安装 yaml cpp克隆官方库编译 yaml cpp 示例代码robot cpprobot yaml编译 robot cpp运行结果 难点分析与总结什么是 a 与 so 文件静态链接库 a 与动
  • 点云数据格式解析 sensor_msgs::PointCloud2

    在使用多线激光的时候需要总是会碰到点云数据 xff0c 这里简单的接受一下点云数据 xff0c 并堆数据结构进行分析 xff0c 方便自己后期对点云特征数据进行处理 文章目录 Rviz中的点云数据点云数据结构分析点云数据 python 解析

随机推荐

  • Arduino 读取GPS 数据发送解析并发布ROS topic(二)

    Arduino 读取GPS 数据发送解析并发布ROS topic 一 https blog csdn net Fourier Legend article details 84107494 概述 本部分将主要讲将串口接受到的数据 xff0c
  • LOAM进行点云地图创建

    3D激光点云数据处理入门 xff08 一 xff09 使用LOAM进行点云地图创建 LOAM 原理简述topic关系算法分析算法伪代码 LOAM 建图实践创建你的 ROS Workspace下载LOAM Package下载数据包运行 LOA
  • ROS - teb_local_planner 参数总结

    参考官方教程 http wiki ros org teb local planner Tutorials 全英文看着有点累 在此总结一下调试的过程和小小的经验 安装 teb local planner sudo apt get instal
  • 路径规划算法(2) - A*寻路算法 python实现及解析

    代码 span class token comment coding 61 utf 8 span span class token keyword import span math span class token comment 启发距离
  • 使用FSMC驱动LCD以及数据线偏移的问题

    FSMC的理解 使用FSMC功能将8080接口的LCD当外部RAM来使用 xff08 数据传给LCD时没经过内部SRAM xff0c 所以一帧图片很大也可以直接传 xff09 xff0c 根据STM的地址分配图可以看出外部RAM的地址由0x
  • C++调用HTTP实现方式

    转自 xff1a http blog 163 com lyz sea blog static 11558670720118245052189 Http访问有两种方式 xff0c GET和POST xff0c 就编程来说GET方式相对简单点
  • 跟我学c++中级篇——STL智能指针再述

    一 智能指针 xff08 smart pointer xff09 在前面的文章分析中对智能指针分析的还是比较多的 xff0c 这里把一具体的遗漏以及一些新的感悟再总结一下 xff0c 以之为鉴 什么是智能指针 xff1f 在C C 43 4
  • 从CAN到CANOpen——准入门大全(二)

    第二节 关于CAN ID xff1a 一个标准帧的ID共11位 xff0c 一个扩展帧的ID共29位 扩展帧的ID分11位和18位的两段 xff0c 如下图所示 RTR显性 xff1a 数据帧 xff1b 隐性 xff1a 远程帧 SRR隐
  • vscode使用clang-format格式化C++代码

    1 安装c c 43 43 插件 2 在首选项 设置中搜索format xff0c 设置Editor Default Formatter为ms vscode cpptools 3 在扩展C C 43 43 中设置 Clang format
  • EC20 GPS RMC格式数据转化

    文章目录 目录 前言 一 RMC是什么 xff1f 二 EC20 输出的RMC解析 1 EC20返回的RMC报文 2 RMC报文解析 3 NMEA数据ddmm mmmm转换成dd ddddd 4 RMC UTC时间转化成北京时间 总结 前言
  • C++ 第三方常用网络库

    From xff1a https www cnblogs com aitantianderuangutou p 11416902 html 1 ACE 庞大 复杂 xff0c 适合大型项目 开源 免费 xff0c 不依赖第三方库 xff0c
  • Postman 使用方法详解

    From xff1a https zhuanlan zhihu com p 534078123 Postman V9 16 绿色版汉化 xff1a https www cr173 com soft 1497202 html Postman是
  • 串口波形分析

    本文使用逻辑分析仪 xff0c 抓取串口波形 xff0c 进而分析串口数据 串口配置为115200波特率 xff0c 8个数据位 xff0c 1个停止位 xff0c 无校验方式 字符1的波形如下图 xff1a 从图中可以看到8个数据位 xf
  • 电影资源 BT PT下载的电影命名 规则 资源 详解

    初识 一般来说 xff0c 正规压制组压制的电影 xff0c 都采用 0day 命名方式 xff0c 即 xff1a 英文名称 版本说明 年份 片源 分辨率 视频编码 音频格式 压制小组 例如文件名 xff1a Jumanji The Ne
  • 对于51单片机的RAM内存分配(包含栈的分配)

    对于51单片机的RAM内存分配 xff08 包含栈的分配 xff09 我使用的是SH79F3283 xff0c 内部RAM有256字节 xff0c 由常规寄存器 静态存储区和堆栈组成的 xff0c 创建一个新的程序默认占用9个字节RAM x
  • 忘记windows密码解决办法(用户密码或SYSKEY)

    64 TOC 还有朋友问第一层的BIOS密码怎么解 xff1a 拔电池就能解 xff0c 断电 xff0c 打开电脑主板 xff0c 找到一个纽扣电池 xff0c 拔掉 xff0c 长按电源键 xff0c 再插电 xff0c 第一层就没了
  • 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树 Huffman Tree 以及哈夫曼编码的构造原理 方法 xff0c 并用代码实现 1哈夫曼树基本概念 路径 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度 两结点间路径上的分支数 树的路径长
  • Makefile命令参数、调用其他Makefile、嵌套

    更多单片机 嵌入式内容及参考资料 xff1a 大叔的嵌入式小站 xff1a Makefile学习 3 make命令参数 调用其他makefile 嵌套 一 Make命令运行参数 参数 参数的作用 C dir读入指定目录下的makefile
  • ARM学习-ARM指令集详解

    目录 1 ARM 存储器访问指令 1 1 LDR 和STR 加载 存储字和无符号字节指令 1 2 LDM和STM 批量加载 存储指令 1 3 SWP 寄存器和存储器交换指令 2 ARM 数据处理指令 2 1数据传送指令 2 1 1 MOV
  • IIC(I2C)协议详解

    1 简介 IIC 即I C xff0c 全称 Inter Integrated Circuit xff0c 字面上的意思是集成电路之间 xff0c 它其实是I C Bus简称 xff0c 所以中文应该叫 集成电路总线 xff0c 它是一种串