Fork me on GitHub
0%

I2C

简介

概念

I2C:Inter-Integrated Circuit,内部集成电路。作为一种广泛使用的串行通信协议,通过双线接口使多个电子设备能够彼此通信。它由飞利浦半导体(现在的恩智浦半导体)在上世纪80年代初开发,并且后来成为了业界事实上的标准。

BUS:总线。早期的计算机体积庞大,连线复杂,所有数据都通过实际的电缆传输,这变得非常混乱。把这些大捆的杂乱的电缆线,有序的布置在一个公共线排上,这些规则排列在一起的公共线束就是术语“总线”的早期来源,用BUS表示。在计算体系结构中, 总线(Bus)是计算机内部组件之间或计算机之间传送信息的公共通信干线,它是由导线组成的传输路径。

特征

  • 工作模式:半双工,某一时刻要么发要么收

  • 总线接口:双线,串行数据线(SDA)、串行时钟线(SCL)

  • 寻址:总线上的每个设备都有唯一的地址,允许主设备与特定从设备通信。地址空间支持最多128个设备,但由于一些保留地址,可用范围会减少。

  • 设备功能:功能允许的情况下,每一个设备都可以做主设备或从设备(可收可发)

  • 同步通信:总线上的通信是同步的,意味着时钟信号由主设备产生,数据按位在数据线上与时钟同步传输

  • 位级确认:在发送每个字节的数据后,接收设备通过拉低数据线(SDA)来确认成功接收。如果没有收到确认,则表示发生错误。

  • 多主支持:支持多主通信,允许多个主设备同时存在于同一总线上。通过主设备仲裁机制,确定哪个主设备在任何时刻控制总线。

  • 传输速率:标准模式下可达 100kbit/s,快速模式下可达 400kbit/s, 高速模式下可达 3.4Mbit/s

  • 最大设备量:连接到相同总线的 IIC 数量只受到总线的最大电容 400pF 限制(128个唯一设备地址)

  • 其它:片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整

拓扑结构

image

I2C协议采用主——从架构,其中一个设备(主设备)启动和控制通信,而一个或多个设备(从设备)响应主设备的命令。I2C使用的两根通信线是串行数据线(SDA)和串行时钟线(SCL)。总线空闲时,两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能

协议

数据有效性

image

SDA上的数据必须在SCL的高电平周期保持稳定,SDA高或低电平状态只有在 SCL 时钟信号是低电平时才能改变

起始结束条件

image

在5.1中对于数据有效性做了规范,时钟线高电平数据线不能动。因此对于起始和结束条件一定是在SCL高电平,具体是这样规定的:SCL高电平,SDA由高到低电平的切换表示开始传输;SCL高电平,SDA有低到高的电平切换表示传输结束。

起始结束条件一般是由主机产生,总线在起始条件后被认为处于忙(BUSY)的状态,在停止条件的某段时间后总线被认为再次处于空闲(IDLE)状态

传输单元

I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输,并且每个字节后面必须跟一个响应位。

总线操作

流程

image

  • 起始条件
  • master将7位从设备地址 + 1位读写标志位 写到总线
  • 从设备通过发送确认位 (ACK) 作为反馈来响应总线上存在具有正确地址的从设备并等待进一步通信的主设备
  • 通信
  • 结束条件

类型

  • master write to slave

  • master read from slave

  • 读写方向交叉,重复传输(主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据)

    START ADDR R/W ACK DATA ACK START ADDR R/W ACK DATA ACK STOP
    XX XX XX XX

写入方式

在I2C通信中,有两种常见的写入方式:字节写入(Byte Write)和页写入(Page Write)。具体使用哪种写入方式取决于从设备的支持和应用需求。有些从设备可能只支持字节写入,而有些设备可能支持页写入。在开发过程中,需要参考从设备的规格和文档,确定合适的写入方式。

字节写入(Byte Write)

字节写入:字节写入是一种逐个字节写入数据的方式。在字节写入中,每个数据字节都会带有一个ACK(应答)信号,表示接收方正确接收了数据。主机发送一个字节后,等待从设备发送ACK信号,然后再发送下一个字节。这种方式适用于单个字节的数据传输或者在寄存器中写入单个字节的情况。

页写入(Page Write)

页写入:页写入是一种批量写入数据的方式。在页写入中,主机可以连续写入多个字节的数据,而不需要每个字节都等待ACK信号。主机发送一系列字节后,等待从设备发送一个ACK信号,表示接收方正确接收了一组字节。这种方式可以提高写入数据的效率,尤其在写入大量数据时。

需要注意的是,对于页写入,有一个页的大小限制。页的大小是指从设备支持一次连续写入的最大字节数。超过页的大小进行写入操作可能会导致数据丢失或错误。因此,在使用页写入时,需要确保写入的数据量不超过从设备规定的页大小。

开发注意事项

  • 电平兼容性:确保I2C总线上的所有设备和主控制器的电平兼容。确认设备和主控制器使用相同的电源电压和电平标准(如3.3V、5V等),以避免电平不匹配导致的通信问题。
  • 电源稳定性:提供稳定的电源供应给I2C设备,确保电源电压和电流满足设备的要求。电源的波动和噪声可能会对I2C通信产生干扰,导致通信错误或故障。
  • 电缆长度和布线:I2C通信的可靠性与电缆长度和布线有关。确保电缆长度不超过I2C标准规定的最大长度,并避免电缆过长或扭曲的情况。同时,布线应避免与电源线、高频干扰源等信号相互干扰。
  • I2C地址冲突:I2C设备的地址应唯一,不得出现地址冲突。在设计时,仔细选择和分配每个I2C设备的地址,确保各设备地址不重复。
  • 时钟频率选择:根据I2C设备的要求和总线长度,选择合适的时钟频率。过高的时钟频率可能导致信号失真或通信错误,而过低的时钟频率可能导致通信速度较慢。
  • 错误处理和超时机制:在I2C通信中,可能会发生错误,如设备未响应、总线冲突等。在开发中,应实现适当的错误处理和超时机制,例如设置适当的超时时间和错误处理策略,以确保程序的鲁棒性和可靠性。
  • 适当的延时:I2C通信需要一些延时以确保数据传输的稳定性。在编程时,根据具体设备的要求和I2C标准,适当添加延时以确保数据的正确传输。
  • 电容限制:I2C总线上的电容负载应在规定范围内。过高的电容负载可能导致信号波形变形和传输错误。在设计中,需要根据I2C标准和设备规格表的要求,控制电容负载并添加必要的电容补偿。
  • 适当的软件实现:编写I2C通信的软件实现时,需要确保正确地操作I2C控制器和设备的寄存器。遵循I2C通信的协议和流程,正确设置起始条件、地址、读写位和数据传输。

Q&A

  1. 从设备的设备地址是自定义的吗?

    在大多数情况下,I2C设备的地址是由设备制造商提供的,并由开发人员在软件开发过程中进行配置和使用。一般来说,I2C设备的地址是一个7位的值,有时也可以是10位。7位地址模式下,地址范围是从0x00到0x7F,其中一些地址是保留地址或用于特定目的的预定义地址。

  2. 为什么I2C总线不能太长?

    过长的总线长度可能会引起信号失真、时序问题以及通信错误。这是由于I2C总线使用的是开漏架构和电容负载的特性所决定的。

    I2C总线的长度限制是由总线的电容负载和通信速率决定的。较长的总线长度会引入额外的电容负载,这会导致信号的上升和下降时间变慢,从而影响信号的稳定性和正确传输。此外,总线长度过长也会增加信号的传输延迟,导致时序问题。

    根据I2C标准规范,对于标准模式(Standard Mode)的I2C总线,总线长度应在3-5米范围内。对于高速模式(High-Speed Mode)的I2C总线,总线长度则更短,通常不超过1米。

参考资料