打印
[新唐博主]

单片机I2C时序介绍

[复制链接]
462|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

 在硬件上,I2C 总线是由时钟总线 SCL 和数据总线 SDA 两条线构成,连接到总线上的所有器件的 SCL 都连到一起,所有 SDA 都连到一起。I2C 总线是开漏引脚并联的结构,因此我们外部要添加上拉电阻。对于开漏电路外部加上拉电阻,就组成了线“与”的关系。总线上线“与”的关系就是说,所有接入的器件保持高电平,这条线才是高电平,而任何一个器件输出一个低电平,那这条线就会保持低电平,因此可以做到任何一个器件都可以拉低电平,也就是任何一个器件都可以作为主机,如图 14-1 所示,我们添加了 R63 和 R64 两个上拉电阻。


      



  虽然说任何一个设备都可以作为主机,但绝大多数情况下我们都是用单片机来做主机,而总线上挂的多个器件,每一个都像电话机一样有自己唯一的地址,在信息传输的过程中,通过这唯一的地址就可以正常识别到属于自己的信息,在 KST-51 开发板上,就挂接了 2 个I2C 设备,一个是 24C02,一个是 PCF8591。



使用特权

评论回复
沙发
onlycook|  楼主 | 2023-4-18 09:29 | 只看该作者

我们在学习 UART 串行通信的时候,知道了通信流程分为起始位、数据位、停止位这三部分,同理在 I2C 中也有起始信号、数据传输和停止信号,如图 14-2 所示。



                  


  从图上可以看出来,I2C 和 UART 时序流程有相似性,也有一定的区别。UART 每个字节中,都有一个起始位、8 个数据位、1 位停止位。而 I2C 分为起始信号、数据传输部分、停止信号。其中数据传输部分,可以一次通信过程传输很多个字节,字节数是不受限制的,而每个字节的数据最后也跟了一位,这一位叫做应答位,通常用 ACK 表示,有点类似于 UART的停止位。


使用特权

评论回复
板凳
onlycook|  楼主 | 2023-4-18 09:30 | 只看该作者

下面我们一部分一部分的把 I2C 通信时序进行剖析。之前我们已经学过了 UART,所以学习 I2C 的过程我尽量拿 UART 来作为对比,这样有助于更好的理解。但是有一点大家要理解清楚,就是 UART 通信虽然用了 TXD 和 RXD 两根线,但是实际一次通信中,1 条线就可以完成,2 条线是把发送和接收分开而已,而 I2C 每次通信,不管是发送还是接收,必须 2条线都参与工作才能完成,为了更方便的看出来每一位的传输流程,我们把图 14-2 改进成图14-3。


                  



  起始信号:UART 通信是从一直持续的高电平出现一个低电平标志起始位;而 I2C 通信的起始信号的定义是 SCL 为高电平期间,SDA 由高电平向低电平变化产生一个下降沿,表示起始信号,如图 14-3 中的 Start 部分所示。


  数据传输:首先,UART 是低位在前,高位在后;而 I2C 通信是高位在前,低位在后。其次,UART 通信数据位是固定长度,波特率分之一,一位一位固定时间发送完毕就可以了。而 I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候,SDA 允许变化,也就是说,发送方必须先保持 SCL 是低电平,才可以改变数据线 SDA,输出要发送的当前数据的一位;而当 SCL 在高电平的时候,SDA 绝对不可以变化,因为这个时候,接收方要来读取当前 SDA 的电平信号是 0 还是 1,因此要保证 SDA 的稳定,如图 14-3 中的每一位数据的变化,都是在 SCL 的低电平位置。8 位数据位后边跟着的是一位应答位,应答位我们后边还要具体介绍。


  停止信号:UART 通信的停止位是一位固定的高电平信号;而 I2C 通信停止信号的定义是 SCL 为高电平期间,SDA 由低电平向高电平变化产生一个上升沿,表示结束信号,如图14-3 中的 Stop 部分所示。


使用特权

评论回复
地板
星辰大海不退缩| | 2023-4-23 21:00 | 只看该作者
I2C讲解的很透彻

使用特权

评论回复
5
gejigeji521| | 2023-4-23 22:08 | 只看该作者
感谢分享

使用特权

评论回复
6
dspmana| | 2023-5-10 20:06 | 只看该作者
I2C的从模式与主模式的区别是什么?

使用特权

评论回复
7
nomomy| | 2023-5-10 20:34 | 只看该作者
和SMBus有什么区别?              

使用特权

评论回复
8
juliestephen| | 2023-5-10 20:58 | 只看该作者
SDA 和SCL 的I/O 管脚必须悬空,不能阻塞总线。

使用特权

评论回复
9
zerorobert| | 2023-5-10 21:50 | 只看该作者
I2C的时序是比较复杂的              

使用特权

评论回复
10
AloneKaven| | 2023-5-10 22:48 | 只看该作者
zerorobert 发表于 2023-5-10 21:50
I2C的时序是比较复杂的

iic时序已经算简单的了

使用特权

评论回复
11
louliana| | 2023-5-11 17:45 | 只看该作者
I2C采用了漏极开路的设计,只会拉低总线,或“释放”它并让上拉电阻将其拉高。

使用特权

评论回复
12
sdCAD| | 2023-5-11 17:51 | 只看该作者
I/O端口模拟I2C时序为什么要延时

使用特权

评论回复
13
beacherblack| | 2023-5-11 20:06 | 只看该作者
能把I2C的时序弄清,那其他器件的时序都不成问题了。

使用特权

评论回复
14
kkzz| | 2023-5-11 20:29 | 只看该作者
I2C总线由两根双向信号线组成。一根是数据线SDA,另一根是时钟线SCL。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

435

主题

1620

帖子

3

粉丝