IIC代码波形对照详解

IIC是一种由飞利浦公司发明的多主从串行总线,使用SCL和SDA两条线进行通信。在开始通信时,数据线在时钟线高电平时下降沿表示开始。传输数据过程中,数据在SCL的低电平时变换,在高电平时保持稳定。C语言代码展示了如何生成开始信号、发送和接收数据,以及处理应答和停止信号的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IIC简介

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

(随便百度了一下,相关介绍资料较多,就不赘述了。)

推荐看这一篇 “ IIC通信协议”-- 白码王子小张http://t.csdnimg.cn/2RBWe

通信过程中的几种状态

  1. 开始 IIC_Start()

从协议的角度来说,当时钟信号(SCK)处于高电平时,数据线(SDA)产生下降沿,表示开始通信。

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

结合C语言代码

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

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

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

  1. 发送 IIC_Write_Byte()

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

(详情请阅读这篇文章 -->http://t.csdnimg.cn/2RBWe

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

结合C语言代码

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

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

  1. 将 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拉低。

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

  1. 等待回复IIC_Wait_Ack()

结合代码来说

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

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

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

  1. 接收IIC_Read_Byte()

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

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

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

  1. 停止IIC_Stop()

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

结合代码

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

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

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

  1. 发送回复IIC_Send_Ack()

发送回复是在主机接受完一帧(字节)数据后,回应从机,表示这一帧(字节)数据接收完毕,继续发送下一帧(字节)数据。

实际波形如下图

结合代码和图片来说

  1. 发送不回复IIC_NoAck()

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

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

C语言代码分享

示例工程还未整理,后面准备出一个STM32F103 和 屏幕通讯的示例工程。

阿里网盘: 阿里云盘分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值