STM32 IIC协议基础概念

文章目录

  • 前言
  • 一、IIC协议介绍
  • 二、IIC硬件框图和程序层次
  • 三、IIC协议
    • 1.IIC协议通信流程
    • 2.IIC的引脚为什么需要加入上拉电阻
    • 3.IIC的引脚为什么需要配置为开漏输出
  • 四、STM32 IIC硬件结构
  • 总结


前言

本篇文章将带大家学习IIC通信协议的一些基础概念和使用。

一、IIC协议介绍

I2C(Inter-Integrated Circuit),通常也称为IIC(Inter-IC),是一种串行通信协议,用于在集成电路之间进行数据传输。它是由飞利浦半导体(现在的恩智浦半导体)开发的,并且在各种芯片和模块中被广泛采用。I2C协议的设计旨在简化芯片之间的通信,使得多个芯片可以通过共享同一条总线来交换信息。

以下是I2C协议的基本特点和工作原理:

总线架构:

I2C使用两条线进行通信:串行数据线(SDA)和串行时钟线(SCL)。
SDA用于传输数据,而SCL则用于同步时钟信号,指示何时可以读取或写入数据。

主从结构:

在I2C通信中,设备分为主设备(Master)和从设备(Slave)。
主设备负责发起通信并控制总线的访问,而从设备则响应主设备的请求。

在这里插入图片描述

起始和停止条件:

通信开始时,主设备发送起始条件(Start),即将SDA从高电平切换到低电平时,同时保持SCL为高电平。
通信结束时,主设备发送停止条件(Stop),即将SDA从低电平切换到高电平时,同时保持SCL为高电平。
在通信过程中,每个数据传输都以起始和停止条件作为边界。

地址传输:

在每次通信开始时,主设备首先发送目标设备的地址。
地址包括7位或10位,取决于I2C设备的寻址模式。
对于每个从设备,必须分配一个唯一的地址,以便主设备可以识别和访问它。

数据传输:

在发送完目标设备的地址后,主设备可以选择读取数据或向设备写入数据。
数据传输是以字节为单位进行的,每个字节的传输都会收到从设备的应答信号(Acknowledge)。

时钟同步:

时钟同步是通过SCL线实现的,主设备控制时钟信号的频率和节奏。
从设备在SCL线上接收时钟信号,并在适当的时候进行数据传输。

多主机操作:

I2C允许多个主设备共享同一条总线,但是在同一时间只能有一个主设备在操作。
多主机操作需要对总线进行仲裁(Arbitration),以确保每个主设备的请求得到正确的响应。

总的来说,I2C是一种简单而灵活的串行通信协议,适用于连接多个设备,如传感器、存储器、显示器等,以实现各种应用,如嵌入式系统、物联网设备等。

二、IIC硬件框图和程序层次

(以下图片来自百问网)

我们先来看一个IIC的硬件框图操作OLED屏幕。
在这里插入图片描述
STM32的内部有IIC控制器,STM32通过IIC控制器和SSD1306 OLED屏幕驱动来给屏幕发送数据,当屏幕接收到数据时就可以将数据显示出来。

在这里插入图片描述
程序结构由四部分组成:

1.应用程序

2.库函数也就是我们封装好的OLED显示屏操作函数

3.OLED驱动程序(根据SSD1306数据手册编写)

4.I2C控制器驱动(STM32 HAL库中IIC的操作函数)

三、IIC协议

1.IIC协议通信流程

这里的话就不多讲解这个IIC的通信流程,大家可以看下面的这篇文章。
IIC协议通信流程

2.IIC的引脚为什么需要加入上拉电阻

我们在IIC的框图中就可以知道IIC的引脚是需要接入一个上拉电阻的。

在这里插入图片描述

  1. 开漏(Open-Drain)/开集(Open-Collector)输出
    I2C总线上的设备通常使用开漏(对于MOS技术)或开集(对于双极性技术)输出来驱动SDA和SCL线。这意味着设备可以将总线拉低(连接到地),但不能直接将总线拉高。要将线拉高,需要通过外部电阻(上拉电阻)来完成,这些电阻连接到高电平电源(通常是VCC)。

  2. 逻辑电平的创建
    通过使用上拉电阻,当总线上没有任何设备试图将线拉低时,总线自然会被拉到高电平状态。这样就可以创建稳定的逻辑高电平和低电平,确保I2C通信的可靠性。

  3. 多主设备支持
    I2C允许多个主设备存在于同一个总线上。上拉电阻确保了在任何给定时间,只要没有设备主动将总线拉低,总线就会保持在高电平状态。这样的设计允许任何设备可以在任何时间检测并开始通信,而不会干扰到总线上其他的设备。

  4. 防止总线冲突
    在I2C通信中,如果两个设备同时尝试通信,可能会导致总线冲突(比如,一个设备试图发送高电平,而另一个设备同时发送低电平)。上拉电阻确保在这种情况下,总线能够安全地默认到高电平状态,同时提供一种机制(通过检测总线电平)来识别和解决冲突。

  5. 确定上拉电阻的值
    上拉电阻的值不是随意选择的,它需要根据总线的电容、所需的通信速率以及总线上连接的设备数量来计算。电阻值太低会导致功耗增加和电源负载过大,而电阻值太高则可能无法在高速通信时有效地将总线拉到高电平状态,影响信号的质量和可靠性。

上拉电阻在I2C通信中扮演着至关重要的角色,它们确保了总线的稳定和设备间的可靠通信。

3.IIC的引脚为什么需要配置为开漏输出

允许多主设备: I2C支持多个主设备同时连接到同一总线上。通过将引脚配置为开漏输出,任何设备都可以将线拉低(Ground),但不能直接将线拉高(VCC)。这样,当多个主设备同时尝试发送数据时,如果有一个设备将线拉低,其他设备就能感知到总线被占用,从而避免冲突。

下面列出一个真值表来说明上面的功能,假设有两个设备A和B:

1.当A和B都输出1时,因为是开漏输出截止,所以这个时候SDA接到上拉电阻表现为高电平。

2.当A输出为0时,B输出为1,SDA输出的电平是0,因为此时开漏输出可以输出低电平,SDA此时被拉低。

3.这一种情况和第二种情况类似

4.当A和B都输出为0的时候SDA也输出为0

那么这样的话一旦有一个主设备想要输出低电平占用SDA线,那么SDA线就会表现为低电平,此时就可以避免冲突。
在这里插入图片描述

另一个重要原因是防止器件烧毁。在推挽输出模式下,引脚可以输出逻辑高电平和逻辑低电平,这样如果两个设备同时尝试将总线拉到不同的电平(一个设备拉高,另一个设备拉低),可能会导致电流直接从一个设备流向另一个设备,形成短路,从而损坏其中一个设备。

通过将引脚配置为开漏输出,设备只能拉低总线,而不能直接拉高总线。上拉电阻将总线拉高,当没有设备拉低时,总线保持在逻辑高电平。这种设计防止了推挽输出模式下的短路和过大电流的流动,从而降低了器件损坏的风险。因此,配置为开漏输出是一种更安全的设计选择,能够有效保护设备免受损坏。

在这里插入图片描述

四、STM32 IIC硬件结构

在写入数据时将数据写入IIC控制器的数据寄存器,写入数据后数据移位寄存器会将数据发送到SDA数据线。

当读取数据的时候,数据从SDA从传输进来,放入移位寄存器中,移位寄存器将数据放入数据寄存器中并且读取出来。
在这里插入图片描述

通过配置I2C_CR2寄存器可以配置IIC的时钟源:
在这里插入图片描述
通过配置I2C_CCR寄存器可以来配置I2C高低电平的时间:
在这里插入图片描述
(I2C_TRISE) 寄存器的作用是控制I2C总线上拉电阻的上升时间。这个时间是在I2C总线由逻辑低电平转变为逻辑高电平时的上升时间。上升时间的设定对于I2C通信的稳定性和性能至关重要。
在这里插入图片描述
配置I2C_CR1中的STOP和START位可以产生起始信号和停止信号。
在这里插入图片描述

总结

本篇文章主要讲解了IIC协议的基础概念,下篇文章将带大家来学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产数据库兼容性认证再下两城,极狐GitLab 国产适配更进一步

近日,极狐GitLab 与两大国产数据库 TDSQL 和人大金仓完成兼容性认证。极狐GitLab 在国产化适配、国产化生态建设上有了进一步的发展。 极狐GitLab 团队分别和 TDSQL 和人大金仓数据库团队做了严格的测试验证,完成了这两大国产数据库和极狐GitLab 企业级一…

面试题JS篇

目录 Js 基本数据类型有哪些Ajax 如何使用如何判断一个数据是 NaN?Js 中 null 与 undefined 区别闭包是什么?有什么特性?对页面会有什么影响JS中模块化的方法Js 中常见的内存泄漏什么是事件冒泡?如何阻止事件冒泡?事件…

服务器git安装python包失败,如何手动下载github项目包并安装到虚拟环境中(简单易懂)

背景: 想要复现一个项目,建立好虚拟环境后,准备安装项目需要的包,故输入命令pip install -r requirements.txt requirements.txt如下图 其他包我都安装成功了,只有最后一个包失败了,是需要服务器git链接…

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的,为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数,下面的函数用于查看GPU设备的一切信息。 …

Android PDFView 提示401 pom

背景 在开发安卓app,使用PDF组件来解析URL地址 ,从github找到一个开源组件 AndroidPdfViewer 遇到一个大坑,一直提示下载依赖401 pom 打开控制台链接弹出需要登录jitpack 原因分析: 这个组件项目依赖库链接到了需要鉴权的…

VuePress + GitHub 搭建个人博客踩坑记录

最近想给我教练搭个网站,本来选的是 VuePress 框架,也折腾完了,起码是搭建出来了,踩的坑也都总结好了 但是最近发现了一个更简洁的模板: VuePress-theme-hope ,所以最终网站使用的样式是这个 不过我觉得这里面踩坑的记录应该还是有些价值的,分享出来,看看能不能帮到一些小伙伴~…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后,点击‘测试连接’,若提示成功,则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数: mail.catchall.alias: 收件服…

【Maven】Maven 基础教程(二):Maven 的使用

《Maven 基础教程》系列,包含以下 2 篇文章: Maven 基础教程(一):基础介绍、开发环境配置Maven 基础教程(二):Maven 的使用 😊 如果您觉得这篇文章有用 ✔️ 的话&#…

「MySQL」基本操作类型

🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据库 🎇欢迎点赞收藏加关注哦! 数据库的操作 创建、显示数据库 使用 create 创建一个数据库 create database goods;然后可以用 show databases 来查看已经创建的数…

人大金仓与mysql的差异与替换

人大金仓中不能使用~下面的符号,字段中使用”,无法识别建表语句 创建表时语句中只定义字段名.字段类型.是否是否为空 Varchar类型改为varchar(长度 char) Int(0) 类型为int4 定义主键:CONSTRAINT 键名 主键类型&#x…

32单片机基础:TIM输出比较

这个输出比较功能是非常重要的,它主要是用来输出PWM波形,PWM波形又是驱动电机的必要条件,所以你如果想用STM32做一些有电机的项目,比如智能车,机器人等。 IC: Input Capture 输入捕获 CC:Capture/Compare一般表示输入捕获和输出…

爱心商城|爱心商城系统|基于Springboot的爱心商城系统设计与实现(源码+数据库+文档)

爱心商城系统目录 目录 基于Springboot的爱心商城系统设计与实现 一、前言 二、系统功能设计 三、系统功能设计 1、商品管理 2、捐赠管理 3、公告管理 4、公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

华为配置WLAN高密业务示例

配置WLAN高密业务示例 组网图形 图1 配置高密WLAN环境网络部署组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 体育场由于需要接入用户数量很大&#xff0c;AP间部署距离较小&#xff0c;因此AP间的干扰较大&#xff0c;可能导致用户上网网…

PostgreSQL从入门到精通教程 - 第45讲:poc-tpcc测试

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第45讲&#…

【知识整理】Git 使用实践问题整理

问题1、fatal: refusing to merge unrelated histories 一、Git 的报错 fatal: refusing to merge unrelated histories 新建了一个仓库之后&#xff0c;把本地仓库进行关联提交、拉取的时候&#xff0c;出现了如下错误&#xff1a; fatal: master does not appear to be a g…

状态码转文字!!!(表格数字转文字)

1、应用场景&#xff1a;在我们的数据库表中经常会有status这个字段&#xff0c;这个字段经常表示此类商品的状态&#xff0c;例如&#xff1a;0->删除&#xff0c;1->上架&#xff0c;0->下架&#xff0c;等等。 2、我们返回给前端数据时&#xff0c;如果在页面显示0…

C语言实现21点游戏【单人模式,双人模式,单-多电脑模式】,21点又名黑杰克(英文:Blackjack)

项目背景&#xff1a; 21点又名黑杰克&#xff08;英文&#xff1a;Blackjack&#xff09; &#xff0c;起源于法国&#xff0c;已流传到世界各地。21点&#xff0c;是一种使用扑克牌玩的赌博游戏。亦是唯一一种在赌场中可以在概率中战胜庄家的一种赌博游戏。 现在在世界各地…

计算机网络原理--传输层

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 TCP/IP五层&#xff08;或四层&#xff09;模型 传输层 TCP和UDP的区别 UDP协议 校验和 如何…

【Unity】如何设置Unity脚本的执行顺序?

在 Unity 编辑器中设置脚本执行顺序 在 Unity 中&#xff0c;如果有多个脚本&#xff0c;并且它们之间的执行顺序很重要&#xff0c;可以通过编辑器设置来确保它们按照自己期望的顺序执行。这对于确保某些脚本在其他脚本之前执行非常有用。在这篇文章中&#xff0c;将向会展示如…