一、I2C总线
1.1、I2C总线简介
IIC(Inter-Integrated Circuit)
总线是一种由
PHILIPS
公司开发的两线式串行总线,用于连接微控制器以及其外围设备。它是由数据线 SDA
和时钟线
SCL
构成的串行总线,可发送和接收数据,在 CPU
与被控
IC
之间、
IC
与
IC
之间进行双向传送。
IIC
总线有如下特点:
(1)总线由数据线
SDA
和时钟线
SCL
构成的串行总线,数据线用来传输数据,时钟线用来
同步数据收发。
(2)总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时
序就可以实现微控制器与器件之间的通信。
(3)数据线
SDA
和时钟线
SCL
都是双向线路,都通过一个电流源或上拉电阻连接到正的电
压,所以当总线空闲的时候,这两条线路都是高电平。
(4)总线上数据的传输速率在标准模式下可达
100kbit/s
在快速模式下可达
400kbit/s
,在高速
模式下可达
3.4Mbit/s
。
(5)总线支持设备连接。在使用
IIC
通信总线时,可以有多个具备
IIC
通信能力的设备挂载
在上面,同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容
400pF
的限制决
定。
IIC
总线挂载多个器件的示意图,如下图所示:
1.2、I2C总线协议详解
上图为I2C总线时序图,为了便于大家更好的了解
I2C
协议,从起始信号、停止信号、应答信号、数据有效性、 数据传输以及空闲状态等 6
个方面讲解,大家需要对应上图中的
标号来理解。
① 起始信号
当
SCL
为高电平期间,
SDA
由高到低的跳变。起始信号是一种电平跳变时序信号,而不是 一个电平信号。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。
② 停止信号
当
SCL
为高电平期间,
SDA
由低到高的跳变。停止信号也是一种电平跳变时序信号,而不是一个电平信号。该信号由主机发出,在停止信号发出后,总线就处于空闲状态。
③ 应答信号
发送器每发送一个字节,就在时钟脉冲
9
期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK
简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK
),一般表示接收器接收该字节没有成功。观察上图标号③就可以发现,有效应答的要求是从机在第 9
个时钟脉冲之前的低电平期间将 SDA
线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它收到最后一个字节后,发送一个 NACK
信号,以通知被控发送器结束数据发送,并释放
SDA线,以便主机接收器发送一个停止信号。
④ 数据有效性
IIC
总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。数据在 SCL
的上升沿到来之前就需准备好。并在下降沿到来之前必须稳定。
⑤ 数据传输
在
I2C
总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在
SCL
串行时钟的配合下,在 SDA
上逐位地串行传送每一位数据。数据位的传输是边沿触发。
⑥ 空闲状态
IIC
总线的
SDA
和
SCL
两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
了解前面的知识后,下面介绍一下
IIC
的基本的读写通讯过程,包括主机写数据到从机即写操作,主机到从机读取数据即读操作。下面先看一下“写”操作通讯过程图:
主机首先在 IIC 总线上发送起始信号,那么这时总线上的从机都会等待接收由主机发出的数据。主机接着发送从机地址+0(写操作)组成的 8bit 数据,所有从机接收到该 8bit 数据后,自行检验是否是自己的设备的地址,假如是自己的设备地址,那么从机就会发出应答信号。主机在总线上接收到有应答信号后,才能继续向从机发送数据。
注意:IIC 总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
下面讲解“读”操作:
主机向从机读取数据的操作,一开始的操作与写操作有点相似,观察两个图也可以发现, 都是由主机发出起始信号,接着发送从机地址+1(
读操作
)
组成的
8bit
数据,从机接收到数据验 证是否是自身的地址。 那么在验证是自己的设备地址后,从机就会发出应答信号,并向主机返回 8bit
数据,发送完之后从机就会等待主机的应答信号。假如主机一直返回应答信号,那么从 机可以一直发送数据,也就是图中的(n byte +
应答信号)情况,直到主机发出非应答信号,从机才会停止发送数据。
二、I2C驱动
2.1、I2C驱动作用
I2C驱动是操作系统或固件中的软件组件,它提供了与I2C硬件接口交互的抽象层。驱动的主要作用包括:
(1)设备初始化:配置I2C设备的寄存器,设置通信参数,如速度、地址和中断。
(2)数据传输:实现数据发送和接收的功能,包括启动条件、写入和读取数据。
(3)地址管理:管理I2C总线上设备的地址,确保正确识别和通信。
(4)错误处理:检测和处理通信错误,如超时、应答错误和数据冲突。
(5)中断管理:处理I2C设备的中断请求,如数据传输完成、错误发生等。
(6)流控制:实现I2C协议的流控制机制,确保数据传输的可靠性。
(7)多主机管理:在多主机环境中管理总线访问,避免冲突。
(8)设备发现:扫描I2C总线,发现并识别连接的设备。
(9)电源管理:控制设备的电源状态,如进入低功耗模式。
2.2、I2C驱动的实现
I2C驱动通常包括以下组件:
(1)硬件抽象层(HAL):提供与特定硬件平台相关的接口。
(2)设备驱动模型:操作系统提供的框架,用于管理设备的生命周期和状态。
(3)中断服务例程(ISR):处理I2C设备的中断事件。
(4)API接口:提供给应用程序的接口,用于执行I2C操作,如读写数据。
(5)数据缓冲区:用于存储I2C通信过程中的临时数据。
(6)配置和状态寄存器:用于控制I2C设备的行为和状态。
I2C驱动是嵌入式系统和物联网设备中不可或缺的部分,它使得设备能够通过简单的串行接口进行高效的数据交换。随着技术的发展,I2C协议已经成为许多微控制器和传感器的标准通信接口。
2.3、I2C与ICC协议对比
特性 | IIC (I2C) | I2C (I2C V2) |
版本 | 第一代 | 第二代 |
速度 | 标准模式:100 kbps<br>快速模式:400 kbps<br>高速模式:3.4 Mbps | 标准模式:100 kbps<br>快速模式:400 kbps<br>高速模式:3.4 Mbps<br>超高速模式:5 Mbps或更高 |
地址长度 | 通常7位或10位 | 通常7位或10位 |
多主机支持 | 支持,但同一时间只能有一个主机控制总线 | 支持,允许多个主机更灵活地控制总线 |
总线仲裁 | 基本仲裁机制 | 改进的仲裁机制,减少总线冲突 |
流控制 | 基本流控制 | 增强的流控制,包括超时和重传机制 |
信号线 | 两条:SDA(数据线)和SCL(时钟线) | 两条:SDA(数据线)和SCL(时钟线) |
应用范围 | 较广泛的应用,特别是在低速通信场合 | 适用于高速通信和更复杂的系统 |