一文读懂I2C总线 (超详细配42张高清图)
I2C(Inter-Integrated Circuit)通信总线,作为嵌入式系统设计中的一个关键组成部分,其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析,包括其基本概念、特点、通信协议,以及在不同场景下的高级应用和最佳实践。I2C接口只有2根信号线,总线上可以连接多个设备,硬件实现简单,可扩展性强。I2C通信协议可以用普通GPIO引脚进行软件模拟。I2C接口主要用于通讯速率要求不高,以及多个器件之间通信的应用场景。
1. I2C总线历史
I2C(Inter-Integrated Circuit)总线是一种重要的串行通信协议,它的历史可以追溯到上世纪80年代初期。以下是对I2C总线历史的详细介绍:
- 起源:
- I2C总线技术由荷兰的飞利浦半导体(现在的恩智浦半导体)在1982年开发。最初,这项技术是为了在电视机内部实现简单、高效、低成本的通信而设计的。
- 设计目标:
- 设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量,同时也降低制造成本。通过使用只有两根线的通信总线,它有效地减少了器件间连接的复杂性。
- 技术发展:
- 随着技术的成熟和普及,I2C协议得到了广泛的应用和扩展。从最初的标准模式(100kHz),发展到快速模式(400kHz)和高速模式(3.4MHz)。
- 标准化和开放:
- 虽然最初由飞利浦半导体开发,但I2C协议后来被标准化并广泛应用于多种设备中。飞利浦半导体放弃了对这项技术的专利权,使其成为开放标准。
- 广泛应用:
- I2C技术由于其简单性和有效性,已成为嵌入式系统设计中不可或缺的一部分。
2. I2C通信总线基本概念
I2C是一种多主机、两线制、低速串行通信总线,广泛用于微控制器和各种外围设备之间的通信。它使用两条线路:串行数据线(SDA)和串行时钟线(SCL)进行双向传输。
特点
-
两线制总线:I2C仅使用两条线——串行数据线(SDA)和串行时钟线(SCL)进行通信,有效降低了连接复杂性。
-
多主多从设备支持:I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一的地址。
-
可变的时钟速率:I2C总线支持不同的速率模式,如标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。
-
同步通信:I2C是一种同步通信协议,数据传输由时钟信号(SCL)来控制。
-
简单的连接:I2C通信对硬件的要求比较低,很容易在微控制器和外围设备间实现连接。
-
地址分配:每个I2C设备都通过一个7位或10位的地址来识别,这使得总线上可以连接多个设备。
-
阻塞传输:I2C支持阻塞传输机制,即主设备可以在传输过程中控制总线,防止其他设备发送数据。
-
应用广泛:由于其简单和灵活性,I2C被广泛应用于各种电子产品中,如传感器、LCD显示器、EEPROM等。
-
总线仲裁和冲突检测:在多主模式下,I2C能够处理多个主设备同时尝试控制总线的情况。
-
低功耗:I2C总线的设计使其成为低功耗的通信方式,适用于电池供电的设备。
基本特征
- 总线结构:
- 两线制:使用两条线进行通信,分别是串行数据线(SDA)和串行时钟线(SCL)。
- 多主多从结构:支持多个主设备和多个从设备连接到同一总线上。
- 通信方式:
- 同步串行:数据传输同步于时钟信号。
- 字节格式:每个字节由8位数据构成,加上开始和停止条件以及可选的应答位。
- 时钟速率:
- 支持多种速率,包括标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。
工作原理
- 总线控制:
- 开始和停止条件:通信由主设备通过在SDA线上生成特定的信号模式来开始和结束。
- 地址帧:每次通信开始时,主设备发送一个地址帧来指定与之通信的从设备。
- 数据传输:
- 主从通信:主设备控制时钟信号,向从设备发送或接收数据。
- 应答位:每个字节后,接收方
发送一个应答位(ACK)或非应答位(NACK),以告知发送方数据是否被成功接收。
地址和仲裁
- 设备地址:
- 7位或10位地址:每个I2C设备都有一个唯一的地址,允许在同一总线上连接多个设备。
- 总线仲裁:
- 在多主模式下,当两个主设备同时尝试控制总线时,I2C协议包含仲裁机制以决定哪个设备获得控制权。
3. I2C数据传输流程
数据信号以8位的序列传输。所以在特殊的开始条件发生后,就会出现第一个8位序列,它指示了数据被发送到哪个从设备的地址。每个8位序列之后都会跟随一个称为确认的位。
在大多数情况下,第一个确认位之后会跟着另一个寻址序列,但这次是针对从设备的内部寄存器。在寻址序列之后是数据序列,直到数据完全传输完毕,并以一个特殊的停止条件结束。
开始条件发生在数据线在时钟线仍然高电平的时候变低。之后,时钟开始,并且在每个时钟脉冲期间传输每一位数据。设备寻址序列从最重要的位开始,以最不重要的位结束,实际上是由7位组成的,因为第8位用于指示主设备是向从设备写入(逻辑低)还是从中读取(逻辑高)。
下一个确认位由从设备用来指示它是否成功接收了前一个位序列。所以这次主设备将SDA线的控制权交给从设备,如果从设备成功接收了前一个序列,它将把SDA线拉低到所谓的确认状态。
如果从设备没有把SDA线拉低,这种状态被称为不确认,意味着它没有成功接收前一个序列,这可能由多种原因造成。例如,从设备可能正忙,可能不理解接收到的数据,或者不能再接收任何数据等等。 在这种情况下,主设备决定如何继续操作。
接下来是内部寄存器的寻址。内部寄存器是从设备内存中包含各种信息或数据的位置。
<