|
前边学习了一种通信协议叫做UART异步串行通信,本章要学习第二种常用的通信协议I2C(重要且常用)。I2C总线是由PHILIPS公司开发的两线式串行总线,多用于连接微处理器及其外围芯片。I2C总线的主要特点是接口方式简单,两条线可以挂多个参与通信的器件,即多机模式,而且任何一个器件都可以作为主机,当然同一时刻只能有一个主机。 从原理上来讲,UART属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD发送出来即可,接收数据是单片机自己的事情。而I2C属于同步通信,SCL时钟线负责收发双方的时钟节拍,SDA数据线负责传输数据。I2C的发送方和接收方都以SCL这个时钟节拍为基准进行数据的发送和接收。 从应用上来讲,UART通信多用于板间通信,比如单片机和电脑,这个设备和另外一个设备之间的通信。而I2C多用于板内通信,比如单片机和本章要学的EEPROM之间的通信。 12.1 I2C时序初步认识在硬件上,I2C总线是由时钟总线SCL和数据总线SDA两条线构成,连接到总线上的所有器件的SCL都连到一起,所有SDA都连到一起。I2C总线是开漏引脚并联的结构,因此外部要添加上拉电阻。开漏电路外部加上拉电阻,就组成了线“与”的关系。总线上线“与”的关系就是说,所有接入的器件保持高电平,这条线才是高电平,而任何一个器件输出一个低电平,那这条线就会保持低电平,因此可以做到任何一个器件都可以拉低电平,也就是任何一个器件都可以作为主机,如图12-1所示,添加了R63和R64两个上拉电阻。 图12-1 I2C总线的上拉电阻 虽然说任何一个设备都可以作为主机,但绝大多数情况下都是用单片机来做主机,而总线上挂的多个器件,每一个都像电话机一样有自己唯一的地址,在信息传输的过程中,通过这唯一的地址就可以正常识别到属于自己的信息。 学习UART串行通信的时候,知道了通信流程分为起始位、数据位、停止位这三部分,同理在I2C中也有起始信号、数据传输和停止信号,如图12-2所示。 图12-2 I2C时序流程图 从图上可以看出来,I2C和UART时序流程有相似性,也有一定的区别。UART每个字节,都有一位起始位、8位数据位、1位停止位。而I2C分为起始信号、数据传输部分、停止信号。其中数据传输部分,可以一次传输很多个字节,字节数是不受限制的,而每个字节的数据最后额外跟了一位,这一位叫做应答位,通常用ACK表示,类似于UART的停止位。 下面通过和UART通信做比较的方式把I2C通信时序进行剖析。首先要理解,UART通信虽然用了TXD和RXD两根线,但是实际一次通信中,1条线就可以完成,2条线是把发送和接收分开而已。而I2C每次通信,不管是发送还是接收,必须2条线都参与工作才能完成,为了更方便的看出来每一位的传输流程,把图12-2改进成图12-3。 图12-3 I2C通信流程解析 (1)起始信号:UART通信是从一直持续的高电平出现一个低电平标志起始位;而I2C通信的起始信号的定义是SCL为高电平期间,SDA由高电平向低电平变化产生一个下降沿,表示起始信号,如图12-3中的Start部分所示。 (2)数据传输:首先,UART是低位在前,高位在后;而I2C通信是高位在前,低位在后。其次,UART通信数据位是固定长度,波特率分之一,一位一位固定时间发送完毕就可以了。而I2C没有固定波特率,但是有时序的要求,要求当SCL在低电平的时候,SDA允许变化,也就是说,发送方必须先保持SCL是低电平,才可以改变数据线SDA,输出要发送的当前数据的一位;而当SCL在高电平的时候,SDA绝对不可以变化,因为这个时候,接收方要来读取当前SDA的电平信号是0还是1,要保证SDA的稳定,如图12-3中的每一位数据的变化,都是在SCL的低电平位置。8位数据位后边跟着的是一位应答位,应答位后边还要具体介绍。 (3)停止信号:UART通信的停止位是一位固定的高电平信号;而I2C通信停止信号的定义是SCL为高电平期间,SDA由低电平向高电平变化产生一个上升沿,表示结束信号,如图12-3中的Stop部分所示。
|