I2C 简介

2023-05-16

1. I2C 简介
这里的内容参考的是 2014.4.4 的 V.6 版本的官方 I2C-Bus 规格书 ,第六章有给出相应的链接 。
1.1 引脚
I2C 一般而言是一种同步半双工的通信方式 ,所以除了电源引脚之外 ,I2C 有时钟引脚 SCL 和数据引脚 SDA 。但需要注意 :在 V.6 版本中 ,I2C 在超快模式 (5Mbps)只能是单工通信 。
1.2 数据帧
在这里插入图片描述
图 1 I2C 主机传输数据帧
在这里插入图片描述
图 2 I2C 主机读取数据帧
如图 1 ,在主机写了从机地址 +‘0’(write) 之后 , 从机应答 ,后面可以接着写数据 ,从机再应答 ,最后是停止位 。注意 :理论上数据可以是 0 至无数个 。具体处理如下 :
(1) 空闲 :SCL 和 SDA 都是高电平 。
(2) 启动 :SCL 为高电平 ,SDA 从高到低转换 。
(3) 从机地址 / 数据 :8 位 ,从 MSB 开始传输数据 ;主机控制 SDA 。SDA 在 SCL 高电平期
间要保存稳定 ,在 SCL 低电平期间改变状态 。一个数据传输产生一个时钟脉冲 。(注意 :第一个数据是从机地址 + 写即‘0’)
(4) 应答 :在第 9 个时钟脉冲期间 ,主机释放 SDA 线 ,由从机控制 。拉低是正确应答 。
(5) 停止 :SCL 为高电平 ,SDA 从低到高转换 。一段时间 (<5μs) 内不能进行启动 。
注意 :若数据没传输完成 ,则一直通过循环 (3) 、(4) ,数据写完之后 ,进入停止情况 。
如图 2 ,在主机写了从机地址 +‘1’(read) 之后 , 从机应答 ,后面由从设备发送数据 ,主机应答 ,最后是停止位 。注意 :理论上数据可以是 0 至无数个 。具体处理与主机传输数据大致一样 ,但在 (3) 、(4) 部分有修改 :
(3) 从机地址 / 数据 :8 位 ,从 MSB 开始传输数据 ;总线传输从机地址时 ,主机控制 SDA ,
总线传输数据时 ,从机控制 SDA 。SDA 在 SCL 高电平期间要保存稳定 ,在 SCL 低电平期间改变状态 。一个数据传输产生一个时钟脉冲 。(注意 :第一个数据是从机地址 + 写即‘0’)
(4) 应答 :在第 9 个时钟脉冲期间 ,若是传输的是从机地址 ,主机释放 SDA 线 ,由从机控制 ;
若传输数据,则从机释放 SDA ,由主机控制 。拉低是正确应答 。
以上是最基础的数据帧格式 ,在实际中 ,都是组合这两种数据帧 。当然 ,(5) 中停止情况可能会换成重启动情况 。如图 3 所示 ,若数据传输完成之后主机仍然继续通信 ,可以产生重启动 ,但在最终一定要生成停止情况 。
在这里插入图片描述
图 3 I2C 总线上的数据传输
1.3 速率
I2C 总线共有几个传输模式 :
(1) 标准模式 (Sm) :最高可达 100Kbit/s
(2) 快速模式 (Fm) :最高可达 400Kbit/s
(3) 快速模式+ (Fm+) :最高可达 1Mbit/s
(4) 高速模式 (Hs) :最高可达 3.4Mbit/s
(5) 超快模式 (UFm) :最高可达 5Mbit/s (单工)
除了 UFm 模式 ,其他模式支持向下低速兼容 。
1.4 电气和时序相关
在此版本中 ,电平的‘0’和‘1’判断为 (单位为 :V ,并且不考虑 Hs 和 UFm 模式) :
(1) 输入低电平 (VIL) :-0.5~0.3VDD
(2) 输入高电平 (VIH) :0.7VDD~(VDD + 0.5) 或 5.5
(3) 输出低电平 (VOL) :0~0.4 (在 VDD > 2V 的情况下)
(4) 低电平输出电流 (IOL) :对 Sm 和 Fm 最小为 3mA ,Fm+ 为 20mA
这个限制了上拉电阻 Rp 的最小值 ,结合图 4 和图 5 提到的最大上升时间 tr 等 ,上拉电阻在一个范围之内 :
(VDD – VOL) / IOL ≤ Rp ≤ tr / (0.8473 * Cb)
在这里插入图片描述
图 4 Sm 、Fm 和 Fm+ 的时序图
在这里插入图片描述
图 5 Sm 、Fm 和 Fm+ 的时序特征
1.5 多主控制
2.1~2.4 简单介绍了 I2C 的基础功能 (7位地址) ,接下来介绍 I2C 总线的多主控制 。
I2C 总线是多主控总线 ,即连接到总线上的主机不止一个 (要注意在总线上被主机寻址的任何设备都是从机) ,而且总线上的主机没有任何优先顺序 ,此时如果两个或多个主机同时控制总线 ,就会出现竞争现象 ;在 I2C 中 ,通过时钟同步和仲裁决定那个主机顺利控制总线 (如果两个主机传输相同 ,那就都可以顺利完成) 。
(1) 时钟同步
仅在多主控制中需要 。简单来说 ,时钟同步就是想要控制总线的主机同时向 SCL 发送时钟 ,在这过程中 ,只要有任何一个主机发送的时钟是低电平 ,那么 SCL 线上的就是低电平 (那些低电平持续时间较短的主机将进入 SCL 是高电平的等待状态 ,只有 SCL 线上为高电平时 ,才开始高电平周期的计数) 。当且仅当所有控制总线的主机都发送高电平时 ,SCL 线上才是高电平 (当有一个主机时钟从高电平转换为低电平时 ,所有想要控制总线的主机时钟都将发出低电平 ,开始低电平周期) 。即可认为 :主机中低电平持续时间最长的决定了 SCL 线上的低电平周期 ,而主机中高电平持续时间最短的决定了 SCL 线上的高电平周期 。如图 6 为时钟同步示意图 。
在这里插入图片描述
图 6 时钟同步示意图
(2) 仲裁
时钟同步针对 SCL 线 ,仲裁针对的是 SDA 线 ,仲裁同样在多主控制中才有效 。
首先 ,在启动时 ,所有要控制总线的主机必须在 tHD :STA 时间 (详细见图 5 ) 内启动 ,
在这里插入图片描述
图 7 仲裁示意图
接下来将一位一位的进行仲裁 ,在 SCL 为高电平时 ,每个主机都要检查 SDA 电平与自身发送的电平是否匹配 ,如果不匹配则仲裁失败 ,仲裁失败的主机才关闭 SDA 的输出驱动器 ,但在仲裁失败的字节结束前 ,这个主机可以继续产生时钟信号 ,并且总线空闲时必须重新启动传输 (如果仲裁失败的主机有从机功能 ,该主机必须切换到从机模式) 。
在这里说明一下 ,因为 IIC 总线有线与功能 ,所以竞争时低电平胜出 。
除了上述之外 ,I2C允许从机将 SCL 拉低强制主机进入等待状态 ;地址不止有 7 位 ,还可以有 10 位 ;保留地址的用法等等 ,有兴趣可以查看相关资料 。
2. 参考资料
(1) NXP 官网 :《I2C-bus specification and user manual》
下载链接 :
https://www.nxp.com.cn/docs/en/user-guide/UM10204.pdf

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

I2C 简介 的相关文章

  • i2c信号的ACK与NACK

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 我们平时在调试I2C的时候可能很少去关注NACK信号 只知道如果Master发送数据 MSB先发 LSB后发 连续发送一个字节 8个bit 之后Slave会回复一个ACK
  • nRF52832的I2C例程代码

    nRF52832的I2C例程代码 include 34 nrf drv i2c h 34 include 34 app error h 34 define I2C SCL PIN 0 SCL引脚号 define I2C SDA PIN 1
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • UART、I2C、SPI接口常见面试问题总结

    UART 定义 xff1a Universal Asynchronous Receiver Transmitter 通用异步收发传输器 特点 xff1a 速率不快 可全双工 结构上一般由波特率产生器 UART发送器 UART接收器组成 xf
  • 【技术分享】GD32硬件I2C调试中的问题与解决过程-续

    使用GD32303C EVAL开发板和MPL3115A2模块测量气压或高度数据 xff0c 两者间使用硬件I2C进行通讯 上次调试发现官方例程 xff08 单一I2C读写功能 xff09 可以正常读写MPL芯片的寄存器 xff0c 而我建立
  • 关于I2C和SPI总线协议

    关于I2C和SPI总线协议 IICvs SPI 现今 xff0c 在低端数字通信应用领域 xff0c 我们随处可见IIC Inter Integrated Circuit 和 SPI Serial Peripheral Interface
  • I2C通讯协议介绍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线 具有引脚少 xff0c 硬件实现简单 xff0c 可扩展性强的优点 I2C总线的另一优点是支持多主控 xf
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A
  • Linux控制I2C/SMBus设备

    平台 xff1a 树莓派 bcm2835 Raspberry Pi 3 Model B Rev 1 2 I2C是Philips开发的一种两线通信协议 xff0c 常用于一些对速度要求不高的小型器件上 SMBus是系统管理总线 xff0c 基
  • stm32的HAL库i2c从机实现

    stm32的i2c默认就是slave模式 xff0c 本文基于HAL库实现中断方式的接收和发送 xff0c 首先是初始化gpio和i2c xff0c 代码如下 xff1a I2C HandleTypeDef I2cHandle void H
  • 海思文件系统缺少文件himm 、i2c_read 、i2c_write 、ssp_read 、ssp_write

    原因 xff1a 海思根文件默认没有把himm i2c read i2c write ssp read ssp write工具集成在bin里 xff0c 但是在sdk中 解决办法 xff1a cd osdrv tools board reg
  • Arduino读取DHT11的温湿度显示在基于I2C的1602上

    背景摘要 又到了周末 xff0c B站的番还未更新 闲来无事 xff0c 搞搞吃灰已久的Arduino 南方的冬天真冷啊 xff0c 测测屋子里的温湿度怎么样 xff01 为了测量屋子里的温湿度 xff0c 就用简单大方的Arduino x
  • linux内核I2C子系统详解——看这一篇就够了

    1 I2C通信协议 参考博客 I2C通信协议详解和通信流程分析 2 通过KXTF9 2050芯片分析I2C协议 参考博客 通过KXTF9 2050芯片分析I2C协议 3 I2C子系统框架 1 I2C子系统分为三层 I2C核心层 I2C适配器
  • STM32设置为I2C从机模式(HAL库版本)

    STM32设置为I2C从机模式 HAL库版本 目录 STM32设置为I2C从机模式 HAL库版本 前言 1 硬件连接 2 软件编程 2 1 步骤分解 2 2 测试用例 3 运行测试 3 1 I2C连续写入 3 2 I2C连续读取 3 3 I
  • I2C接口

    I2C的结构和特点 他是一具有两条总线线路 即一条串行数据线SDA和一条串行时钟线SCL 每个连接到总线上的器件都可以通过唯一的地址联系主机 它是一个真正的多主机总线 数据传输通过冲突检测和仲裁防止数据被破坏 串行的8位双向数据传输位速率更
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04
  • 如何将 I2C 地址传递给 Adafruit CircuitPython 代码? (运行 ADS1115)

    我正在尝试使用两个 I2C 地址 0x48 0x49 在一个 Raspberry Pi 上运行两个 Adafruit ADS1115 每个设备的地址可以通过将 ADDR 引脚连接为高电平 0x49 或使其悬空 默认为 0x48 来设置 我已
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并

随机推荐

  • Nestjs 返回req报错

    返回req存在循环引用 报错 ERROR ExceptionsHandler Converting circular structure to JSON gt starting at object with constructor Sock
  • 设计方法的选用

    六大原则 创建好了之后算法不常变的 xff0c 比如计算器的加减乘除逻辑 xff0c 就可以用简单工厂模式 要是像商场收银机对打折等促销的处理 xff0c 若用简单工厂模式也可以 xff0c 不过要在工厂内创建多个具体的打折方案 xff0c
  • XXX测试用例设计?XXX怎么测试?(行李箱、电梯、水杯、笔、椅子)

    首先要知道 xff0c 答案要从下面6个方向考虑 xff1a 功能测试 界面测试 易用性测试 兼容性测试 安全性测试 性能测试 其次 xff0c 在回答问题前要向面试官表明 xff1a 我不知道XXX的具体需求 xff0c 所以会以我认知的
  • 面试——测试基础理论

    测试先导性知识 测试是什么 xff1f 在规定的条件下对程序进行操作去发现错误 xff0c 然后对软件质量进行评估的一个过程 需要注意的是 xff0c 软件是由文档 数据以及程序组成的 xff0c 所以对软件测试应该包括 xff1a 软件形
  • 【ubuntu16.04 LTS】 ping www.baidu.com不通

    想更新一个软件包 xff0c 发现ubuntu不能正常更新 xff0c 结果ping www baidu com不通 xff0c 但是ping ip 可能 xff0c 所以认为是DNS没有配置 解决方法 xff1a 1 xff0c 既然能p
  • 小鼠试毒问题(二进制)

    1000桶酒 xff0c 其中1桶有毒 而一旦吃了 xff0c 毒性会在1周后发作 问最少需要多少只老鼠可在一周内找出毒酒 如题 分析思路 xff1a 要用尽可能少的老鼠完成相对大的任务量 xff0c 要想到把问题进行对数分解 从而不难想到
  • wsl,Ubuntu,关于解决E: Could not read response to hello message from hook [ ! -f /usr/bin/snap ] || /usr/

    大坑 出现问题 xff1a 今天安装mysql xff0c sudo apt span class token operator span get install mysql span class token operator span s
  • wsl,win10子系统Ubuntu,安装mysql过程及坑

    一 安装 sudo apt span class token operator span get install mysql span class token operator span server 二 启动服务 注意 xff1a 先停止
  • 外接显示器调亮度解决方案(最低亮度后还是很亮)

    出现的问题 xff1a 手动调显示屏调亮度的键 xff0c 发现调到最低亮度后还是很亮 解决方案 xff1a 使用显卡设置来调整 win10 xff1a 桌面右键 英特尔显卡设置 显示器 颜色设置 选择显示器 应用
  • Java-线程,多线程同步安全案例,多窗口卖票一共有 50张票 ,4个窗口出售,打印出票售出的顺序。

    一共有 50张票 xff0c 4个窗口出售 xff0c 打印出票售出的顺序 span class token keyword package span com span class token punctuation span proble
  • tcp连接的select

    tcp的socket不同于udp tcp xff1a 建立socket的fd xff1b bind xff1b listen xff1b accept xff1b send or recv 另一端connect xff08 客户端 xff0
  • ROS NOETIC 思岚激光雷达A2M8启动历程

    Ubuntu20 04系统 xff0c 装的ROS对应为NOETIC版本 第一个bug 一直在catkin make这里出错 xff0c 我的工作空间 xff08 我也命名为catkin ws xff09 在catkin make之后 xf
  • 解决ubuntu网络调节助手之后打不开

    解决ubuntu安装deb文件之后打不开问题 xff08 安装libqtgui4 amd64 xff09 安装Ubuntu网络调试助手 链接 xff1a https pan baidu com s 1GSq pi1FOZxHFnY7PMBh
  • VSCODE中运行C语言(从安装到运行详细版)

    VSCODE中运行C语言 xff08 从插件安装到运行详细版 xff09 一 下载安装MinGW w64 官方下载网站 xff1a MinGW 64 往下来进入下一张页面图 xff0c 选择要下载的文件 二 环境变量配置 按照上面的步骤全部
  • 【ubuntu16.04 LTS】ping百度通,但浏览器打不开百度网页

    典型的DNS配置问题 1 xff0c 执行如下命令 span class token function sudo span span class token function vi span etc resolv conf 在文件最后添加
  • VLAN类型

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN类型 一 基于端口的VLAN xff1a 基于端口的VLAN是最简单 最有效的VLAN划分方法 xff0c 它按照设备端口来定
  • STM32开发(三) 使用printf 重定位到串口输出|CSDN创作打卡

    上一篇 主目录 下一篇 文章目录 背景 KEIL MDK环境下printf重定位串口输出 第一步 在KEIL MDK中使用MicroLIB如图中勾选 第二步 STM32Cube MX异步配置 第三步 KEIL代码演示 代码使用Cube 注意
  • 总线(二)CAN通讯协议介绍

    文章目录 CAN xff08 Controller Area Network xff09 是什么 xff1f 总线拓扑图CAN特征CAN协议数据帧遥控帧遥控帧和数据帧相关 xff1f 仲裁优先级决定数据帧和遥控帧的优先级标准格式和扩展格式的
  • CAN 简介

    1 目的 本文主要介绍一部分 CAN 协议层 2 CAN 简介 这里的内容参考的是 1991 9 的 2 0 版本的官方 CAN 规格书 2 1 概述 CAN 控制器局域网 是一种串行通讯协议 xff0c 传输速度可达 1Mbit s 总线
  • I2C 简介

    1 I2C 简介 这里的内容参考的是 2014 4 4 的 V 6 版本的官方 I2C Bus 规格书 xff0c 第六章有给出相应的链接 1 1 引脚 I2C 一般而言是一种同步半双工的通信方式 xff0c 所以除了电源引脚之外 xff0