一、IIC简介
IIC(Inter-Integrated Circuit,也常写作I²C或I2C)是一种由飞利浦半导体(现为NXP半导体)在1980年代初设计的串行通信总线协议,主要用于在嵌入式系统中进行设备间短距离、低速的数据传输。IIC总线因其简洁的接口和易于实现的特性,在许多电子设备中得到广泛应用,尤其是那些需要在主板上集成多种传感器、控制器或存储器的场合。
- 物理接口:IIC总线只需要两条线——串行数据线(SDA)和串行时钟线(SCL),这使得硬件成本和电路板空间需求大大降低。
- 半双工通信:SDA线既用于发送也用于接收数据,但同一时刻只能进行一项操作,因此属于半双工模式。
- 同步通信:通信双方通过共享的时钟信号(由主设备提供)同步数据传输,保证了数据传输的稳定性。
- 数据传输速率:支持不同速度等级,包括标准模式(最大100kHz)、快速模式(最大400kHz)、快速模式+(最大1MHz)以及高速模式(可达3.4MHz),具体取决于总线条件和设备支持。
- 从设备寻址:主设备通过广播从设备的地址来选择通信的目标,从设备通过ACK/NACK信号响应,以确认接收或拒绝数据。
- 硬件支持:通常需要上拉电阻来保持SDA和SCL线在空闲状态为高电平,以及开漏或开集电极的输出级以允许多个设备控制总线电平。
- 多主机/多从机架构:在使用 IIC 通信总线时,可以有多个具备 IIC 通信能力的设备挂载在上面,同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容 400pF 的限制决定。IIC 总线挂载多个器件的示意图,如下图所示。
二、IIC时序
上图是IIC总线的时序图,分为六个方面,具体是①起始信号 ②停止信号 ③应答信号 ④数据有效性 ⑤数据传输 ⑥空闲状态
- 起始信号:该信号有主机发出,产生之后总线处于被占用状态,准备数据传输。具体是当SCL为高电平时,SDA由高电平跳变到低电平,所以起始信号是一种电平跳变时序信号,而不是电平信号。
- 停止信号:该信号也是由主机发出,停止信号发出后,总线处于空闲状态。具体是SCL为高电平时,SDA由低电平到高电平的跳变。
- 应答信号:发送器每发送一个字节,就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
观察上图标号③就可以发现,有效应答的要求是从机在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA线,以便主机接收器发送一个停止信号。 - 数据有效性:总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。数据在 SCL 的上升沿到来之前就需准备好。并在下降沿到来之前必须稳定。
- 数据传输:在 I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在 SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。
- 空闲状态:IIC 总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
三、IIC基本的读写通讯过程
1、写操作
① 主机首先在 IIC 总线上发送起始信号,那么这时总线上的从机都会等待接收由主机发出的数据;
② 主机接着发送从机地址+0(写操作)组成的 8bit 数据,所有从机接收到该 8bit 数据后,自行检验是否是自己的设备的地址,假如是自己的设备地址,那么从机就会发出应答信号;
③ 主机在总线上接收到有应答信号后,才能继续向从机发送数据。
2、读操作
① 主机发出起始信号;
② 接着主机发送从机地址+1(读操作)组成的 8bit 数据,从机接收到数据验证是否是自身的地址;
③ 在验证是自己的设备地址后,从机就会发出应答信号,并向主机返回 8bit 数据,发送完之后从机就会等待主机的应答信号;
④ 假如主机一直返回应答信号,那么从机可以一直发送数据,也就是图中的(n byte + 应答信号)情况,直到主机发出非应答信号,从机才会停止发送数据。
四、ESP32S3-IIC控制器
ESP32-S3 有两个 IIC 总线接口,根据用户的配置,总线接口可以用作 IIC 主机或从机模式。
IIC 接口特点:
- 可支持标准模式(100Kbit/s)、快速模式(400Kbit/s),速度最高可达 800Kbit/s,但受限于
SCL 和 SDA 上拉强度。 - 可支持 7 位寻址模式和 10 位寻址模式
- 可支持双地址(从机地址和从机寄存器地址)寻址模式
下面介绍一下 ESP32S3 的 IIC 主机写入从机,7 位寻址,单次命令序列的场景,如下图所
示。
在 ESP32-S3 硬件 IIC 控制器中,都有相对应的空间存放相对应的内容。比如上图中,在cmd 内存区中存放的是就是命令序列,就比如前面提及到的起始信号、写过程、读过程、停止信号;在 RAM 内存区中存放的就是某些命令序列携带的内容。
当主机在软件配置好命令序列和 RAM 数据后,操作寄存器启动数据传输时。控制器的行
为可分为以下四步:
1、等待 SCL 线位高电平,以避免 SCL 线被其他主机或者从机占用。
2、执行 RSTART 命令发送 START 位。即发送起始信号。
3、执行 WRITE 命令从 RAM 的首地址开始取出 N+1 个字节并一次发送给从机,其中第一个字节为地址。这个过程中会产生对应的时序,携带数据进行发送。
4、发送 STOP 命令,即发送停止信号。
参考资料:ESP32-S3 使用指南-IDF 版