【江科大】STM32:I2C通信(上)

如果要通过寄存器控制硬件电路,至少需要定义两个字节数据
1.一个字节是我们要读写哪个寄存器,也就是指定寄存器地址。
2.这个地址下,存储器存的内容(写入内容就是控制电路,读取内容就是获取电路的状态)
单片机读取自己的寄存器,可以通过内部的数据总线来完成,直接用指针操作
模块中的寄存器在单片机的外面,因此就需要通信协议,连接尽可能少的线,实现单片机读写外部模块寄
存器的功能。

同步通信和异步通信

  • 同步通信:使用一根时钟线,对传输的时间就不用严格要求了,当需要暂停传输,时钟线也可以随时暂
    停,继续传输时,会从暂停的位置继续传输。
    使用同步时序可以极大降低单片机对硬件电路的依赖,即使没有硬件电路的支持,也可以很方
    便的用软件手动翻转电平来实现通信(软件模以时序)。
  • 异步就是少了一根时钟线,节省资源,缺点就是对时间要求严格,对硬件电路依赖比较严重
    通过通信线,来读取外模块寄存器的功能。在指定的位置写寄存器和指定的位置读寄存器两个功能。
    【江科大】STM32:I2C通信(上)_第1张图片
    【江科大】STM32:I2C通信(上)_第2张图片
    主机对SCL和SDA有控制权
    在任何时候,主机都拥有对SCL的完全控制。
    在空闲状态下,主机可以主动发起对SDA的控制,只有在从机应答或者发送数据,主机才会转交SDA的控制权给从机
    在这里插入图片描述

硬件电路

在这里插入图片描述

【江科大】STM32:I2C通信(上)_第3张图片
在这里插入图片描述
【江科大】STM32:I2C通信(上)_第4张图片

上拉

【江科大】STM32:I2C通信(上)_第5张图片

下拉

【江科大】STM32:I2C通信(上)_第6张图片
根据上面的几个方面的问题,总以为以下三点:
所有2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式(低电平有效)
SCL和SDA各添加一个上拉电阻,阻值一般为4.7K2左右

【江科大】STM32:I2C通信(上)_第7张图片

对弱上拉的理解

外部通过外界两个上拉电阻,来将低电平拉到高电平
这是一个弱上拉:举个例子:
SCL和SDA是一根杆子,为了防止向上推杆子,有人向下拉杆子,造成冲突。
我们就规定所有的人不可以向上推杆子,只能选择向下拉和松手。
然后我们外置一根弹簧向上拉,要是想输出低电平就往下拽。那么弹簧就会拉下来
而想输出高电平,松手,弹簧就会回弹到高电平。
因此:不管多少人想拉杆子,杆子都不会出现同时强拉和强推的情况。
避免了引脚的频繁切换。开漏加弱上拉的模式,同时兼具了输入和输出的功能。
向输出,就去拉杆子,想输入放手。因为开漏模式下,输出高电平就相当于断开引脚。
所以在输入之前直接输出高电平。不需要再切换成输入模式。
并且存在线与的现象,就是只要有一个或者多个设备输出低电平,总线就处于低电平。
只有所有的设备都输出高电平,总线才处于高电平。,2c可以利用这个电路特征执行多主机模式
下的时钟同步和总线仲裁。
在这里插入图片描述

【江科大】STM32:I2C通信(上)_第8张图片

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