I2C总线接口
I2C(IIC,Inter一Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。
在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。
如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。
如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接文从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产主定时时钟和终止数据传送。(i2c核心控制方)
特征
I2C总线特点可以概括如下:
在硬件上,I2C总线只需要一根数据线和一根时钟线两根线,总线接口已经集成在芯片内部,不需要特殊的接口电路,而且片上接口电路的滤波器可以滤去总线数据上的毛刺。因此,I2C总线简化了硬件电路PCB布线,降低了系统成本,提高了系统可靠性。因为I2C芯片除了这两根线和少量中断线,与系统再没有连接的线,用户常用IC可以很容易形成标准化和模块化,便于重复利用。
- I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址。
- 任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
- 数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工。
- I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也利于标准化和模块化,缩短开发时间。
连接到相同总线上的IC数量只受总线最大电容的限制,解决方法可以增加总线驱动器
I2C协议的5种速率工作模式
I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率。
- 标准模式(Standard):100kbps
- 快速模式(Fast):400kbps
- 快速模式+(Fast-Plus):1Mbps
- 高速模式(High-speed):3.4Mbps
- 超快模式(Ultra-Fast):5Mbps(单向传输)
地址
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址 通过物理接地或者拉高,可以从I2C器件的数据手册得知,如AT24C02芯片,7位地址依次1010xxx,最低三位可配,128位,如果全部物理接地,则该设备地址为0x50,主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把STM32作为主设备,把挂接在总线上的其他设备都作为从设备。
I2C总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址的基础上,也就是说,主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程样,只不过大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。
速度
I2C总线上可挂接的设备数量受总线的最大电容400pF限制如果所挂接的是相同型号的器件,则还受器件地址位的限制。
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据
传输。
空闲状态
数据线和时钟线都处于空闲状态
起始和停止信号
I2C协议规定,总线.上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件(在通信时只有一个主机能够让从机开始工作)。起始和结束信号总是由主设备产生。
起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;
而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。
响应应答(通信可靠性)和非响应应答
主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如当从设备不能再接收主设备发送的数据时,从设备将回传一个非响应应答位。
响应应答信号
I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。
应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。
时序图
I2C总线操作
特征
I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操
作情况:
主设备往从设备中写数据。
主设备在从设备中读数据。
主设备往从设备中写数据,然后重启起始条件,紧接着在从设备中读取数据;
或者是主设备在从设备中读数据,然后重启起始条件,紧接着主设备往从设
备中写数据。
主设备往从设备寄存器中写入数据
当你要向从设备的特定寄存器中写入数据时,可以按照以下详细步骤进行操作:
-
启动通信:发送开始信号(Start)来启动I2C通信。
-
发送从设备地址和写操作位:通过I2C总线发送从设备的地址,并设置写操作位(W)。
-
等待应答:等待从设备发送应答信号(ACK)确认地址已成功接收。如果没有收到应答,则可能出现连接问题或设备故障。
-
发送寄存器地址:发送要写入的寄存器地址给从设备,告诉它需要将数据写入哪个寄存器中。根据从设备的规格,确定正确的寄存器地址,并通过I2C总线发送。
-
等待应答:等待从设备发送应答信号(ACK)确认寄存器地址已成功接收。
-
发送数据:将要写入的数据传输到从设备的寄存器中。根据从设备的规格和寄存器的数据格式,确定正确的数据并通过I2C总线发送。
-
等待应答:等待从设备发送应答信号(ACK)确认数据已成功接收。
-
如果需要连续写入多个寄存器,重复步骤4至步骤7,每次发送新的寄存器地址和相应的数据。
-
结束通信:发送停止信号(Stop)来结束I2C通信。
主设备往从设备寄存器中读数据
要从从设备的寄存器中读取数据,可以按照以下步骤进行操作:
-
启动通信:发送开始信号(Start)来启动I2C通信。
-
发送从设备地址和写操作位:通过I2C总线发送从设备的地址,并设置写操作位(W)。
-
等待应答:等待从设备发送应答信号(ACK)确认地址已成功接收。
-
发送寄存器地址:发送要读取的寄存器地址给从设备,告诉它需要从哪个寄存器中读取数据。根据从设备的规格,确定正确的寄存器地址,并通过I2C总线发送。
-
等待应答:等待从设备发送应答信号(ACK)确认寄存器地址已成功接收。
-
重新启动通信:发送重新启动信号(Repeated Start),以便将通信转换为读操作。
-
发送从设备地址和读操作位:通过I2C总线发送从设备的地址,并设置读操作位(R)。
-
等待应答:等待从设备发送应答信号(ACK)确认地址已成功接收。
-
从设备读取数据:从从设备读取寄存器中的数据。根据从设备的规格和寄存器的数据格式,确定正确的读取方式,如读取一个字节或多个字节。
-
发送不应答信号:如果只需要读取一个字节数据,可以发送不应答信号(NACK)来告诉从设备这是最后一个要读取的字节。
-
结束通信:发送停止信号(Stop)来结束I2C通信。
一次完整的数据传输
数据有效性
I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
图来源
一文看懂I2C协议 - 知乎 (zhihu.com)