串口的缺点

串口通过Tx,Rx两根线交叉连接实现两台设备间的双向通信
缺点:只能实现一对一通信,也就是一个串口只能连接一个串口设备。
stm32的3个串口
我们使用的这个stm32单片机只有3个串口——USART1,USART2,USART3,也就意味着这个单片机只能连接3个串口设备。
如果想要连接更多的设备该怎么办呢?有没有一种通信接口只用一个接口就可以连接多个设备呢?
有!通过I2C总线,我们连接的设备数量几乎不受限制。

I2C总线的电路结构

I2C基本电路结构
I2C总线主要有串行时钟线(SCL)串行数据线(SDA)这两根线组成。
一般情况下,对于I2C总线来说,它只有
一个主机
,一般使用单片机作为I2C总线的主机,其他被连接的设备作为从机。对于这些设备来说,它们都有两个引脚——SCL和SDA,所有的SCL引脚连在SCL线上,使用的SDA引脚连接在SDA线上,分别给SCL,SDA上加一个上拉电阻,这就组成了I2C的基本电路。
对每个从机来说,它都有7位地址,地址范围从0000000(7个0)~1111111(7个1)。000000——>0(十进制),1111111——>127(十进制),共128个地址,扣除一些特殊地址外,约100+个地址,所以I2C可以与100多个设备进行通信。
I2C通信流程:
I2C通信流程图

数据线和时钟线

时钟线和数据线

SCL时钟线,用来传输时钟信号,时钟信号就是如同所示的高低变化的电压,时钟信号的每个周期,数据线上会传输一位数据,所以时钟信号的频率控制了数据传输的快慢。
时钟信号总是由主机(单片机)传输给从机。(单向的
时钟信号与数据信号

SDA数据线,用来传输数据信号,数据线传输有效数据,低电压表示0,高电压表示1。
数据信号的通信方向是双向的,可以是主机发给从机,也可以是从机发给主机。(双向的

逻辑线与的实现

逻辑线与
下面我们来解释一下此处设置为开漏输出上拉电阻的作用。

逻辑与
我们之前学过逻辑与运算,现在我们将其运算原理迁移至硬件电路上。
I2C电路
向所有设备的SCL引脚都写1的情况
由于SCL和SDA原理相同,我们此处只分析SCL。我们向所有设备的SCL引脚都写1,在开漏输出模式下,写1两个MOS管都是断开的,IO悬空,I=0,由欧姆定律可知,R=U/I,此时输出一个高阻抗,连接SCL的引脚处于断开状态。相当于SCL这根线悬空了,但是上拉电阻会将悬空的导线拉到一个高电压(提供高压),将电压值拉高。所以,当我们把所有的SCL引脚写1时,最终会输出一个高电压,高电压用1表示。
向其中一个引脚写0的情况
我们向如图所示的设备的SCL引脚分别写1,1,0,1。写1的设备在开漏模式下呈现出高阻抗特性,连接的SCL引脚从电路上断开,写0的设备引脚输出一个低压,也就是0,相当于接地,所以SCL线就通过写0的那个引脚接地了,此时上拉电阻不起作用。所以,当X1到Xn中,任意一个为0,最终Y的输出结果为0。
通过以上方式我们实现了逻辑线与。

主机如何发送时钟信号

时钟信号是一系列高低变化的电压,只能由主机(单片机)产生发送给从机,是单向的。
那单片机是如何产生这种高低变化的信号的呢?
首先将从机的SCL引脚都设置成1,相当于从电路中断开,向主机的SCL引脚交替写0/1,写0时,在开漏输出模式下,相当于接地,在总线上输出一个低电压。写1时,主机的SCL引脚也从电路中断开,SCL线悬空,由于上拉电阻的存在,输出一个高电压。
通过公式来理解,我们向所有的从机写1,控制主机向SCL上写0/1,写0的时候与运算表达式的值为0,也就是一个低电压;反之,与运算式中都为1,最终运算结果为1,也就是一个高电压。
主机发送时钟信号

主机如何发送数据

主机发送数据
与上面说的主机发送时钟信号原理类似,我们将所有从机的SDA引脚都设置成1,开漏模式下,相当于从电路中断开。我们控制主机(单片机)交替的写0/1,写0时,开漏模式下,相当于接地,输出一个低电压,写1时,所有的SDA线都从电路中断开,又到上拉电阻发力的时候了,上拉电阻将悬空的SDA线拉至高电压,此时发送的是一个高压,也就是1。
结合公式理解,此处不再赘述。

从机如何发送数据

对于I2C总线来说,数据通信是双向的,主机可以向从机写数据,也可以从从机读数据。
主机的SDA引脚写1断开,除了通信的从机,其他的从机的SDA引脚也写1断开,要发送数据的从机向SDA引脚写0/1。
写0的时候相当于SDA线接地,输出低压。
从机发送数据

写1的时候SDA线断开,上拉电阻拉至高电压,所以写1就是输出高电压。
从机发送数据

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐