【【STM32----I2C通信协议】】

STM32----I2C通信协议

【【STM32----I2C通信协议】】_第1张图片
我们会发现I2C有两根通信线: SCL和SDA
同步 半双工
带数据应答
支持总线挂载多设备(一主多从,多主多从)
硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
【【STM32----I2C通信协议】】_第2张图片
【【STM32----I2C通信协议】】_第3张图片
左边的CPU就是主机,他的权力很大包含了对SCL线的完全控制,任何时候都是主机完全掌控SCL线

从机的权利比较小,不允许任何时刻控制SCL总线

另外在空闲状态下,主机可以主动发起对SDA的控制.
从机 不允许主动发起对SDA的控制

只有在从机发送数据和从机应答的时候主机才会转交SDA的控制权给从机
【【STM32----I2C通信协议】】_第4张图片
就好比这些是挂在在I2C总线上的从机

我们在观察这个图中可以看出这几个特点

假设我们没有这两个电阻
【【STM32----I2C通信协议】】_第5张图片
对于SCL端 其实是非常容易控制的
因为主机掌控了对SCL端的完全控制权
但是对于SDA 并不是很好的处理
因为有些时候从机会发送 主机会接收
从机接收 主机发送
所以如果仅此而已 可能会在某些形式上
为了避免主线没协调好导致短路的问题
I2C的设计是禁止所有设备输出强上拉的高电平
采用外置弱上拉电阻和开漏输出的电路结构
就是怎么通俗易懂的解释呢 ,
【【STM32----I2C通信协议】】_第6张图片
这属于是强上拉和强下拉的输出模式
直接接入地和电源Vcc 那么直接接入的上拉 和下拉就会直接沟通电源或者是地 这样来说并不安全
那么我们如果把上拉的电源切断 换成浮空态的话 那么就会对我们的电路 产生一个保护作用
简称浮空态
【【STM32----I2C通信协议】】_第7张图片
我们会发现这样的做法会对我们的电路起到一定的保护作用

我们现在增加一个上拉电阻 就会实现其他不一样的功能
就像是一根杆子但是上面增加了一个弹簧
我们规定所有人只能向下拉杆子
或者放手(放手就相当于给置为低电位0)输出高电平 因为有根弹簧的存在它会自己回弹到悬空态 这相对于低电位0 肯定是高的,但是又不是很高 所以我们称其为弱上拉
这样就完全杜绝了短路的现象
第二 避免了引脚模式的频繁更换
【【STM32----I2C通信协议】】_第8张图片
起始条件:
SCL高电平期间,SDA从高电平切换到低电平
【【STM32----I2C通信协议】】_第9张图片
终止条件:
SCL高电平期间,SDA从低电平切换到高电平
【【STM32----I2C通信协议】】_第10张图片•发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

【【STM32----I2C通信协议】】_第11张图片
因为就像是上面所说的 主机牢牢把控着SCL 在SCL低电平的时候 ( 主机控制的) 然后主机在将数据依次放到SDA线上 再释放SCL 像弹簧一样回弹到高电平 从机会自动读取SDA的数据 所以这里就要求我们SCL为高 SDA不允许有数据变化
在这种情况下,SCL与SDA全部由主机控制

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
【【STM32----I2C通信协议】】_第12张图片
在我们这里是这个意思
首先我们需要明白一个道理 我们总是控制着主机的 考虑也是基本上只说主机
我们先把SCL拉至低电平(完全由主机控制) 然后从机会把数据依次放到SDA线上 再释放SCL 释放的意思就是我不用手拉着了 嗖的一声回弹上去了 变成了高电位 这就是所说的释放的概念 主机接着会在SCL高电平期间进行数据读取 在SCL为高 就是主机读取的阶段并不允许 数据有所变化
另外注意点是 主机在开始接收之前,需要提前释放掉SDA 因为对我们来说 因为是一根线线与的关系 你放手了 让别人拉这根杆子 他才会传递不同的信息给你

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
•接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
【【STM32----I2C通信协议】】_第13张图片
怎么解释呢
我们首先需要明确的观点是
当SCL拉低时候 是在传输数据 (不管是主机把数据传送到SDA上,还是从机把数据放到SDA上 ,这里我们可以在具体实践中通过代码控制)
在SCL为高的时候 ,总是在读取数据(要么是主机读取SDA 要么是从机读取SDA)

我们现在以接收应答为例
就像是我们发送一个东西 之后马上判断是否有人收到了
就是这样我们先把SCL拉低(主机 开始操作发送数据) 接下来需要释放掉SDA 因为只有释放掉SDA 从机才能操作SDA 接下来SCL为高进入读取阶段 那么我们如果SDA响应了被拉下那么是不是 相当于我们读取到的是数据0 应答成功 如果是没有接收到就会处于拉高模式就是1 表示非应答

你可能感兴趣的:(stm32学习,stm32,嵌入式硬件,单片机)