I2C通信协议在众多工程中有广泛的应用,数据采集,摄像头,各种单片机中应用,I2C硬件实现简单,扩展性强,广泛应用于集成电路模块之间的通信。
更多技术文章,全网首发公众号 “极客之昂” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!
传统的设备通信通过串口进行,但是三个设备甚至四个更多的设备之间两两通信的时候,这种串口连接的方式就会很复杂。
I2C虽然硬件实现简单不代表不重要,更需要深刻透彻的理解IIC原理。
更多技术文章,关注 - 最常用的通信协议 - I2C
目录
1.I2C概述
I2C(又称IIC,Inter-Integrated Circuit),即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发,用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。
I2C总线由SDA(数据线)和SCL(时钟线)构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。
I2C支持多个设备共用的信号线,支持多个通讯主机及多个通讯从机。
总线上的每一个设备都可以作为主设备或者从设备,且每一个设备都会对应一个唯一的地址,主从设备通过这个地址来识别确定与哪个设备进行通信。
2.I2C读写操作
我们了解了I2C基本原理之后,再来看一下如何进行设备间的读写操作。
首先,需要了解SCL时钟线 和SDA数据线 之间的数据传输原理。
SCL高电平有效,当SDA数据线在下降沿的时候表示为逻辑0,当SCL和SDA共同为高电平的时候为逻辑1。
当SCL时钟持续脉冲发出方波的时候,SDA数据线根据所需改变高低电平,形成逻辑0/1,组合到一起就可以获取一串二进制数值。
如图,通过SCL 和SDA组合获取的值为:1010 000 。
这样就会看最基本的时序图了!
3.I2C写数据过程
I2C中“一主多从”的通讯模式,主设备如何与从设备通信?如何保证访问从设备的方式?这都通过SCL时钟线和SDA数据线共同制定协议来完成。
接下来,我将一步步从起始信号到如何区分从设备,如何和从设备进行读写操作,到最后的结束信号,
将整个过程一一道来,大家坐好小板凳认真听!
I2C通信是分成读数据和写数据两个部分,首先讲解写数据的过程,读数据过程类似,下面分别介绍。
写数据的过程:
每一帧的写数据是由时钟线和数据线共同作用,在同一时间,不是发送信息就是在读取信息。
这是标准的写数据帧,包括起始位,设备地址,应答位,写入寄存器的地址,写入数据,停止位组成。
第一步,起始信号。在空闲状态的时候,数据线和时钟线都是高电平,当数据线在下降沿的时候,就是写数据的起始信号。
第二步,设备地址。不同的从设备使用不用的地址码,每一个设备都有唯一的7位地址码,地址A0-A6。
第三步,读写位和应答信号。写数据时读写位置为0,读数据置为1,如上图读写位为0是写数据。应答信号是从设备发给主机的, 0表示收到,1表示没收到或者读取完成。
第四步,寄存器地址。设备的寄存器地址是8位的,发送的8位寄存器地址可以访问256个字节。如果访问的寄存器地址为 0000 0001,在寄存器地址填入 0X01即可。
传完寄存器地址后也需要应答信号,完成填入0。
第五步,要写入的数据。写入数据也是8位,在之前填入的寄存器地址的位置填入8位数据。如果在寄存器地址 0X01处写入数据 1000 1111,原理如下图。
数据写完后,通知主机写入成功,发送应答信号0。
第六步,停止位。与起始位相反,当SCL时钟线为高的时候,SDA数据线由低到高,完成一帧数据传输。
如上就是完成了一个标准的写数据帧。
举例,给地址为000 0001的从设备,在0X0F的寄存器写入1111 1111数据,IIC如何完成写数据帧呢?如下图。
4.I2C读数据过程
读数据的过程也是类似的,只不过多了一次设备地址的操作。
如上图,将000 0001从设备的0X0F的数据0101 0000读出。
其中,在读数据帧的过程中,有两点需要注意:
一、在第一次获取设备地址读写位是0,获取寄存器地址后会再次获取设备地址,第二次读写位置为1,之后再将读的数据接收。
二、最后的应答信号是1,是由主机发给从机的,表示读取完成。
本文只是针对I2C原理进行介绍,并没有针对代码实现进行讲解,毕竟通过原理了解整个实现机制更容易深刻理解I2C通讯过程。
希望大家通过这篇文章学会I2C通讯原理!