嵌入式铁头山羊stm32-I2C的基本电路结构与通信协议-Day10
I2C通信协议摘要:I2C是一种支持多设备连接的双线制串行通信协议,通过SCL时钟线和SDA数据线实现通信。其核心特点是开漏输出配合上拉电阻实现"逻辑线与"机制,使得单主机可控制多个从机(最多128个)。通信流程包含起始位、地址帧(7位地址+读写位)、数据帧(8位数据+应答位)和停止位。主机通过控制时钟信号发起通信,从机通过拉低SDA线应答。相比USART的一对一通信,I2C具
目录
1.I2C的基本电路结构(注意是简单的原理电路结构不是模块外设的结构)
1.I2C的基本电路结构(注意是简单的原理电路结构不是模块外设的结构)
(1)串口的缺点
目的是:前面学习了一种通信协议USART,但是这里为啥还要学第二种,因为串口有
缺点:很明显就是每个串口只能最多和一个设备建立通信连接,即只能一对一的通信。
那比如使用的c8t6上的就三个串口,所以最多只能连接三个设备
而I2C则实现了一个接口就可以连接很多的设备
(2)I2C的基本结构
- 一个主机,
- 多个从机(支持100多个,因为7位地址的话,是2^7次=128,从0-127,抛去特殊的地址也还有100多个)
- 两条总线(SCL,SDA)
- 每个设备(主机或者从机)都要连接SCL和SDA线
- 每条总线都要串行一个带有上拉电阻的高电压,
(3)时钟线和数据线
- 时钟线,SCL(clock),特点:单向,只能主机往从机发时钟信号,时钟信号显示为:高低变换的信号---主要用来控制通信的速度
- 数据线,SDA(data),特点:双向,可以主发从收或者从发主收,数据信号显示为:0/1
注意:一个时钟信号周期下会传输一个数据,所以周期频率越快,数据传输越快(即频率控制快慢)
(4)逻辑线与(通信关键)
*逻辑与是I2C通信的关键。
规定I2C协议下的所有SLA,SDA使用的引脚都是开漏输出(因为需要契合逻辑线与)以及这两个上拉电阻也起了关键的作用。
首先,怎么就契合了,其实是比如拿其中一个总线SCL来说,
(1)比如连接SCL的主机和所有从机都发送高电压信号1,那么都处于开漏输出的引脚就会导致高阻抗,既而因连接了上拉电阻的高电压使得整个线路里面都是呈现的高电压。
这也刚好对应着逻辑线与的全1为1
(2)比如连接SCL的只要有一个是发送的0信号,就会导致开漏输出是接通的,既而就导致了线路的低电压。
这也刚好对应的逻辑线与的有0为0
(5)理论上先理解一下主机如何发送时钟信号
关键逻辑线与(主机的0/1和其他的1进行逻辑与)
其实就是SCL上的其他从机的SCL引脚都设置为1,而主机的SCL引脚则是0/1变换的,
即主机发送0/1信号给主机的SCL引脚去控制整个总线的时钟信号变换
(6)理论上先理解一下主机如何发送数据
同上,其实就是主机给SDA引脚发送0/1的信号,而其他从机的SDA的引脚只能是1,既而控制整个总线的信号变换
(7)理论上先理解一下主机如何接收数据
同上,其实就是 从机 给SDA引脚发送0/1的信号,而其他从机和主机的SDA的引脚只能是1,既而控制整个总线的信号变换
2.通信协议
(1)I2C通信的基本流程(重点)
首先,一定是主机发送一个起始位,表示通信的开始。
之后是寻址阶段:一定是主机发送一个字节下的(7位的地址+0/1的写读操作位),然后从机响应ACK
之后就是通信双方谁是主,谁是从。
主:发送字节
从:发送ACK响应或者不发送数据即不响应
最后一定是主机发送停止的信号,即发送一个停止位,表示要停止了
所以注意,整个流程中,只有第二阶段从机才有可能发送数据,其他时间都是主机发送信号;以及注意不管是主机还是从机发送其本质上:接收方都是高阻抗的开漏输出,而发送方则是靠往自己的SCL/SDA引脚发送0/1信号既而使总线上的信号为高//低电压信号
(2)I2C的数据帧格式
和串口类似,都有的起始位,数据位(8-9的数据位和有无的校验位),停止位。而这里
- 起始位
- 寻址的一个字节的8位(7位地址和反馈)
- 数据位(默认的9位:一定也只能是8位的一个字节+一个响应位,)。
- 停止位
(3)起始位和停止位
(4)寻址
发送起始位后,发送寻址的一个字节数据(即7位的数据和1位的R/W)
寻址需要有应答,一般来说返回ACK的情况是:主机发送完地址位的数据后就要断开释放SDA总线,不准备发数据了,即断开SDA(即主机在开漏模式下发送1),即回到默认的高阻抗模式,而从机应答的方式是将SDA拉为低电压(从机发送0),既而表明从机响应了。
所以寻址的响应简单来说就是主机此时持续的高电压表示没人应答,寻址失败,
而主机如果此时检测到低电压,则表示寻址成功
(5)传输数据
发送数据就是前面讲的:谁是主谁是从
(6)例子
首先SCL发送的是时钟信号,表示的是发送数据的一个一个的周期,其中一个信号周期对应SDA发送的一次比特位数据。
之后的SDA开始发送数据,起始位,寻址位,数据位,停止位(注意如果只是发送一个字节的数据,接收方可以不应答,即表示NAK的信号,因为就一个字节,发完不发了,所以不响应也行)
更多推荐



所有评论(0)