STM32学习-I2C通信

系列文章目录


目录

一、I2C通信简介

二、I2C原理

1. 硬件电路(一主多从)

2. I2C时序基本单元

2.1 起始条件

2.2 终止条件 

2.3 发送一个字节

2.4 接收一个字节

2.5 发送应答

2.6 接收应答

三、 I2C时序分析

3.1 指定地址写

3.2 当前地址读

3.3 指定地址读

总结


前言

本文记录学习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设计为禁止所有设备输出强上拉的高电平比喻为弹簧杆子模型,所有人只能选择往下拉或者放手,外置一根弹簧向上拉。

6d601c308e594e76a469ec8e38d0b497.png

2. I2C时序基本单元

2.1 起始条件

  • SCL为高电平,SDA处于下降沿,进行自身复位,等待主机呼叫。
  • 在SCL下降沿之后,主机要把SCL拉下来:

将SCL拉下的意义:

  • 占用总线 
  • 方便后面时序的拼接,这些时序基本单元除了起始和终止条件都是低电平开始低电平结束

2.2 终止条件 

  • SCL高电平期间,SDA处于上升沿,在终止条件之后,SCL和SDA都回到最初的状态。

在一主多从下,起始和终止条件都是主机产生,从机不允许产生起始和终止。

4bdad3d1c6cf475886efa30b58b312f8.png

2.3 发送一个字节

  • 高位先行,先读最高位。在SCL低电平时,主机就放好数据,从机在SCL高电平期间读取数据位,SDA此时上拉则为1,下拉则为0,SCL高电平期间SDA不允许有数据变化,依次循环8次,就发送了一个字节。同步时序的好处,进中断了,时序就会一直拉长,SCLSDA都暂停,传输不会出问题。

4a882665d08e475cbf1a1d82eee2e584.png

2.4 接收一个字节

  • SCL低电平时,从机将数据放在SDA线上,主机将在SCL高电平期间读取数据位,依次循环八次,就接收了一个字节。

注意:主机在接收之前,需要释放SDA,让从机掌控总线

83ffbbcb289b4c318875b7b0fddc8046.png

2.5 发送应答

  • 主机在接收一个字节之后,要给从机发送一个应答位,来告诉从机是否还要继续发;如果得到主机应答,那么从机就会继续发,没得到应答,就不会继续发送了。

2.6 接收应答

  • 主机在调用发送一个字节之后,要紧跟一个接收应答的时序,判断从机是否收到刚才的数据,也就是发送完数据之后,主机把SDA杆子拉了下来问是否有人收到,然后放手,主机高电平时读取数据发现有人拉下来就代表收到了。

18730291153e4e04a207fdea9f7a4f55.png


三、 I2C时序分析

3.1 指定地址写

  • 首先,产生起始条件s;
  • 之后,跟着发送字节时序,字节的内容为从机地址(确定通信对象)+读写位(Slave Address)0是写,1是读;
  • 紧跟着是接收应答位,从机将SDA设置为0,代表主机刚才的寻址有人应答,传输无误;如果从机将SDA设置为1,代表刚才无人应答,那主机就会直接产生停止条件;
  • 接着就是继续发送一个字节,这个字节就可以送到指定设备内部(Reg Address),第二个字节和后续字节的用途由从机设备自己定义,可以是寄存器地址或者指令控制字等;
  • 紧跟着又是一个从机应答;
  • 之后就是再次发送一个字节,这个字节就是主机想要写入指定地址下的寄存器的内容了(Data);
  • 最后就是停止条件。

所以,这个数据帧的目的是,对于指定从机地址为1101000的设备,在其内部0x19地址的寄存器中,写入0xAA这个数据。

8482e0ad04c84fe38e80ea4513d04a98.png

3.2 当前地址读

  • 寻址目标为1101000的设备(Slave Address);读写标志位给1,立马转为读的时序,所以没有指定地址的环节,那么从机该发送哪个寄存器的数据呢,此时就要用到当前地址指针。

64bc507dfbf24e8f836b50cdd4241857.png

3.3 指定地址读

  • 将指定地址写时序的前面两段Slave Address、Reg Address追加到当前地址读的前面,就得到此时序。

b3ba482b4e7c4dd7bc55269dbcf29d47.png


总结

以上就是学习的关于I2C通信协议的相关内容,本文简单介绍了I2C的一些常用知识,构成此通信协议最基本的时序单元等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值