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总线和触摸屏驱动移植实战-linux驱动开发第9部分-朱有鹏-专题视频课程

    I2C总线和触摸屏驱动移植实战 linux驱动开发第9部分 9306人已学习 课程介绍 本课程是linux驱动开发的第9个课程 xff0c 主要内容是linux的I2C子系统以及电容触摸屏驱动的移植 学习本课程的核心点在于I2C子系统 xf
  • I2C读取IST8310

    文章目录 I2C简介I2C传输过程I2C仲裁IST8310磁力计Cube配置相关函数HAL I2C Mem Read函数HAL I2C Mem Write函数IST8310的初始化 程序流程代码编写 I2C简介 2C是一种半双工双向二线制的
  • 关于I2C和SPI总线协议

    关于I2C和SPI总线协议 IICvs SPI 现今 xff0c 在低端数字通信应用领域 xff0c 我们随处可见IIC Inter Integrated Circuit 和 SPI Serial Peripheral Interface
  • I2C总线基础知识及操作详解

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

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

    GPIO xff0c I2C xff0c SPI xff0c UART xff0c USART xff0c USB的区别 1 简单区别 xff1a 1 xff09 GPIO xff08 General Purpose Input Outpu
  • 基于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的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
  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Arduino读取DHT11的温湿度显示在基于I2C的1602上

    背景摘要 又到了周末 xff0c B站的番还未更新 闲来无事 xff0c 搞搞吃灰已久的Arduino 南方的冬天真冷啊 xff0c 测测屋子里的温湿度怎么样 xff01 为了测量屋子里的温湿度 xff0c 就用简单大方的Arduino x
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的
  • 尝试通过 I2C 从 Arduino 获取数据时,出现 IOError:[Errno 121] python(树莓派)上的 smbus 远程 I/O 错误

    我遇到了问题 在启动通过 I2C 从 Arduino 请求数据的脚本时 python 有时会在我的 raspberry pi 3 上抛出这个 IOError 电气连接是完美的 所以这不是问题 此外 我在使用 i2cget y 1 0x04
  • Linux:从用户空间实例化:eeprom new_device

    环境 x86 Ubuntu 14 04 我想获得类似的东西 i2c0 eeprom eeprom 50 compatible at 24c32 reg lt 0x50 gt 但因为在 x86 中没有可用的设备树 所以我遵循i2c insta
  • 如何在 QEMU x86 上模拟 i2c 设备?

    我正在研究 QEMU 1 5 1 6 但还没有看到任何在 i2c 总线上添加设备的文档 有人可以帮忙吗 Thanks 好吧 没人对这个问题感兴趣 我发布我自己的解决方案 由于 QEMU 不支持 I2C 总线级数据传输 因此在将多点触摸数据从
  • docker 容器内的 I2C

    我正在尝试在 docker 容器内的树莓派上使用 i2c 引脚 我使用 RUN 安装所有模块 但是当我使用 CMD 运行我的 python 程序时 我收到一条错误消息 Trackback most recent call last file
  • 在 Raspberry Pi 上使用 Python smbus - 与语法混淆

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • 如何转换温度传感器得到的值?

    我在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 大量应用于处理器与外围设