基于STM32的IIC通信

news2025/1/18 8:30:17

IIC通信

I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
两根通信线SCL(串行时钟线)、SDA(串行数据线)
同步,半双工
带数据应答
支持总线挂载多设备(一主多从、多主多从)
一主多从:单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制I2C总线,不能在未经允许的情况下去碰I2C总线,防止冲突。
多主多从:在总线上的任何一个模块都可以是主机。

硬件电路

所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
左边的CPU就是单片机,作为总线的主机。总线的权利很大,包括对SCL线的完全控制,任何时候,都是主机完全掌握SCL线。另外在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制给从机。
从机:挂载在I2C总线上的从机,这些从机可以是姿态传感器、OLED\存储器、时钟模块等。从机的权利比较小,对于SCL时钟线,在任何时候都只能被动的读取,从机不允许控制SCL线。对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地获取到SDA的控制权
所有I2C设备的SCL连在一起,SDA连在一起。
先忽略这两个电阻,假设我们就按照上图连接。那如何规定每个设备SCL和SDA的输入输出模式呢?SCL应该好规定,因为现在是一主多从,主机拥有SCL的绝对控制权,所以主机的模式可以配置成推挽输出,所有从机的SCL都配置成浮空输入或者上拉输入。数据流向是,主机发送,所有从机接收。但是到SDA线这里,就比较麻烦了,因为这是半双工的协议,所以主机的SDA在发送的时候是输出,在接收的时候是输入。同样,从机的SDA也会在输入和输出之间反复切换,如果能协调好输入输出的切换时机,那也没问题。但如果总线时序没有协调好,极有可能发生两个引脚同时处于输出的状态,又正好是一个输出高电平,一个输出低电平,那这个状态就是电源短路。所以为了 避免总线没有协调好导致电源短路这个问题,I2C的设计,禁止所有的设备输出强上拉的高电平,采 用外置弱上拉电阻加开漏输出的电路结构, 所以设备的SCL和SDA均要配置成开漏输出模式。
所有的设备,CPU和被控IC,他引脚的内部结构都是上图所示:
左边的一部分是SCL,右边是SDA的结构。
首先引脚的信号进来,都可以通过一个数据缓冲器或者施密特触发器,进行输入,因为输入对电路没有任何影响,所以任何设备在任何时候都是可以输入的,但是在输出的部分,采用的是开漏输出的配置。
推挽输出:上面一个开关管接到正极,下面一个开关管接到负极。
上面导通,输出高电平
下面导通,输出低电平
开漏输出:去掉强上拉的开关管,输出低电平时,下管导通,是强下拉;输出高电平时,下管断开,但是没有上管了,此时引脚处于浮空的状态,这就是开漏输出。
输出低电平,这个开关管导通,引脚直接接地,是强下拉;输出高电平,引脚管断开,处于浮空状态,这样所有的设备都只能输出低电平而不能输出高电平。但这样的话,为了避免高电平造成的引脚浮空,这时就需要在总线外面SCL和SDA各外置一个上拉电阻。

I2C时序基本单元

起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平

起始条件:

在I2C 总线处于空闲状态时:SCL和SDA都处于高电平状态,是由SCL和SDA由外挂的上拉电阻拉高至高电平,总线处于平静的高电平状态。
主机需要进行数据收发时,当从机捕获到SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。然后在SDA下降沿之后,主机要再把SCL拽下来,拽下SCL:1、占用总线,2、方便拼接。

终止条件

SCL先放手,回到高电平;SDA再放手,回到高电平,产生一个上升沿。上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平。

发送一个字节

SCL低电平期间,主机将数据位依次放到SDA线上 (高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位, 所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,
即可发送一个字节.。
主机如果想发送0,就拉底SDA到低电平;如果想发送1,就放手,SDA回到高电平,在SCL低电平期间,允许改变SDA的电平。当这一位的数据放好之后,主机就松手时钟线,SCL回到高电平。在高电平期间,是从机读取SDA的时候,所以高电平期间,SDA不允许变化。SCL处于高电平之后,从机需要尽快地读取SDA,一般在上升沿这个时刻,从机就已经读取完成了。主机在放手SCL一段时间后,就可以继续拉低SCL,然后传输下一位。

接收一个字节

SCL低电平期间,从机将数据位依次放到SDA线上 (高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,
即可接收一个字节(主机在接收之前,需要释放SDA)
SCL低电平期间,从机将数据位依次到SDA线上(高位先行),然后释放SCL,主机在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化。

发送应答和接收应答

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

I2C时序

指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

空闲状态:SCL和SDA都是高电平。

主机给从机写入数据的时候:1、SCL高电平期间,拉低SDA,产生起始条件,紧跟着的时序,必须是发送一个字节的时序,字节的内容,必须是从机地址+读写位。从机地址是7位,读写位是1位。加起来刚好一个字节。发送从机地址,就是确定通信的对象。发送读写位,就是确认我接下来是要写入还是要读出。

I2C的硬件实现

I2C外设简介

• STM32 内部集成了硬件 I2C 收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻 CPU 的负担
• 支持多主机模型
• 支持 7 位 /10 位地址模式
• 支持不同的通讯速度,标准速度 ( 高达 100 kHz) ,快速 ( 高达 400 kHz)
• 支持 DMA
• 兼容 SMBus 协议
• STM32F103C8T6 硬件 I2C 资源: I2C1 、 I2C2
(硬件I2C的资源是有限的,这也是硬件和软件的区别)

I2C框图

I2C基本结构

发送:移位寄存器中的数据由高位到低位先移出去,移8次就可以移一个字节,有高位到低位依次放到SDA线上。

接收:数据从GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了。

主机发送

主机接收

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

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

相关文章

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点: 面向连接的协议:TCP是一种可靠的、面向连接的协议,在通信之前需要建立连接,以确保数据的可靠传输。这意味着在传输数据之前,发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

第 1 天_二分查找【算法基础】

第 1 天_二分查找 前言34. 在排序数组中查找元素的第一个和最后一个位置题解官方33. 搜索旋转排序数组题解官方74. 搜索二维矩阵 前言 这是陈旧已久的草稿2021-11-09 19:33:44 当时在学习数据结构,然后再LeetCode上找了一个算法基础。 但是后来又没做了。 现在20…

WEB后端复习——监听器、过滤器

Listener监听器 是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。 注解WebListener 1.ServletContextListener 监听Serv…

韩顺平0基础学Java——第10天

p202-233 类与对象(第七章) 成员方法 person类中的speak方法: 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak()中,speak表示方法名,括号是形参列表。 4.大括号为方法体&am…

2005-2022年各省居民人均可支配收入数据(含城镇居民人均可支配收入、农村居民人均可支配收入)(无缺失)

2005-2022年各省居民人均可支配收入数据(含城镇居民人均可支配收入、农村居民人均可支配收入)(无缺失) 1、时间:2005-2022年 2、来源:国家统计局、统计年鉴 3、指标:全体居民人均可支配收入、…

语言:C#

一、VSCode生成exe 二、

Spring Cloud学习笔记(Nacos):基础和项目启动

这是本人学习的总结,主要学习资料如下 - 马士兵教育 1、基础和版本选择2、启动项目2.1、源码启动项目2.2、命令行启动 1、基础和版本选择 Nacos是用于服务发现和注册,是Spring Cloud Alibaba的核心模块。 根据文档,Spring Cloud Alibaba的版…

ollama离线安装,在CPU运行它所支持的哪些量化的模型

在线安装的链接: Download Ollama on LinuxGet up and running with large language models.https://ollama.com/download/linux 离线安装教程: 下载install.sh: https://ollama.ai/install.sh

算法笔记——数位DP

一、前置知识 1.DP小知识 D P DP DP 是一种算法思想,用递推方程的方式解决问题。但是使用它要满足如下性质: 最优子结构: 子结构优秀,整个就优秀。无后效性:当前决策不会影响后面。 2.DP实现方法 众所周知&#xf…

STC8增强型单片机开发——串口调试UART

一、什么是串口 串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter),其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中,串口常用于与外部设备…

【算法】动态规划之线性DP问题

前言: 本系列是看的B站董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 树塔-记忆化搜索 特点(前提):从上向下的累加和是不能重复使用的,从下向上的累加和是可以重…

Golang — map的使用心得和底层原理

map作为一种基础的数据结构,在算法和项目中有着非常广泛的应用,以下是自己总结的map使用心得、实现原理、扩容机制和增删改查过程。 1.使用心得: 1.1 当map为nil和map为空时,增删改查操作时会出现的不同情况 我们可以发现&#…

浅谈如何做好软件项目

如何做好软件项目,这是摆在软件实施团队每个人面前的关键问题。笔者在此提出一些浅见,供大家参考。欢迎在评论区交流! 目录 【摘要】 【正文】 一、树立正确的需求调研理念 二、谋定而后动的开发工作 三、大道至简的系统设计 四、专注项…

Yoast SEO Premium插件下载,提升您的网站SEO排名

在当今数字化时代,网站的搜索引擎优化(SEO)至关重要。它不仅影响着网站的可见度,更直接关系到您的在线业务成功与否。如果您正在寻找一个能够显著提升网站SEO表现的工具,Yoast SEO Premium插件将是您的理想选择。 为什…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源,对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源,在主干代码的 applications 目录里聚集了很多原生的应用实现,那么如何编译这些代码就是我们这篇文章的主要…

springboot+vue+mybatis灵活就业服务平台+PPT+论文+讲解+售后

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而微信小程序是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了灵活…

draw.text((left, top - 15), text,font=font, fill=“green”)

这是一个Python PIL库中的方法,用于在图片上绘制文本。具体来说,它可以在指定的位置绘制指定的文本,并使用指定的字体、颜色等参数进行渲染。其中,left和top是文本绘制的左上角坐标,text是要绘制的文本内容&#xff0c…

【linux学习】多线程(1)

文章目录 线程的概念线程与进程 线程的用法线程的创建多线程 线程的等待线程锁死锁 线程的概念 在Linux中,线程(Thread)是程序执行流的最小单位,是进程中的一个实体,负责在程序中执行代码。线程本身不拥有系统资源&…

只需三步将Kimi接入微信公众号

今天我将手把手交大家如何把Kimi大模型接入微信公众号,创建属于你自己的公众号智能助理,让你的公众号具备智能对话、文件阅读、信息搜索等强大功能,同时提高用户互动率、减少人工客服压力等。 废话不多说,先来看看实际效果吧~ 一…

简约在线生成短网址系统源码 短链防红域名系统 带后台

简约在线生成短网址系统源码 短链防红域名系统 带后台 安装教程:访问 http://你的域名/install 进行安装 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/