i2c概述
I2C(Inter-Intergreted Circuit) 是一种串行通信协议,用于集成电路之间完成数据传输,i2c用广泛用以各种领域,包括电子设备、嵌入式系统、工业自动化等;
i2c仅仅只是一个数据传输的协议,具体传输的数据用途由上层决定;
针对i2c协议的一个小例子
该例子灵感出自参考文档;
针对上图中:我们类比单片机A为课堂中的老师,其它设备为学生;课堂上会有一些互动,如下流程说明,后面会针对例子和i2c中的通信做一些联系,这里有个大概流程即可;
- 老师呼叫甲同学背诵课文
- 老师怒拍讲台,大喊安静;
- 点名甲同学,你给我背诵下《蜀道难》;
- 甲同学接收到请求,并回复收到;
- 此后开始背诵;“噫吁嚱,危乎高哉!蜀道之难,难于上青天!.....”
- 老师在甲同学背诵过程中不断的点头回应。
- 在甲同学背诵完成后,老师发话:“真不错,坐下吧”;(要不然甲同学会很尴尬)
- 老师公布分数流程
- 老师又怒拍讲台,大喊安静,
- 老师点名:‘甲同学’;
- 甲同学回复:‘到’;
- 老师:‘我要告诉你分数了’;
- 甲同学回应:‘好的’;
- 老师:‘93分’;
- 甲同学:‘好的,我知道了’;
- 老师随即咳嗽一声,准备叫下一个同学;
协议特点
这里先抛出协议的特点,后续知识点说明部分会有针对性的说明;
- 仅需两根线即可完成通信(SDA、SCL);
- 均连接到总线上,无特定的主从之分,每个设备可访问总线上的其它设备;
- 串行通信,存在时钟线SCL用作接收指示;
- 总线上的设备既可以接收数据,也可以发送数据。但二者为互斥关系,所以为半双工通信方式;
- 存在应答机制,可实现接受侧的反压;
i2c重要知识点说明
SDA、SCL通信知识
- 默认情况下SDA、SCL的值均为1;
- 任何一个设备想要控制SDA、SCL输出0即可,输出1可通过外部的上拉完成输出1;
- 多个设备间的SDA、SCL为线与功能。当多个设备输出冲突时,将多个设备期望输出值进行与操作,即为最终SDA、SCL上的值;
i2c写操作
-
刚开始主机要发出一个start信号,然后发出一个设备地址(用来确定是往哪一个从机写数据),方向(读/写,0表示写,1表示读)。
-
slave回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主机就会发送一个P停止信号。
白色背景:主→从
灰色背景:从→主
注意点:
- 写操作除了要指定设备地址,还需要指定对设备发生访问的地址,第一个数据为访问地址;;
带入前面的例子理解写过程
-
老师公布分数流程
- 老师又怒拍讲台,大喊安静,(月考后,开始点名说分数);—发送start;
- 老师点名:‘甲同学’;—发送设备地址,指定甲同学;
- 甲同学回复:‘到’;—回应,代表从机存在并准备好了;
- 老师:‘我要告诉你分数了’;—指定要告知的是分数,也就是会知道写地址,指示从机该内容含义;
- 甲同学回应:‘好的’;—从机回应
- 老师:‘93分’; —发送数据;
- 甲同学:‘好的,我知道了’;—回应
- 老师随即咳嗽一声,准备叫下一个同学;— 发送P结束条件;
以上例子i2c传输对应的其实就是教室里的声音,由于是单线的,所以也就是教室里只能存在一种声音,所以老师与同学之间的交流是串行执行的。当然可能我们人类由于存在某些潜规则,使得通信变的更简单了,但是电子设备中没有这种潜意识,所以需要再帧内指定地址、读写指示、从设备响应等动作完成一次通信;
i2c读操作
- 刚开始主机要发出一个start信号,然后发出一个设备地址(用来确定是从哪一个芯片读取数据),方向(读/写,0表示写,1表示读)。
- 回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后在传输下一个数据。
- 每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主机就会发送一个P停止结束信号。
白色背景:主→从
灰色背景:从→主
说明:slave侧在完成一次传输后,需要master指示是否结束,或者进行下一次传输。slave默认会在当前地址进行递增动作进行下一次传输;读操作默认在上一写操作结束地址发生;
i2c读操作例子解读
- 老师呼叫甲同学背诵课文
- 老师怒拍讲台,大喊安静;—start
- 点名甲同学;你给我背诵下《蜀道难》;—指定为读操作,并指定读的内容为《蜀道难》
- 甲同学接收到请求,并回复收到;—回应
- 此后开始背诵;“噫吁嚱,危乎高哉!蜀道之难,难于上青天!.....”—读数据
- 老师在甲同学背诵过程中不断的点头回应。—主机回应
- 在甲同学背诵完成后,老师发话:“真不错,坐下吧”;(要不然甲同学会很尴尬)—slave回应NACK,主机结束一次传输;
同写操作,人主观存在潜规则,通过例子理解I2c时注意需明确指定相关内容,电子设备才可以正确动作;
Start 和Pause条件
- 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通信的起始。
- 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通信的停止。
发送点、采样点
i2c总体的数据线与采样时钟线的配合为:
- 当SCL为低时完成数据的改变,此时不会发送采样动作;
- 当SCL为高时完成数据的采样,此时完成数据采样动作;
I2c其它特性
- 响应可分为ACK和NACK,用以指示是否继续传输还是结束传输;
- ACK主要用以指示传输完成;
- NACK主要用以传输的一些特殊情况,如下:
- I2C总线上没有主机所指定地址的从机设备
- 从机正在执行一些操作,处于忙状态,还没有准备好与主机通讯
- 主机发送的一些控制命令,从机不支持
- 主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了
- i2c slave会记住上一次操作的地址。下一次发送读动作即从该地址开始;所以要进行读之前需有一个无写数据的写动作;
- SCL、SDA的默认值为高;
- SDA的控制用主机和从机交替控制,同一时间仅一个设备控制。读写操作中的主机发送完相关信息后,需释放SDA的控制,由Slave控制是否应答;
参考文档
以上仅解释了大体部分,但i2c的其它特点还可以从以下文章学习到:
一篇短文让你彻底理解什么是I2C通信-CSDN博客
一文看懂I2C协议 - 知乎 (zhihu.com)
4分钟看懂!I2C通讯协议 最简单的总线通讯!_哔哩哔哩_bilibili