IIC代码波形对照详解

IIC简介
IIC(Inter-Integrated Circuit)是一个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线,属于半双工同步传输类型总线。IIC总线是非常常见的数据总线,仅仅使用两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA。

通信过程中的几种状态
1. 开始 IIC_Start()
从协议的角度来说,当时钟信号(SCK)处于高电平时,数据线(SDA)产生下降沿,表示开始通信:


如上图所示,在时钟线处于高电平时,数据线下降沿代表开始信号。

结合C语言代码 :


在开始通信前,先将时钟线、数据线所对应的IO口,配置成输出模式。

设置时钟线和数据线为高电平,延时4微妙后,拉低数据线,产生下降沿,表示通信开始。

在产生开始信号后,延时4微妙,拉低时钟线,准备发送或接受和数据。

2. 发送 IIC_Write_Byte() :
      传输数据时,每一位数据都有一个时钟脉冲相对应,即在SCL串行时钟的配合下,在SDA上逐位地传送每一位数据。进行数据传输时,在SCL的高电平期间SDA上的电平必须保持稳定,只有在SCL为低电平期间,才允许SDA上的电平改变状态。即数据在SCL的上升沿到来之前就必须准备好,并在下降沿到来之前保持稳定。

        结合实际电平信号图可以看到,数据线的电平变换在时钟线的低电平期间,而在时钟线的高电平期间都处于稳定状态。正好印证了上面有关传输数据时的协议规定。

结合C语言代码:


结合IIC_Start()函数,在发送第一个数据前,SCL已经处于低电平状态,此状态可以变换数据线的数据(高低电平)。

A. 在发送数据之前,要保证时钟线处于低电平,数据线 IO 处于输出状态 ;

B. 将 1 字节的数据,具体化为八个时钟周期内连续的高低电平 ;

落实到具体的代码逻辑就是 (&)按位与 和(<<)左移。比如,要发送的数据为 0xA0 ,转换成二进制 即 1010 0000 b  。而发送都是从高位先开始发送,即发送顺序为1、0、1、0、0、0、0、0。结合实际代码 0xA0 先左移 0 位 然后 和 0x80进行 按位与 操作

(1010 0000) & (1000 0000) = 1 & 1 = 1 ;

如果 左移 后的 按位与 操作的结果为 1 就将 SDA置为 高电平 否则 SDA拉低。

C. 数据发送完成后将 时钟线拉低 ;

3. 等待回复IIC_Wait_Ack() :

结合代码来说 :


首先,开始读取前,将数据线 IO 设置成输入模式,准备读取从机的回复信号。

用while()一直等待,当收到从机低电平信号时,表示从机应答成功,否则继续等待。

等待超过205次后,返回应答超时停止等待,发送停止信号,结束通信。

4. 接收IIC_Read_Byte() :

从实际电平信号图看,发送数据和接收数据的逻辑是完全一样的 :


从代码来说,也没啥特别需要注意的,就是在读取之前将数据线IO设置为输入。

就是为了使波形更加标准,对延时的数值进行了微调,使实际的时钟波形都在8us左右。

5. 停止IIC_Stop() :
在SCL保持高电平期间,SDA被释放,由低电平转变为高电平,产生上升沿,称为I2C总线的停止信号,标志着一次数据传输的终止。


结合代码:


发送结束信号前,先将数据线和时钟线拉低。

先拉高时钟线,延时4us后,拉高数据线,产生上升沿,发送结束信号。

发送结束信号后将数据线和时钟线都设为输入模式。

6. 发送回复IIC_Send_Ack() :
发送回复是在主机接受完一帧(字节)数据后,回应从机,表示这一帧(字节)数据接收完毕,继续发送下一帧(字节)数据。实际波形如下图:


结合代码和图片来说 :


7. 发送不回复IIC_NoAck() :
发送不回复是在主机接完最后一帧(字节)数据后,回应从机,表示这一帧(字节)数据接收完毕,停止数据接收。IIC_NoAck() 后面紧跟的是 IIC_Stop()信号 :

8. 代码和波形图基本和 IIC_ACK() 是一致的,只是数据线一直处于高电平没有拉低 :


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值