发布时间:2023-01-09 12:00
目录
I2C传输模式
同步总线&异步总线
I2C硬件
I2C总线协议
I2C数据写流程
I2C数据读流程
I2C总线为PHILIPS公司推出的串行通信总线,具有接线少,控制方式简单,通信速率高等优点。采用数据线SDA和时钟线SCL构成通信线路,各器件可通过并联到总线上实现数据收发,器件间彼此独立,通过唯一的总线地址区分。传输数据时每个字节后需带一个响应位。
三种I2C传输模式:
标准模式传输速率100k bit/s,
快速模式传输速率400k bit/s,
高速模式可达3.4M bits/s(一般设备不支持)。
ps:上面的数值代表传输速率上限,传输速率不是只能100k bit/s,可以为其他数值。 I2C是一个低速的总线
I2C是同步总线
ps:同步总线&异步总线
同步总线:指互联的部件或设备均通过统一的时钟进行同步,即所有的互联的部件或设备都必须使用同一个时钟(同步时钟),在规定的时钟节拍内进行规定的总线操作,来完成部件或设备之间的信息交换。eg SPI
异步总线:指没有统一的时钟而依靠各部件或设备内部定时操作,所有部件或设备是以信号握手的方式进行,即发送设备和接受设备互用请求(request)和确认(acknowledgement)信号来协调动作,总线操作时序不是固定的。因此,异步总线能兼容多种不同的设备,而且不必担心时钟变形或同步问题使得总线长度不受限制。eg 串口
I2C硬件结构图:
I2C外挂很多器件,通过ID号来选择某器件
I2C总线上各器件都采用漏极开路(OD)的形式与总线连接,因此SCL和SDA均需接上拉电阻,才能输出高电平。
OD:0代表输出0
1代表不输出
I2C一共就2条线,SDA(数据线)和SCL(时钟线)
(1)数据有效
SDA 线上的数据在SCL时钟的高电平期间必须稳定。 只有当 SCL 线上的时钟信号为 LOW 时,数据线的 HIGH 或 LOW 状态才能改变(见图 4)。 每传输一个数据位都会产生一个时钟脉冲。
(2)START 和 STOP 条件
所有事务都以 START (S) 开始,以 STOP (P) 结束(参见图 5)。
SCL 为高电平时 SDA 线上从高到低:启动条件。
SCL 为高电平时 SDA线上从低到高:停止条件。
START 和 STOP 条件始终由主机生成。 在 START 条件之后,总线被认为是忙碌的。 在 STOP 条件之后的某个时间,总线被认为再次空闲。 如果生成重复的 START (Sr) 而不是 STOP 条件,则总线保持忙碌。 在这方面,START (S) 和重复 START (Sr) 条件在功能上是相同的。
由于上拉电阻的存在,无操作的时候SDA=1,因此把SDA下降沿作为开始
(3)数据有效性和字节格式
在 SCL 的每个时钟脉冲期间传输一个数据位。一个字节由 SDA 线上的八位组成。 一个字节可以是设备地址、寄存器地址或写入从机或从从机读取的数据。
数据首先传输最高有效位 (MSB)。在 START 和 STOP 条件之间,可以将任意数量的数据字节从主机传输到从机。SDA 线上的数据必须在时钟周期的高电平阶段保持稳定,因为当 SCL 为高电平时数据线的变化被解释为控制命令(START 或 STOP)。
(4)应答 (ACK) 和不应答 (NACK)
数据的每个字节(包括地址字节)后跟来自接收器的一个 ACK 位。ACK 位允许接收器与发送器通信该字节已成功接收并且可以发送另一个字节。
发送应答时,ACK=0
(因为I2C总线0代表从机发送了0,1分不清是否是无操作)
在接收器可以发送 ACK 之前,发送器必须释放 SDA 线。 要发送 ACK 位,接收器应在 ACK/NACK 相关时钟周期(周期 9)的低相位期间拉低 SDA 线,以便 SDA 线在 ACK/NACK 的高相位期间稳定在低电平相关的时钟周期。 必须考虑建立和保持时间。
当 SDA 线在 ACK/NACK 相关时钟周期内保持高电平时,这被解释为 NACK。 有几个条件会导致 NACK 的产生:
1. 接收器无法接收或发送,因为它正在执行一些实时功能,还没有准备好开始与主设备的通信。
2. 在传输过程中,接收方得到了它不理解的数据或命令。
3. 在传输过程中,接收方不能再接收任何数据字节。
4. 主接收器完成读取数据并通过 NACK 将其指示给从设备。
(把主机数据写入从机)写标准流程为:
1. Master发起START
2. 器件寻址Master发送 Slave的 addr(7bit)和读写指示w操作0(1bit),等待ACK
3. Slave发送ACK(谁接收数据谁发送ACK)
4.发送将写入数据的地址 Master发送reg addr(8bit),等待ACK
5. Slave发送ACK
6.发送数据 Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7. Slave发送ACK
8. 第6步和第7步可以重复多次,即顺序写多个寄存器
9. Master发起STOP
总的来说,主机给总线START和STOP信号。主机给总线依次发送从机地址+读写指令,数据即将存入的地址,数据 。而每8bit从机就要给总线上面一个ACK
(主机从从机里面读数据)读寄存器的标准流程为:
1.Master发起START
2.器件寻址Master发送从机的addr(7bit)和 读写指示W操作0(1bit),等待ACK
主机先把将要读的地址写一次,传给从机
2. Slave发送ACK
3. 发送将要读的地址Master发送reg addr(8bit),等待ACK
4. Slave发送ACK
5. Master发起START
6. 器件寻址Master发送 从机的addr(7bit)和 读写指示R操作1(1bit),等待ACK
从机把数据发送给主机
7. Slave发送ACK
8. 发送数据Slave发送data(8bit),即寄存器里的值
9. Master发送ACK
10.第8步和第9步可以重复多次,即顺序读多个寄存器
11. 主接收器完成读取数据并通过 NACK 将其指示给从设备
12.主机发送stop
读过程中,主机需要先发起一次写操作, 主机给总线依次发送从机地址+读写指令,数据即将存入的地址(这样做的目的是获得数据即将存入的地址,否则不知道从哪个地址开始读数据)
然后,主机发起读操作,主机给总线依次发送从机地址+读写指令,(由于地址在写过程获取)从机直接发送数据,每8bit,主机ACK一次,直到主机发送STOP