STM32 IIC协议基础概念

news2024/11/17 13:54:08

文章目录

  • 前言
  • 一、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.coloradmin.cn/o/1479411.html

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

相关文章

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享,但开发者需要自行负责并确保AR场景的完整性,自行负责虚拟物体的创建与销毁。为简化同步操作,RealityKit 内建了同步机制,RealityKit 同步机制基于 Multipeer Connectivi…

RISC-V特权架构 - CSR寄存器

RV32/64 特权架构 - CSR寄存器 1 CSR地址空间2 CSR定义2.1 用户级2.2 监管级2.3 超级监管级2.4 机器级 3 CSR访问3.1 CSRRW3.2 CSRRS3.3 CSRRC3.4 CSRRWI3.5 CSRRSI3.6 CSRRCI 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 CSR地址空间 RISC&…

从 Flask 切到 FastAPI 后,起飞了!

我这几天上手体验 FastAPI,感受到这个框架易用和方便。之前也使用过 Python 中的 Django 和 Flask 作为项目的框架。Django 说实话上手也方便,但是学习起来有点重量级框架的感觉,FastAPI 带给我的直观体验还是很轻便的,本文就会着…

基于Python的电商评论数据采集与分析|电商API接口数据采集

引言 在电商竞争日益激烈的情况下,商家既要提高产品质量,又要洞悉客户的想法和需求,关注客户购买商品后的评论,而第三方商家获取商品评价主要依赖于人工收集,不但效率低,而且准确度得不到保障。通过使用Py…

经典DP-最大子数组

连续子数组的最大和 代码 //定义一个名为"连续子数组的最大和"的公共类 public class 连续子数组的最大和 { // 定义一个静态变量maxn,并赋值为100010 static int maxn100010; // 定义一个静态的整数数组dp,大小为maxn static int[] dp…

Java毕业设计-基于springboot开发的Web社区医院管理服务系统-毕业论文+答辩PPT(有源代码)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块4、医生功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发…

官网万词霸屏推广+关键词排名优化源码系统 带完整的安装代码包以及搭建教程

随着搜索引擎算法的不断更新和市场竞争的加剧,传统的SEO方法已经难以满足企业对于快速、高效推广的需求。罗峰结合多年的互联网营销经验和最新的搜索引擎优化技术,给大家推荐一款集网站搭建、关键词优化、数据分析于一体的源码系统。 以下是部分代码示例…

如何使用Spring Boot轻松实现国际化和本地化

文章目录 什么是国际化SpringBoot 国际化实践出真知新建Properties文件修改配置文件测试获取所有国际化资源 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 什么是国际化 国际化&…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了,大家自行百度 直方图可以帮助分析图像中的灰度变化,进而帮助确定最优二值化的灰度阈值(threshold level)。如果物体与背景的灰度值对比明显,此时灰度直方图就会包含双峰(bimodal histo…

Java核心API-多线程

多线程 文章目录 多线程前言一、多线程1、多线程的概念2、多线程的好处 二、主线程1、Thread类2、主线程 三、线程的创建和启动1、创建线程的两种方式2、使用线程的步骤 四、继承Thread类创建线程五、实现Runnable接口创建线程六、比较两种创建线程的方式1、继承Thread类2、实现…

Python爬取网站视频资源

思路: 在界面找到视频对应的html元素位置,观察发现视频的url为https://www.pearvideo.com/video_视频的id,而这个id在html中的href中,所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

C语言while 语句的基本格式是什么?

一、问题 C语⾔中有三种循环语句,while 语句是其中的⼀个,它的基本格式是怎样的呢? 二、解答 while 语句的⼀般形式为: while(表达式) 语句; 其中,表达式是循环条件,语句为循环体。 注意: …

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一:搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

导读: 客户规模扩大,如何保证大数据软件产品和服务质量始终如一?几乎所有成长中的软件厂商,尤其是需要通过私有化部署交付的厂商,都会面临这个问题。正如《人月神话》中多次表明的,单纯地增加人手、扩大团队…

npm使用国内淘宝镜像的方法整理

命令配置安装: 淘宝镜像: npm config set registry https://registry.npm.taobao.org/ 官方镜像: npm config set registry https://registry.npmjs.org 通过cnpm安装: npm install -g cnpm --registryhttps://registry.npm.…

Java-常用集合

Jva常用集合 一、Java 集合框架体系二、Collection接口和方法1. List接口List 接口主要实现类:ArrayListList 的实现类之二:LinkedListList 的实现类之三:Vector 2. Set接口Set 主要实现类:HashSetSet 实现类之二:Link…

SpringBoot 手写 Starter

spring-boot-starter 模块 1.介绍 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配…

WordPress分类目录ID怎么看?如何查找WordPress标签ID?

在WordPress网站中,我们需要判断某篇文章是否属于某个分类目录,或者是否拥有某个标签,那么就需要用到分类目录ID和标签ID,那么WordPress分类目录ID怎么看?如何查找WordPress标签ID?下面boke112百科就跟大家…

MySQL 自增列解析(Auto_increment)

MySQL数据库为列提供了一种自增属性,当列被定义为自增时。Insert语句对该列即使不提供值,MySQL也会自动为该列生成递增的唯一标识,因此这个特性广泛用于主键的自动生成。 一、自增列的用法 自增列具有自动生成序列值,整型&#…

Linux系统编程入门(下)

Linux系统编程 第一章 Linux系统编程入门(下)1.6 GDB 调试1.7 标准C库IO函数和Linux系统IO函数对比 第一章 Linux系统编程入门(上) 第一章 Linux系统编程入门(下) 1.6 GDB 调试 (1&#xff0…