IIC 通信协议

article/2025/6/24 6:37:48

一、IIC 通信协议介绍

IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。IIC数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

下图是一个嵌入式系统中处理器仅通过2根线的IIC总线控制多个IIC外设的典型应用图

img

与UART通信一样,I2C仅使用两根信号线在设备之间传输数据:一根是双向的数据线 SDA ,另一根是时钟线 SCL 。

SDA(Serial Data,串行数据)–主设备和从设备发送和接收数据的信号线。

SCL(Serial Clock,串行时钟)–传送时钟信号的信号线。

其时钟信号是由主控器件产生。所有接到 IIC 总线设备上的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。对于并联在一条总线上的每个 IIC 都有唯一的地址。

img

I2C是串行通信协议,因此数据沿着单根信号线(SDA线)一比特一比特地传输。与SPI一样,I2C是同步的,因此比特位输出通过主设备和从设备之间共享的时钟信号同步到比特位采样。时钟信号始终由主设备控制。

IIC 总线在传输数据的过程中一共有三种类型信号,分别为:开始信号结束信号应答信号。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不需要。同时还有空闲状态、数据的有效性、数据传输。

空闲状态

当 IIC 总线的数据线 SDA 和时钟线 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

应答信号

发送器每发送一个字节( 8个bit ),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。

  • 应答信号为低电平时,规定为有效应答位( ACK ,简称应答位),表示接收器已经成功地接收了该字节;
  • 应答信号为高电平时,规定为非应答位( NACK ),一般表示接收器接收该字节没有成功。

二、I2C 工作原理

使用I2C通信协议,数据是以消息的形式传输。消息被分解为数据帧。每条消息都有一个包含从设备的二进制地址的地址帧,以及一个或多个包含正在发送的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件,读/写位和ACK / NACK位

image.png

地址帧:每个从设备唯一的7位或10位序列,用于在主设备要与之通信时标识该从设备。

读/写位:1比特,指定主机是向从机发送数据(低电压电平)还是从从机请求数据(高电压电平)。

ACK / NACK位:消息中的每个帧后都有一个确认/否确认位。如果成功接收到地址帧或数据帧,则会从接收设备向发送方返回一个ACK位。

编址

I2C没有像SPI那样的从设备选择信号线,因此它需要另一种方式来使从设备知道主设备正在向其发送数据,而不是另一个从设备。它通过寻址来实现。地址帧始终是新消息中起始位之后的第一帧。

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

读/写位

地址帧的末尾包含一个位,该位通知从设备,主设备是否要向其写入数据或从中接收数据。如果主设备要向从设备发送数据,则读/写位为低电压电平。如果主设备正在向从设备请求数据,则该位为高电压电平。

数据帧

主设备检测到从设备的ACK位后,就可以发送第一个数据帧了。

数据帧长度始终为8比特,并以最高有效位优先发送。每个数据帧后紧跟一个ACK / NACK位,以验证是否已成功接收到该帧。在发送下一个数据帧之前,主设备或从设备必须接收ACK位(取决于谁发送数据)。

发送完所有数据帧后,主设备可以向从设备发送停止条件以停止传输。停止条件是SDA信号线完成电平由低至高的转换后,SCL信号线紧接着完成电平由低到高的转换,而SCL信号线保持高电平。

三、I2C数据传输步骤

​ A.所有联入I2C中的器件均需具有开漏或集电极开路输出

​ B.通信标准:开始信号——从机地址发送—— 数据传输——停止信号

​ C.每个器件有唯一的识别地址,每个器件都可以发送/接收

​ D.SCL拉低时才可改变数据,每个数据字节8位,第9位是应答位,是接收器件在第9个时钟周期拉底SDA所得,完整的数据传输需要9个时钟脉冲。

​ E.若从器件未在第9位应答,则SDA保持高,解释为传输失败;若第9位应答,则解释为传输完成。分别产生重复START信号或STOP信号释放总线。

1.在将SCL信号线从高电平切换到低电平之前,设备通过将SDA信号线从高电平切换到低电平来每个连接的设备发送启动条件

image.png

启动(START)条件与停止(STOP)条件的时序图如下:

起始信号:当时钟线SCL为高期间,数据线SDA由高到低的跳变。

停止信号:当时钟线SCL为高期间,数据线SDA由低到高的跳变。

在这里插入图片描述

2.主设备向每个从设备发送要与之通信的从设备的7位或10位地址,以及读/写位:

image.png

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

image.png

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

image.png

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

image.png

I2C的优缺点

与其他协议相比,I2C很可能听起来有些复杂,但是有一些充分的理由让您愿意或拒绝使用I2C连接到特定设备:

优点

  • 仅使用两根信号线
  • 支持多个主设备和多个从设备
  • ACK / NACK位用于确认每个帧都已成功传输
  • 硬件不如使用UART复杂

缺点

  • 数据传输速率比SPI慢
  • 数据帧的大小限制为8位
  • 比SPI更复杂的硬件实现

参考:https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol

http://blog.eetop.cn/blog-1561828-6945166.html

https://www.cnblogs.com/liujinggang/p/9656358.html


http://chatgpt.dhexx.cn/article/fxbvgZv5.shtml

相关文章

三大通信协议(二):IIC通信协议

目录 1. 概念2. 硬件连接3. 数据传输协议3.1 开始信号3.2 地址位3.3 读写位(R/W)3.4 应答位(ACK / NACK)3.5 数据位(8Bit)3.6 停止信号 4. 软件编写4.1 初始化4.2 开始信号4.3 IIC发送一个字节数据4.4 IIC读…

IIC通信协议总结

(1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时…

IIC通信协议,搞懂这篇就够了

注:公众号后台发送 “IIC” 即可获取基于STM32上实现软件模拟IIC的完整代码。 I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备…

IIC通讯协议

一、简介 IIC(Inter-integerted Circuit)集成电路总线,该通信协议由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场景下使用,传输距离短,任意…

搜狗搜索正式接入微信公众号

搜狗搜索正式接入微信公众号 6月9日中午消息,搜狗搜索今日宣布正式接入微信公众号数据。用户将在搜狗搜索页面查询和浏览微信公众号文章。 据悉,在搜狗搜索框中输入微信公众号关键词,便可在搜索结果页中查看相关微信公众号的文章列表&#xf…

Python爬虫 selenium自动化 利用搜狗搜索爬取微信公众号文章信息

少年最好的地方就是:虽然嘴上说要放弃,心底却总会憋着一口气。——刘同 文章目录 一、需求和网页分析二、selenium爬虫一、需求和网页分析 URL:https://weixin.sogou.com/ 你是否有特别喜欢的一些公众号文章,比如说关于网易云热评的。 我那么多遗憾,那么多期盼,你知道…

RSS订阅微信公众号初探-feed43

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

python爬虫爬取微信公众号历史文章链接

一、最近公司有了要爬取微信公众号文章链接的需求,之前最初接触爬公众号文章的时候,用的是搜狗微信,在这个上面可以搜到相关的微信公众号文章,但是这些链接是有时效性的,第二天链接就打不开了(不知道现在是…

python抓取搜狗微信公众号文章

初学python,抓取搜狗微信公众号文章存入mysql mysql表: 代码: import requests import json import re import pymysql# 创建连接 conn pymysql.connect(host你的数据库地址, port端口, user用户名, passwd密码, db数据库名称, charsetut…

搜狗微信文章采集php,[造轮子]爬取搜狗微信公众号文章

背景:想做一个公众号文章资源APP,发现搜狗有搜索公众号文章功能,果断开撸。http://wxiread.com (用CMS搭了个简易的站)。 Step1.分析栏目及接口 搜狗分了20个栏目,分别是 热门,推荐,段子手,养生堂,私房话… 对应地址从 /pcindex/p…

微信公众号的“温柔一刀”,搜狗微信搜索部分功能将被下线

作为搜狗的单一最大股东,腾讯与搜狗之间的联系向来就很紧密,其中包括搜搜被并入搜狗、微信公众号的搜索功能划分给搜狗、腾讯新闻、QQ浏览器等腾讯系产品的搜索功能全部换成搜狗。腾讯对搜狗的支持是显而易见的,但若有利益冲突的情况下&#…

【scrapy爬虫】最新sogou搜狗搜索 机智操作绕过反爬验证码(搜狗微信公众号文章同理)

前情提要 此代码使用scrapy框架爬取特定“关键词”下的搜狗常规搜索结果,保存到同级目录下csv文件。并非爬取微信公众号文章,但是绕过验证码的原理相同。如有错误,希望大家指正。 URL结构 https://www.sogou.com/web?query{关键词}&p…

利用搜狗抓取微信公众号文章

微信一直是一个自己玩的小圈子,前段时间搜狗推出的微信搜索带来了一丝曙光。搜狗搜索推出了内容搜索和公众号搜索两种,利用后者可以抓取微信公众号的最新内容,看了下还是比较及时的。 每个公众号都有一个openid,最早可以直接利用…

html语言判断水仙花数,水仙花数判断讲解

今天要讲解的这道题是 水仙花数判断 题目要求 本题要求实现一个函数,判断任一整数是否为水仙花数(必须是三位数,且数的每一位上数字的立方和与数本身相等)。例如1531^35^33^3112527153,而1或155则不是水仙花数。如果是水仙花数,则…

水仙花数的求解思路

目录 水仙花数输入一个数,求解从0到这个数的所有水仙花数 解题思路源代码:注意事项 水仙花数 在以前的博客之中写过求解水仙花数的博客 详情见下面链接: 求解水仙花数 在这里就主要写求解水仙花数的思路 输入一个数,求解从0到这…

计算水仙花数有哪些

计算水仙花数有哪些 一、介绍水仙花数二、使用while循环计算水仙花数1.源代码2.运行结果 三、使用for循环计算水仙花数1.执行代码部分2.运行结果3.源代码 一、介绍水仙花数 水仙花数指的是三位整数中每个数的立方之和等于本身的数 二、使用while循环计算水仙花数 1.源代码 …

水仙花数

一、描述: 所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身。 例如153是“水仙花数”,因为:153 13 53 33。 在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮…

prgrmz的作品集

符号化执行(基于klee)生成测试用例初探 lstm广告点击量预测案例 一般蔬菜类果实无人采摘方案(算法) 分页页面通用爬虫建模(一般优化问题) 机器学习练习 概率图模型应用例子:图像分割 概率图模型应用例子:立体视觉 概率图模型…

全干工程师的自我修养---vue第一部分

全干工程师的自我修养—vue第一部分 1、环境搭建 主要是搭建nodejs环境,设置淘宝源及安装cnpm,在之前的文章中有提到过,就不再赘述。 接下来全局安装vue脚手架: cnpm install vue-cli -g这样就可以成功安装了,安装…

从业两年时间,我被一个女前端鄙视了!

学测试一定要找准方向,避免做无用功,可以看看现在的测试行业市场行情:测试行业现状分析及测试人员能力标准 早在四年前在深圳打拼的日子,第一家企业我就被一个女前端深深上了一课! 看似很平常的几句话,其实…