I2C总线基础知识及操作详解

2023-05-16

I2C总线是一种简单的双向两线式同步串行总线,最初由Philips公司开发,后又经过几次发展和完善,目前已被业界厂商广泛采用,成为最常用的板级通信总线之一,大量应用于处理器与外围设备芯片之间的通信。

1、物理连接

I2C总线由两条线组成:SCL时钟线负责收发双方的时钟同步,SDA数据线负责串行数据的传输。I2C总线支持多个设备同时挂接在同一条总线上,且支持多主机模式,也就是任一设备都可以作为主机发起通信,这就产生了较为复杂的冲突检测和仲裁逻辑。但实际应用中多主机模式极少用到,所以本篇文章不涉及多主机模式的内容,只讲解简单的单主多从这一模式,其典型的电路连接如下图所示。

图1 一主多从I2C通信示意图

如图1所示,I2C总线是由时钟线SCL和数据线SDA组成,连接到总线上的所有器件的SCL都连到一起,所有SDA都连到一起。I2C总线是开漏引脚并联的结构,因此通常外部要加上拉电阻。对于开漏电路外部加上拉电阻,就组成了线“与”逻辑。线“与”的意思是说,当所有接入的器件都输出高电平时,这条线才是高电平,而任何一个器件输出一个低电平,那这条线就会是低电平。作为从机的器件都有自己的地址,主机通过这个地址与不同的从机建立起通信连接并传输数据。

I2C总线速率最低不设限,速率上限分三种模式:标准模式为100kbps,快速模式为400kbps,高速模式可达3.4Mbps。所有I2C器件都支持标准的100kbps模式,当前大多数器件也已支持400kbps模式,但高速模式还是有很多器件不支持的。选择不同的总线速率还会对总线上拉电阻产生不同的要求,上拉电阻阻值通常在2k~10kΩ之间,总线速率越高电阻值应越小。

2、时序定义

I2C的典型时序图如下图所示。

图2 I2C通信时序图

(1) 总线空闲

总线上的设备都不驱动总线时,总线进入空闲状态,SCL与SDA均处于高电平。

(2) 起始信号Start

当 SCL 线为高电平时,SDA 线上出现下降沿,表明总线上产生了起始信号Start,标志着一次数据传输的开始。

(3) 数据传输

I2C总线规定数据按字节传输,即一次传输8个bit,数据位由SDA线传输,可以连续传输多个字节。传输数据位时SDA必须在SCL保持低电平时改变,而SCL为高电平时SDA必须保持不变。

(4) 应答ACK/NACK

发送方发送完8bit数据(一个字节)后,紧随的下一个时钟周期,发送方释放SDA线,接收方发送一个ACK/NAK信号,用于应答发送方接收状态。ACK表示接收方已成功接收数据,NACK则通常表示接收方因为“忙”或故障而没有成功接收数据。

(5) 停止信号Stop

当 SCL 线为高电平时,SDA 线上出现上升沿,表明总线上产生了停止信号Stop,标志着一次数据传输的结束。

3、数据格式

I2C总线上在起始条件产生之后的第一帧为寻址帧(一个字节),即主机对这个地址的从机进行寻址。I2C协议支持7位地址和10位地址两种模式,但实际应用中极少用到10位地址模式,所以本篇文章不涉及10位寻址模式,仅讲解7位寻址模式:寻址帧共有8个位,其中的高7位为从机地址,第8位是读/写位,用来决定后续数据帧传输的方向(0:写,主机至从机; 1:读,从机至主机)。

图3 I2C数据传输示意图

在实际操作中,SCL线始终由主机驱动,主机发送寻址字节的8bit时,SDA线自然也由主机驱动,8bit发送结束后,主机继续驱动SCL产生一个周期的时钟信号,同时主机释放SDA线,SDA线改由从机驱动,在SCL上升沿之后主机检测SDA线上的电平:如果SDA为低电平(ACK),则说明从机正确应答,可以继续传输数据;如果SDA为高电平(NAK),则说明从机因为“忙”或故障而不能继续,此时主机应放弃后续操作,并释放总线。

当寻址完成后,如果其中的读写位为0,则后续数据帧仍是由主机到从机,其SCL与SDA的操作与寻址帧完全相同;如果读写位为1,则后续数据帧是由从机到主机,此时SCL仍由主机驱动,同时主机释放SDA而由从机驱动,主机在每次SCL上升沿后读取SDA线上的数据,一个字节的数据传输完成后,应答位则由主机给出,通常来说ACK表示主机还要继续读数据,而NACK则表示不再继续读取数据。

4、重复起始

在不产生停止信号的情况下,起始信号可以在传输期间重复产生。这是一种特殊情况,称为重复起始,通常用于从从机的特定内部地址处读取数据。

比如I2C接口的存储器件EEPEOM,它除了自身的I2C设备地址外,在其内部还有存储地址,而通常我们都是要在其内部的存储地址上写入或读取数据。而其它大量具备较负责功能的器件,都具备寄存器地址这类东西,用于处理器对其进行配置与传输特定位置的数据。

对于此类器件,写数据时还是很简单的,在寻址字节后第一个(或多个)字节就是其寄存器地址(或存储地址),再之后的数据就是要在该地址(或从该地址开始)写入的数据,如下图所示。

图4 I2C器件数据写入典型操作

而读数据时,通常就会用到重复起始的操作了。首先,主机产生起始信号,并对从机进行寻址+写操作,后续写入一个(或多个)字节的寄存器地址(或存储地址);然后,主机再次产生起始信号(即重复起始),并对从机进行寻址+读操作,后续就可以从先前写入的地址处开始读取数据了,如下图所示。

图5 I2C器件数据读取典型操作

5、通信实例

下图是使用Kingst LA5016逻辑分析仪采集的EEPROM存储器的一段数据读取的波形。图中的绿圆点指示起始信号,红方块指示停止信号,中间过程中的白圆点指示数据位,白方块指示应答位。

图6 I2C接口EEPROM数据读取实例

从图中可以看到:第一个字节为寻址+写操作,第二个字节就是EEPROM内部的存储地址;然后是重复起始信号,紧跟着一个字节的寻址+读操作,再之后就是从之前传输的地址0x8E处开始的数据了,它们由从机EEPROM逐个送出,最后一个字节的应答位为NAK,表示数据到此结束。

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

I2C总线基础知识及操作详解 的相关文章

  • i2c总线最多可以挂多少个ic

    i2c总线最多可以挂多少个ic 有哪些因素决定 xff1f 1 由IIC地址决定 xff0c 8位地址 xff0c 减去1位广播地址 xff0c 是7位地址 xff0c 2 7 61 128 xff0c 但是地址0x00不用 xff0c 那
  • I2C总线和触摸屏驱动移植实战-linux驱动开发第9部分-朱有鹏-专题视频课程

    I2C总线和触摸屏驱动移植实战 linux驱动开发第9部分 9306人已学习 课程介绍 本课程是linux驱动开发的第9个课程 xff0c 主要内容是linux的I2C子系统以及电容触摸屏驱动的移植 学习本课程的核心点在于I2C子系统 xf
  • Linux 下 i2c switch(选路芯片mux) — pca9548

    作者 xff1a 韩大卫 64 吉林师范大学 现有的关于i2c switch 资料非常少 即使阅读完官方的datasheet 也不能写出完全正确的操作 因为内核中的驱动本身不是那么完善的 还有一些资料是单片机编程的 xff0c 可惜在lin
  • 十九、I2C驱动及应用

    一 概述 1 Linux主机驱动和外设驱动分离思想 外设驱动 API 主机驱动 板级逻辑 具体的i2c设备 xff08 camera xff0c ts xff0c eeprom等等 xff09 主机驱动 xff1a 根据控制器硬件手册 xf
  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • I2C驱动体系结构一:驱动软件概念与对应硬件的关系

    一 概念 xff1a 1 设备 xff1a struct device xff1a 该数据结构是对物理设备的软件抽象 xff0c 比如I2C slave xff08 对应i2c client xff09 和I2C 适配器 xff08 对应i
  • UART、RS232、RS485、I2C和SPI的介绍

    基本知识 串行通信 xff1a 多个数据通过一条数据线 xff0c 依次传输并行通信 xff1a 多个数据通过多条数据线 xff0c 一次性传输单工通信 xff1a 只能接收数据或者发送数据 xff08 遥控器 收音机 xff09 半双工通
  • I2C总线和SPI总线

    I2C串行总线一般有两根信号线 xff0c 一根是双向的数据线SDA xff0c 另一根是时钟线SCL I2C协议 2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL SDA传输数据是 大端传输 xff08 字节高位
  • I2C—读写EEPROM

    1 I2C协议简介 I2C通讯协议 Inter xff0d IntegratedCircuit 是由Phiilps公司开发的 xff0c 由于它引脚少 xff0c 硬件实现简单 xff0c 可扩展性强 xff0c 不需要USART CAN等
  • I2C接口及时序

    1 I2C学习要点 1 有2条双向串行线 xff0c 一条数据线SDA xff0c 一条时钟线SCL 如果只做master SCL可以只是输出 SDA在PAD上一定是inout pin xff0c 当然转为数字信号时可以分为两组 inout
  • 基于I2C/SPI的温湿度采集与OLED显示

    基于I2C SPI的温湿度采集与OLED显示 一 AHT20温湿度采集1 I2C2 温湿度采集代码效果 二 OLED显示1 显示学号姓名2 诗句显示 三 总结四 参考 一 AHT20温湿度采集 1 I2C 解释什么是 软件I2C 和 硬件I
  • STM32软件模拟I2C从机的实现方法

    1 1 前言 在使用I2C通信时 xff0c 一般会用到软件模拟I2C 目前网络上能搜索到的软件模拟I2C一般都是模拟I2C主机 xff0c 很少有模拟I2C从机的例程 由于I2C主机在进行数据收发时 xff0c 有明确的可预见性 xff0
  • STM32硬件I2C

    以I2C2为例子 硬件I2C不需要我们手动去翻转电平 首先配置I2C xff1a 配置GPIO xff0c 配置复用功能I2C 配置复用开漏 xff0c 使能I2C I2C起始条件函数 64 param I2Cx where x can b
  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的
  • Raspberry Pi上设置I2C LCD

    在本教程中 我将向您展示使用I2C设置LCD所需的一切 连接LCD I2C也被称为两线接口 因为它仅使用两根线来发送和接收数据 实际上 如果算上Vcc和地线 则是4线 但是电源始终可以来自其他来源 连接启用I2C的LCD 将LCD与I2C背
  • Raspberry Pi 4 I2C 总线无法正常工作

    尽管 i2cDetect 确实检测到目标 但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作 我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C
  • Windows IoT 和 DS3231 RTC 时钟

    对于我的项目 我需要当前时间和日期 不幸的是 当 RP2 关闭时 它就会失去一切 接下来的事情是 我将没有互联网连接来使用 NTP 为此 我需要实现 DS3231 RTC 模块 所有设备的通信都通过 I2C 运行 Raspberry Ard
  • 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取

    我正在尝试使用 C 写入和读取 I2C 总线 我的I2C总线是虚拟的 第一件事是加载内核模块i2c stub 我可以通过 bash 完成所有事情 现在我将其移植到 C 我可以打开i2c总线 获取特定地址的i2c总线 但无法读写 我正在虚拟化
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐

  • BW笔记(2011-10-24更新至No.237)

    1 同一个变量名的UID可能有多个 xff0c 记得注意 2 在查找时要注意技术名称还是名称 xff0c 因为查询时会在两个中进行 xff0c 模糊查询时要细心 xff0c FV与V都可以查到 3 复制的时候注意长度 xff0c 过长的会不
  • rpmsg 内核开发 用户层接口

    地址 xff1a https blog csdn net thisway diy article details 129195479 韦东山 Tina Linux E907开发指南 AMP 环境搭建 7 1 rpmsg 内核开发 7 2 r
  • __raw_writel, writel_relaxed 和 writel的区别

    因为对别的平台不了解 xff0c 下面仅谈它们在ARM上的区别 raw writel xff1a 因为有volatile关键字 xff0c 所以编译器不会打乱多个 raw writel的执行顺序 对于ARM而言 xff0c 当多个写以代码的
  • WFE和WFI的区别

    1 概念 xff1a WFI Wait for interrupt 和WFE Wait for event 是两个让ARM核进入low power standby模式的指令 xff0c 由ARM architecture定义 xff0c 由
  • Ubuntu16.04安装中文输入法

    转载地址 xff1a http blog csdn net suxiang198 article details 52040283 Ubuntu16 04安装完后 xff0c 和12 04以及14 04都不一样 xff0c 并没有中文输入功
  • QT linux安装

    转载地址 xff1a http www cnblogs com tangkaixuan p 6504102 html 文章来自https lug ustc edu cn sites qtguide 1 4 Qt在Linux下安装 Qt在Li
  • Linux CAN编程详解

    转载地址 xff1a http velep com archives 1181 html Linux CAN编程详解 是一篇百度文库上的文档 xff0c 主要描述了以下内容 xff1a can总线介绍及其帧类型 xff1b Linux 系统
  • buildroot学习(十)——at91sam9g45软件平台更新

    转载地址 xff1a https blog csdn net srf1986 article details 52474697 xff08 xff11 xff13 xff16 xff09 spice protocol In computin
  • killall 、kill 、pkill 命令详解

    转载地址 xff1a https www cnblogs com rsky p 4886043 html killall 命令 Linux系统中的killall命令用于杀死指定名字的进程 xff08 kill processes by na
  • PCIe扫盲——PCIe简介

    转载地址 xff1a http blog chinaaet com justlxy p 5100053066 PCI Express是继ISA和PCI总线之后的第三代I O总线 xff0c 即3GIO 由Intel在2001年的IDF上提出
  • Adaptive Autosar通讯层:ARA::COM中的Instance Identifiers

    一般概念 实例标识符 在收发两端都是要用的 是很核心的概念 proxy端用来搜索服务 xff0c skeleton端用来创建服务实例 站在API的角度来看 xff0c 这样的识别符是和特定的技术绑定的 所以 xff0c 标识符的结构和内容都
  • BW:数据源抽取机制(这篇是以前的笔记,写得很差,有不少错的地方,留着给自己看)

    题记 xff1a 忽然想到这么个问题 xff0c 后勤数据源和非后勤数据初始化有何区别 xff0c 然后进行周边的拓展 xff0c 所以就形成了下文 大部分知识源于 TBW350 和 SAP SDN 对数据源抽取机制的深入探讨 一 什么数据
  • 【ARA com API】ara::core::Optional

    文章目录 ara core Optional 是什么标准中的代码示例 ara core Optional 是什么 实际上就是std optional 但是当前的AP标准没有支持到那么新版本的C 43 43 标准 xff08 我没有具体研究是
  • ROS学习总结(1)--入门、学习路线

    最近由于项目需要 xff0c 我被分配到机器人驱动模块 xff0c 由此开始研究学习ROS xff0c 在此记录学习ROS的方法 过程 经历与应用 本节记录ROS学习路线 ROS xff08 robot operation system x
  • 使用uart数据起飞

    使用uart得到的位置信息进行起飞 在得到了位置信息的前提下 xff0c 我们开始进行模拟起飞 xff0c 即使用usb供电 xff0c 人工控制其高度 xff0c 在上位机查看油门大小 xff0c 电机的pwm输出 commander c
  • AirSim(五)---理解篇: Airsim世界坐标系、NED坐标系、机体坐标系以及控制相关API接口函数

    目录 1 坐标系 coordinate system 1 AirSim API的坐标系 xff1a NED 坐标系 with SI unit 2 Unreal Engine的坐标系 xff08 3 xff09 AirSim全局坐标系 61
  • 深度学习中常用的优化算法(SGD, Nesterov,Adagrad,RMSProp,Adam)总结

    深度学习中常用的优化算法 SGD Nesterov Adagrad RMSProp Adam 总结 1 引言 在深度学习中我们定义了损失函数以后 xff0c 会采取各种各样的方法来降低损失函数的数值 xff0c 从而使模型参数不断的逼近于真
  • 双系统安装ubuntu 22.04 LTS(一步到位)

    作为一个拥有两次都是一次成功安装好双系统的经验的人 xff0c 我觉得我可以借这个文章仔细讲述一下 xff0c 让大家都可以双系统安装都是一次成功 为什么有着两次安装经验呢 xff0c 第一次安装完成后由于电脑的内存不太够了 xff0c 然
  • UART、RS232、RS485 串行通信详解

    一 UART通信 UART是Universal Asynchronous Receiver Transmitter的缩写 xff0c 意即通用异步串行通信接口 xff0c 是最常用的通信技术之一 xff0c 广泛用于设备与电脑之间 设备与设
  • I2C总线基础知识及操作详解

    I2C总线是一种简单的双向两线式同步串行总线 xff0c 最初由Philips公司开发 xff0c 后又经过几次发展和完善 xff0c 目前已被业界厂商广泛采用 xff0c 成为最常用的板级通信总线之一 xff0c 大量应用于处理器与外围设