I2C串口通信

I2C通信是一种同步串行通信方式,它有两根双向信号线。一根是数据线SDA(serial data I/O),另一根是时钟线SCL(serial clock)。IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信目标。数据的通信的方式采用主从方式,主机负责主动联系从机,而从机则被动回应数据。

总线电路结构
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

I2C总线传输协议内容
1,数据位的有效性规定:SCL为高电平期间,数据线上的数据必须保持稳定,只有SCL信号为低电平期间,SDA状态才允许变化。(可以理解为,要读取信号的时候,SCL必须为高电平,要写入信号的时候,SCL为低电平,软件编程实现该协议的时候需要注意这一点)
2,起始和终止信号的形式约定
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
由于起始和终止信号都不属于数据位,故不用遵循数据位有效性规定。
3,I2C字节的传送与应答
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

应答位的作用
1,主机在发送数据时,每次发送一字节数据,都需要读取从机应答位,当从机空闲可以接收该字节数据时,从机会发出应答(一帧数据的第9位为“0”),当从机正忙于其他工作的处理来不及接收主机发送的数据时,从机会发出非应答(一帧数据的第9位为“1”)主机则应发出终止信号以结束数据的继续传送,主机通过从机发出的应答位来判断从机是否成功接收数据。
2,当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是对从机发送“非应答”,即在最后一帧的第9位置1。然后,从机释放SDA线,以允许主机产生终止信号。

I2C读写数据流程
I2C写数据流程
这里写图片描述
在起始信号后必须传送一个从机的地址(7位),单片机开发板上的AT24C02地址为0xa0,第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
I2C读数据流程
这里写图片描述
在读数据时也要先发送器件地址,读写方向为写,因为我们下一帧需要发送从AT24C02内哪个单元开始读,所以需要发送一帧读取的首地址。之后需在发一次器件地址这个时候读写方向就为读了,接着我们就可以从总线上读取数据。
PS:上述图片中灰色部分为主机发送内容,白色部分为从机发送内容,S表示起始信号,A表示应答,A横杠表示非应答,P表示终止信号

I2C总线的各种信号的持续时间的要求:
I2C串口通信_第1张图片

nop()函数的作用:延迟一个机器周期,经常被用于让信号传输稳定一段时间

软件编程实现I2C通信的时候,只要SDA赋值操作,前面必须有SCL置零的操作(起始信号和终止信号除外),可以理解为只有SCL为高电平时,SDA线上的数据信号才是有效的;SCL为低电平时,SDA线的数据信号是无效的。

不论主机是发送数据还是接收数据,SCL(时钟总线)始终是由主机控制的,即便是主机读取数据,也可以控制读取数据的时间节奏。

在软件实现I2C通信的时候,每次基本操作结束之后,必须将SCL线拉低,因为如果之后是从机发送信号(应答信号或者数据信号),若此时SCL线是高电平,从机并没有权限修改SCL线的电平,则它无法改变SDA线的值(参照之前提到的数据位有效性规定)。
操作结束之后,最好将SDA线拉高来表示数据总线被释放。

你可能感兴趣的:(单片机)