在硬件上,I2C总线是由时钟总线SCL和数据总线SDA两条线构成,连接到总线上的一切器材的SCL都连到一同,一切SDA都连到一同。I2C总线是开漏引脚并联的结构,因而咱们外部要添加上拉电阻。关于开漏电路外部加上拉电阻,就组成了线“与”的联系。总线上线“与”的联系便是说,一切接入的器材坚持高电平,这条线才是高电平,而任何一个器材输出一个低电平,那这条线就会坚持低电平,因而能够做到任何一个器材都能够拉低电平,也便是任何一个器材都能够作为主机,如图14-1所示,咱们添加了 R63 和 R64 两个上拉电阻。
图14-1 I2C 总线的上拉电阻
尽管说任何一个设备都能够作为主机,但绝大多数情况下咱们都是用单片机来做主机,而总线上挂的多个器材,每一个都像电话机相同有自己仅有的地址,在信息传输的进程中,经过这仅有的地址就能够正常识别到归于自己的信息,在 KST-51 开发板上,就挂接了2个 I2C 设备,一个是 24C02,一个是 PCF8591。
咱们在学习 UART 串行通讯的时分,知道了通讯流程分为开始位、数据位、中止位这三部分,同理在 I2C 中也有开始信号、数据传输和中止信号,如图14-2所示。
图14-2 I2C 时序流程图
从图上能够看出来,I2C 和 UART 时序流程有相似性,也有必定的差异。UART 每个字节中,都有一个开始位、8个数据位、1位中止位。而 I2C 分为开始信号、数据传输部分、中止信号。其间数据传输部分,能够一次通讯进程传输许多个字节,字节数是不受约束的,而每个字节的数据最终也跟了一位,这一位叫做应对位,通常用 ACK 表明,有点类似于 UART 的中止位。
下面咱们一部分一部分的把 I2C 通讯时序进行分析。之前咱们现已学过了 UART,所以学习 I2C 的进程我尽量拿 UART 来作为比照,这样有助于更好的了解。可是有一点咱们要了解清楚,便是 UART 通讯尽管用了 TXD 和 RXD 两根线,可是实践一次通讯中,1条线就能够完结,2条线是把发送和接纳分隔罢了,而 I2C 每次通讯,不管是发送仍是接纳,有必要2条线都参加作业才干完结,为了更便利的看出来每一位的传输流程,咱们把图14-2改善成图14-3。
图14-3 I2C 通讯流程解析
开始信号: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 部分所示。