打印

单片机的I2C通信

[复制链接]
339|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LOVEEVER|  楼主 | 2023-12-16 16:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。它结合了 SPI 和 UART 的优点,您可以将多个从机连接到单个主机(如SPI那样),也可以使用多个主机控制一个或多个从机。当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD时,这将非常有用。



SDA (Serial Data) – 数据线。

SCL (Serial Clock) – 时钟线。

I2C是串行通信协议,因此数据沿着SDA一点一点地传输。与SPI一样,I2C也需要时钟同步信号且时钟始终由主机控制。



使用特权

评论回复
沙发
LOVEEVER|  楼主 | 2023-12-16 16:22 | 只看该作者
工作原理

I2C的数据传输是以多个msg的形式进行,每个msg都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的ACK / NACK位:





启动条件:当SCL是高电平时,SDA从高电平向低电平切换。

停止条件:当SCL是高电平时,SDA由低电平向高电平切换。





地址帧:每个从属设备唯一的7位或10位序列,用于主从设备之间的地址识别。

读/写位:一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。

ACK/NACK:消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。

寻址

由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 —— 寻址 。

主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。

读/写位

地址帧的末尾包含一个读/写位。如果主机要向从机发送数据,则为低电平。如果是主机向从机请求数据,则为高电平。

数据帧

当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。

使用特权

评论回复
板凳
LOVEEVER|  楼主 | 2023-12-16 16:24 | 只看该作者
传输步骤

1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。

2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:





3. 每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。





4. 主机发送或接收数据帧:



5. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:



6. 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。

使用特权

评论回复
地板
LOVEEVER|  楼主 | 2023-12-16 16:25 | 只看该作者
单个主机VS多个从机

由于I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。使用10位地址并不常见,但可以提供1,024(210)个唯一地址。如果要将多个从机连接到单个主机时,请使用4.7K欧的上拉电阻将它们连接,例如将SDA和SCL线连接到Vcc:



多个主机VS多个从机

I2C支持多个主机同时与多个从机相连,当两个主机试图通过SDA线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送消息之前检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正在控制总线。如果SDA线高,则可以安全地发送数据。如果要将多个主机连接到多个从机,请使用4.7K欧的上拉电阻将SDA和SCL线连接到Vcc:



优劣

与其他协议相比,I2C可能听起来很复杂。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:

优点

仅使用两根电线

支持多个主机和多个从机

每个UART的波特率必须在彼此的10%之内

硬件比UART更简单

众所周知且被广泛使用的协议



缺点

数据传输速率比SPI慢

数据帧的大小限制为8位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

297

主题

2027

帖子

4

粉丝