IIC(I2C)通信协议详解

article/2025/6/24 8:37:52

简介

I2C 是飞利浦公司设计的,一种很常见的总线协议, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到400Kb/S。 I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。

I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,因而 I2C 主控制器可以通过 I2C 设备的器件地址访问指定的 I2C设备。主从机的接线图如下图所示:
在这里插入图片描述
其中SDA 和 SCL 这两根线必须要接一个上拉电阻,一般是 4.7k

1.通信过程

IIC的通信过程稍微复杂一些,分成读时序和写时序。

1.1写时序

主机向从机写程序时的时序如图所示:
在这里插入图片描述
从上面的时序图可以看出,需要两次地址确认(从机地址和寄存器地址),保证从机在位且准备就绪后才可以写入数据。

  1. 开始信号。SDA上面输出低电平,为通讯做准备。
  2. 发送设备地址,从而选择通信的对象。7位数据是设备地址。
  3. 读写位:0表示写操作,1表示读操作。
  4. 从机发出的应答信号(低电平)。
  5. 第二次发送开始信号。
  6. 发送需要写入的寄存器地址。
  7. 从机发出的应答信号。
  8. 发送要写入寄存器的地址。
  9. 从机发出的应答信号(低电平)。
  10. 停止信号(高电平)。

1.2读时序

读时序比写时序更复杂,但是若看懂了写时序,读时序就很简单了。也就是读设备地址->读寄存器地址->读设备地址->读数据的一个过程。
在这里插入图片描述
读时序的过程基本如下,开始的时候SDA发送低电平,表示通信开始。然后和写时序一样,发送从机地址,等待应答,有了应答信号后再次写入需要读数据的寄存器地址,等待应答,若有了应答信号,可再次发送从机地址进行确认。再从从机中读取相应的数据,然后主机主动发出NO ACK信号,表示读取完成,然后主机发出STOP信号(高电平)停止I2C通信。

1.3多字节读写

有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。

1.4助记口诀

为了方便记忆I2C的通信过程,编写了如下的助记口诀:
在这里插入图片描述

  1. 起始拉低停止拉高很好理解,就是在空闲的时候,由于上拉电阻的存在,SCL和SDA都是高电平,等到开始通信的时候就将其电平拉低,通信结束后将其拉高。
  2. 低电翻转高电传输指的是(通信过程中)在时钟线低电平期间,数据线是可以进行电平翻转的,而在高电平期间不能,传输的是确定的电平信号。

2关于上拉电阻的相关思考

为什么I2C每根线需要一个上拉电阻呢?关于这个问题查阅了大量的资料。网上的一般说法都是设计上拉电阻是因为主机和从机的I2C接口是开漏输出,那。。。为什么I2C接口要采用开漏输出呢?
关于什么是开漏输出,可以看我之前写的这篇帖子:(嵌入式系列)STM32系列单片机的GPIO简介
在这里插入图片描述
众所周知:开漏输出有两个优点。

  1. 可以根据实际需求,灵活地配置输出电平。
  2. 实现“线与”的功能。

第一点不是很重要,因为一般的I2C设备都不会有太特殊的电平要求,而I2C是国际统一的通信标准。而第二点非常重要。因为I2C是支持一主多从或者一从多主的通信(如下图是一主多从,一从多主同理)。
在这里插入图片描述
原因一:若采用推挽输出,当两个芯片之间的SCL或者SDA引脚的电平不相同,则很有可能会出现一个_MOS和一个N_MOS同时导通而损坏元器件。
原因二:方便总线仲裁。在多个设备通信的时候,难免会出现总线的“竞争”问题,也就是多个设备同时申请通信,假设主设备A需要启动I2C,它需要在SCL高电平时,将SDA由高电平转换为低电平作为启动信号。主设备A在把SDA拉高后,它需要再检查一下SDA的电平(开漏输出只能输出低电平和高阻态,所以不能保证100%输出高电平)。

若SDA是电平,说明主设备A可以占用总线,然后主设备A将SDA拉低,开始通信。
若SDA是电平, 说明有设备提前申请了通信权限,主设备A不能占用总线, 结束与当前设备的通信。

如果主设备A拉高SDA时,已经有其他设备将SDA拉低了。由于与运算以后还是低电平,那么主设备A在检查SDA电平时,会发现不是高电平,而是低电平,说明主设备与其他设备的通信尚未结束,新设备只能放弃占用总线。如果是高电平, 则可以占用。

从上面的描述也可以发现,其实这个时候的主机和从机已经成了相对的概念,每个设备(芯片)都可以连接好几个设备(通过I2C)协议。


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

相关文章

IIC 通信协议

一、IIC 通信协议介绍 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。 如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统…

三大通信协议(二):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这样就可以成功安装了,安装…