一、I2C协议
I2C物理层两条线,SCL和SDA。
SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。
SDA(serial data):数据线,通信数据都通过SDA线传输。
I2C通信可以一对一(一个主设备对1个从设备),也可以一对多(一个主设备对多个从设备)。
一个Master可以对应多个Slave。
1.1 数据传输格式
其中
S
表示由主机的
I
2
C
接口产生的传输起始信号
(S)
,这时连接到
I
2
C
总线上的所有从机都会
接收到这个信号。
起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号
(SLAVE_ADDRESS)。每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。
在地址位之后,是传输方向的选择位,该位为
0
时,表示后面的数据传输方向是由主机传输至从
机,即主机向从机写数据。该位为
1
时,则相反,即主机由从机读数据。
从机接收到匹配的地址后,主机或从机会返回一个应答
(ACK)
或非应答
(NACK)
信号,只有接收
到应答信号后,主机才能继续发送或接收数据。
接下来为传输的数据
(DATA)
,数据包的大小为
8
位,每发送或接收完一个字节数据,都 要等待应答信号 (ACK)
,重复这个过程,可以向从机传输
N
个数据,这个
N
没有大小限制。
当数据传输结束时,发送一个停止传输信号 (P),表示不再传输数据。
1.2 信号解析
- 起始信号[Start]:在SCL保持高电平时,SDA下降沿。
- 读写位:【0写1读】
- 数据位:SCL低电平时,SDA可变化;SCL高电平,SDA不变
- 终止信号:在SCL高电平时,SDA上升沿。
- 回应信号[ACK]:SDA低电平,低电平
二、RT1064 I2C
我们可以用两个GPIO引脚,分别用作SCL和SDA,模拟I2C的协议,这被称之为“软件模拟协议”方式。
RT1064提供了LPI2C(Low power I2C,低功耗 I2C)片上外设专门负责实现 I2C 通讯协议,这种由硬件外设处理 I2C 协议的方式被称之为“硬件协议”方式。这种方式只需要配置好外设,软件设计更加的简单。
RT1064 I2C的框架图:
![](https://img-blog.csdnimg.cn/20211007165128899.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATmlraXRhX18=,size_20,color_FFFFFF,t_70,g_se,x_16)
RT1064提供了4个I2C。官方已经提供了封装好的库函数,也有例程,其中很多细节不需要