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协议的基础概念,下篇文章将带大家来学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsjiami.v7关于js加密运行环境的探索

浏览器环境、Node.js 环境和 vm2 环境之间存在一些区别,包括全局对象、核心模块和一些环境特定的 API。下面是一些区别的简要概述,以及一些代码示例来突显它们之间的不同。 1. 浏览器环境: 全局对象: 浏览器环境: 全…

数据结构·栈和队列

1. 栈 1.1 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为栈底。 栈中的数据元素遵守 后进先出 LIFO(Last In First Out)的原则,后进来的数…

YOLOv8 DeepSORT实现智能交通监控-改进yolo单目测距及速度测量-流量计数

YOLOv8 DeepSORT是一种基于目标检测和跟踪技术的智能交通监控系统。它基于YOLOv8,通过加入DeepSORT算法实现目标跟踪,同时还改进了YOLOv8的单目测距及速度测量技术和流量计数功能。 该系统可以通过摄像头或视频源实时捕获图像,并自动检测和跟…

web安全学习笔记【20】——信息打点(10)

信息打点-公众号服务&Github监控&供应链&网盘泄漏&证书图标邮箱资产 #知识点: 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指纹…

【刷题】 Leetcode 1022.从根到叶的二进制数之和

刷题 1022.从根到叶的二进制数之和题目描述:思路一(dfs深搜万能版)思路二 (栈迭代巧解版)总结 Thanks♪(・ω・)ノ谢谢阅读!!!下一篇文章见&#xff…

SpringBoot 自定义注解实现操作日志记录

文章目录 前言正文一、项目结构介绍二、核心类2.1 核心注解2.1.1 CLog 日志注解2.1.2 ProcessorBean 处理器bean 2.2 切面类2.3 自定义线程池2.4 工具类2.4.1 管理者工具类 2.5 测试2.5.1 订单创建处理器2.5.2 订单管理者2.5.3 订单控制器2.5.4 测试报文2.5.5 测试结果 附录1、…

【Java题】调整奇数位于偶数之前(超简单版)

题目: 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。 如数组:[1,2,3,4,5,6,7,8,9] 调整后可能是:[1, 9,3,7,5, 6, 4, 8, 2] 代码: import java.util.Arrays;public class Main {public static voi…

将python程序打包为exe格式

1. 安装pyinstaller winr打开命令窗口 输入: pip install pyinstaller输入命令后会自动安装pyinstaller 2. 打包 进入你的代码所在位置,输入cmd 在弹出的窗口中输入 pyinstaller --onefile your_script.pyyour_script.py修改为你需要打包的程序名字 …

验证C++中 cout 输出情况的小程序

//这个小程序验证了C中cout输出char数组、char*指针变量、string对象、int数组、double类型的情况&#xff0c;并做了简单说明。具体代码及注释 #include<iostream> using namespace std; #include<string> #include<fstream> #include <iomanip> int…

ElasticSearch架构介绍及原理解析

ElasticSearch架构介绍及原理解析文章目录 一、Elasticsearch是什么&#xff1f;1.简介2.历史与发展3.有关概念1.cluster2.shards3.replicas4.recovery5.river6.gateway7.discovery.zen8.Transport 4.安装 二、ElasticSearch架构介绍及原理解析1.基本架构1.1 进程节点1.2 负载均…

系统运维-Linux配置C、C++、Go语言编译环境

C yum install gcc -y #安装gcc编译器 gcc --version #验证环境gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4) Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even f…

简述操作系统内存管理

这篇可是真枯涩啊&#xff0c;哈哈&#xff0c;老早在学操作系统的时候整理的文章&#xff0c;没加润色&#xff0c;单纯从个人网站迁移过来。 操作系统内存管理的目的是将线性物理地址用抽象的逻辑地址空间&#xff0c;从而保护物理地址。此外&#xff0c;可以独立地址空间&am…

07-Linux部署Nginx

Linux部署Nginx 简介 NGINX是一款高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它的特点包括占用内存少、并发能力强&#xff0c;因此在处理高负载和高并发的场景时表现优秀。NGINX由俄罗斯的程序设计师Igor Sysoev开发&#xff0c;最初是为俄…

Windows Docker 部署 SQL Server

部署 SQL Server 打开 Docker Desktop&#xff0c;切换到 Linux 内核。然后在 PowerShell 执行下面命令&#xff0c;即可启动一个 SQL Server 服务&#xff0c;这里安装的是 2022 年版本 docker run -e "ACCEPT_EULAY" -e "MSSQL_SA_PASSWORDSQL123abcABC!&qu…

Spring 事务传播机制

事务传播机制&#xff1a;多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如&#xff1a;有两个⽅法A&#xff0c;B都被 Transactional 修饰,&#xff0c;A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时&#xff0c; B⽅法本⾝也有事务&#xf…

【Elasticsearch专栏 14】深入探索:Elasticsearch使用Logstash的日期过滤器删除旧数据

导言 随着企业业务的不断增长和数字化转型的加速&#xff0c;日志和事件数据在Elasticsearch中迅速积累。这些数据中&#xff0c;有很大一部分是旧数据&#xff0c;它们可能不再需要或者不再相关。长时间保留这些数据不仅占用大量存储空间&#xff0c;还会降低Elasticsearch集…

c++ vector简介

1.vector定义&#xff1a; 改变数组大小的序列容器 2.如何创建vector&#xff1a; vector<数据类型> 容器名称&#xff08;容器大小&#xff0c;容器内每个位置的初始值&#xff09; vector num; vector num(5); vector num(5,2); vector num {1,2,3,4} ; //直接生成一个…

【uni-app】自定义组件和通信

&#xff08;1&#xff09;自定义组件概念 组件是 vue 技术中非常重要的部分&#xff0c;组件使得与ui相关的轮子可以方便的制造和共享&#xff0c;进而使得vue使用者的开发效率大幅提升&#xff0c;在项目的component目录下存放组件&#xff0c;uni-app 只支持 vue 单文件组件…

【外设篇】——显示器

显示屏是一种电光转换工具&#xff0c;现在市面上的显示器都是LCD&#xff08;Liquid Crystal Display&#xff0c;液晶显示器&#xff09; 显示器参数介绍 对比度 是指画面黑与白的比值&#xff0c;对比度越高能使色彩表现越丰富&#xff0c;对比度越高&#xff0c;显示器的…

c++之浅拷贝和深拷贝

目录 一、浅拷贝&#xff1a;浅拷贝就是对象的数据成员之间的简单赋值 二、深拷贝&#xff1a;源对象与拷贝对象互相独立 三、总结&#xff1a; 1、什么时候必须定义自己的拷贝构造函数呢&#xff1f; 2、出现段错误的原因&#xff1a; 3、浅拷贝和深拷贝的写法 注意浅拷贝…