系列文章目录
目录
前言
本文记录学习I2C通信协议的相关笔记。(参考b站江协科技STM32教程)
一、I2C通信简介
- I2C总线(Inter IC BUS),由Philips公司开发的通用数据总线。
- 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
- 同步,半双工
- 带数据应答
- 支持总线挂载多设备(一主多从、多主多从)
二、I2C原理
1. 硬件电路(一主多从)
- 所有I2C设备的SCL连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7kΩ左右。
这么设计的原因是主机在接收时输入,发送时输出,从机也一样,如果时序没协调好,就可能会发生两引脚同时处于输出,并产生短路。所以I2C设计为禁止所有设备输出强上拉的高电平,所以设备的SCL和SDA均要配置成开漏输出模式,还有SCL和SDA需各添加一个上拉电阻,阻值一般为4.7kΩ左右。开漏输出就是不输出电压,控制输出低电平0时引脚接地,控制输出高电平1时引脚既不输出高电平,也不输出低电平,为高阻态(不能正常输出1)。
弱上拉开漏输出的好处
- 杜绝电源短路现象
- 避免引脚模式频繁切换
- 产生“线与”现象,有任意一个设备低电平总线就是低电平,只有所有设备都高电平总线才是高电平,利用此特性可以执行多主机模式下的时钟同步和总线仲裁。
将I2C设计为禁止所有设备输出强上拉的高电平比喻为弹簧杆子模型,所有人只能选择往下拉或者放手,外置一根弹簧向上拉。
2. I2C时序基本单元
2.1 起始条件
- SCL为高电平,SDA处于下降沿,进行自身复位,等待主机呼叫。
- 在SCL下降沿之后,主机要把SCL拉下来:
将SCL拉下的意义:
- 占用总线
- 方便后面时序的拼接,这些时序基本单元除了起始和终止条件都是低电平开始低电平结束
2.2 终止条件
- SCL高电平期间,SDA处于上升沿,在终止条件之后,SCL和SDA都回到最初的状态。
在一主多从下,起始和终止条件都是主机产生,从机不允许产生起始和终止。
2.3 发送一个字节
- 高位先行,先读最高位。在SCL低电平时,主机就放好数据,从机在SCL高电平期间读取数据位,SDA此时上拉则为1,下拉则为0,SCL高电平期间SDA不允许有数据变化,依次循环8次,就发送了一个字节。同步时序的好处,进中断了,时序就会一直拉长,SCLSDA都暂停,传输不会出问题。
2.4 接收一个字节
- SCL低电平时,从机将数据放在SDA线上,主机将在SCL高电平期间读取数据位,依次循环八次,就接收了一个字节。
注意:主机在接收之前,需要释放SDA,让从机掌控总线
2.5 发送应答
- 主机在接收一个字节之后,要给从机发送一个应答位,来告诉从机是否还要继续发;如果得到主机应答,那么从机就会继续发,没得到应答,就不会继续发送了。
2.6 接收应答
- 主机在调用发送一个字节之后,要紧跟一个接收应答的时序,判断从机是否收到刚才的数据,也就是发送完数据之后,主机把SDA杆子拉了下来问是否有人收到,然后放手,主机高电平时读取数据发现有人拉下来就代表收到了。
三、 I2C时序分析
3.1 指定地址写
- 首先,产生起始条件s;
- 之后,跟着发送字节时序,字节的内容为从机地址(确定通信对象)+读写位(Slave Address)0是写,1是读;
- 紧跟着是接收应答位,从机将SDA设置为0,代表主机刚才的寻址有人应答,传输无误;如果从机将SDA设置为1,代表刚才无人应答,那主机就会直接产生停止条件;
- 接着就是继续发送一个字节,这个字节就可以送到指定设备内部(Reg Address),第二个字节和后续字节的用途由从机设备自己定义,可以是寄存器地址或者指令控制字等;
- 紧跟着又是一个从机应答;
- 之后就是再次发送一个字节,这个字节就是主机想要写入指定地址下的寄存器的内容了(Data);
- 最后就是停止条件。
所以,这个数据帧的目的是,对于指定从机地址为1101000的设备,在其内部0x19地址的寄存器中,写入0xAA这个数据。
3.2 当前地址读
- 寻址目标为1101000的设备(Slave Address);读写标志位给1,立马转为读的时序,所以没有指定地址的环节,那么从机该发送哪个寄存器的数据呢,此时就要用到当前地址指针。
3.3 指定地址读
- 将指定地址写时序的前面两段Slave Address、Reg Address追加到当前地址读的前面,就得到此时序。
总结
以上就是学习的关于I2C通信协议的相关内容,本文简单介绍了I2C的一些常用知识,构成此通信协议最基本的时序单元等。