前言:I2C通信是一种单片机的通讯协议,它分为软件I2C与硬件I2C,下面会具体介绍。很多外设都支持IIC通信协议,如MPU6050(六轴陀螺仪),OLED显示屏等等。
一、I2C简介
IIC通信为半双工的通信方式,只有一根数据线SDA(SDA通信引脚)和一根时钟线SCL(SCL通信引脚)。属于一主多从的总线结构,总线上的每个设备都有特定的地址(互不相同),通信都由主设备发起,从设备响应,拥有应答机制。
如图,IIC通信全部采用外置弱上拉电阻加开漏输出的电路结构。相当于图二中对于一根数据线,弱上拉高电平相当于一个向上拉的弹簧,所有设备都只能输出低电平或不输出。这样就可以杜绝短路现象,而且不需要频繁切换引脚模式。当设备需要输出信息时,只需要在低电平与不输出之间切换即可输出具有信息的高低电平波;当设备需要接受信息时,只需要不输出电平,然后观察高低电平变化即可。关于数据的收发,是由SDA与SCL两条线的电位变化来决定,这就有关IIC时序的基本单元。
SCL通信引脚用于时钟控制,与时钟控制寄存器(CCR)连接,用于控制时钟。
SDA通信引脚用于数据控制,由DR(数据寄存器)将数据传给数据移位寄存器再进行输出;
输入数据则是数据先从SDA引脚传到数据移位寄存器中再传给DR。
以下是I2C的功能框图,具体时序逻辑看下面介绍
二、I2C通信时序简介
通讯起始标志:SCL处于高电平,SDA由高电平转为低电平,而后SCL也进入低电平。
通讯结束标志:SDL处于高电平,SDA由低电平转为高电平,而后SCL也进入高电平。
当主机向从机传输数据时,首先主机会将本来上拉为高电平的SCL线给拉低为低电平,表示可以开始传输数据。这时SDA会通过高低电平的变化来向从机传输数据位。当这个过程重复8次,就能传输一个字节。如下图:
当从机接收数据时,只有当SCL为低电平时数据才能传输,所以所有从机包括主机在接收数据时,都是SCL低电平起始,SCL低电平结束。中间在传输完成一个数据为后SCL会短暂升为高电平,表示一个数据位传输完成(这与后面要将的应答机制有点关系)
三:应答机制
I2C的应答机制的存在就是为了防止程序出错造成的一系列后果,保证数据传输的准确性。
具体的内容,可以看手册,这里不过多介绍。重要的内容在于代码的编写,后续我会上传I2C的代码。