I2C通信外设

news2024/11/26 9:29:36

I2C外设介绍

在这里插入图片描述
主机,就是拥有主动控制总线的权利。从机,只能在从机允许的情况下,才能控制总线。
多主机模型可分为固定多主机和可变多主机。固定多主机就是总线上,有2个或2个以上固定的主机,上面固定为主机,下面是从机,只能是主机对从机进行控制,从机不能控制主机,当2个主机同时控制时,就会产生总线冲突,就要进行总线仲裁,仲裁失败的一方让出总线控制权。

可变多主机,总线上挂载多个设备,总线上没有固定的主机和从机,任何一个设备,都可以在总线空闲时跳出来作为主机,然后指定其他任何一个设备进行通信,通信完成后,跳出来的主机就要退回到从机的位置。对于STM32的I2C,使用的是可变多主机。

支持7位/10位地址模式(7位地址只能支持128个设备,地址数量不够时可以通过开辟多条I2C总线或者改用10位地址来解决,十位地址的情况下就需要规定起始位后的两个字节都作为寻址为使用,如果想将第二个字节作为寻址使用那就要将第一个字节前五位写入11110来作为标志)

兼容SMBus协议(此协议是基于I2C总线改进而来的,主要应用于电源管理系统中)是系统管理总线。

硬件I2C和软件I2C,硬件I2C在stm32中最多只能有2路I2C总线。软件I2C,没有限制,只要代码存得下。

I2C外设框图

在这里插入图片描述

复用引脚,I2C1的
在这里插入图片描述
复用引脚,I2C2的引脚,I2C2还可以重映射到PB8,PB9两个引脚
在这里插入图片描述
在这里插入图片描述

I2C基本结构

在这里插入图片描述

这个移位寄存器和数据寄存器是核心,因为这是高位先行,所以这个移位寄存器向左先行,在法送时,最高位移出去,一个SCL时钟,是移位一次;移位8次,这就能把一个字节,由高位到低位,依次放到SDA总线上。

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

对于GPIO口都要配置成复用开漏输出模式,复用就是GPIO口的状态,由片上外设控制的;开漏输出,是I2C协议要求配置。

SCL这里,时钟控制器通过GPIO去控制时钟线。SDA部分,输出数据,通过GPIO,输出到端口,输入数据,通过GPIO,输入到移位寄存器。

主机发送

在这里插入图片描述
7位地址的主发送和10位地址的主发送,区别是,7位地址,起始条件后的一个字节是寻址;
10位地址,起始条件后的两个字节都是寻址,其中前一个字节,帧头:内容是5位的标志位11110+2位地址+1位读写位,后一个字节,是8位地址,两个字节加一起,构成10位寻址。

7位地址的主发送:流程是,起始,从机地址,应答,数据1,应答,数据2,应答,最后P停止。

首先,初始化后,总线默认空闲状态,STM32默认从模式,为了产生一个起始条件,STM32需要写入控制寄存器,之后,STM32由从模式转换为主模式,然后会发生EV5事件,EV5其实相当于检查标志位,SB表示状态寄存器的一个状态,SB置1,表示起始条件已发送,当检测起始地址已发送时,就可以发送一个字节的从机地址,从机地址需要写到数据寄存器DR中,写入DR后,硬件电路会自动把这一字节,转到移位寄存器里,在把这个字节发送到I2C总线上,之后硬件自动接收应答并判读,如没有应答,硬件就会置应答失败的标志位,在寻址完成后,会发生EV6事件,EV6事件结束后,发送EV8事件,然后接收应答,数据2就转入移位寄存器发送,又发生EV8事件,但此时下一个数据,已经被写到寄存器等着了,所以EV8事件消失,之后应答,产生EV8事件,写入数据寄存器,EV8消失。一旦检测到EV8事件,就开始写入下一个数据,最后,当想要发送的数据写完后,这时就没有新的数据写入数据寄存器,当移位寄存器移位完成时,此时就是移位寄存器器空,数据寄存器也空状态,这个事件就是EV8_2,检测到EV8_2时,产生终止条件。

主机接收

在这里插入图片描述
时序流程是,起始,从机地址+读,接收应答,然后接收数据,发送应答,接收数据,发送应答,最后一个数据给非应答,然后终止。

首先,写入控制寄存器start位,产生起始条件,然后等待EV5事件,EV5事件代表起始条件已发送,之后是寻址,接收应答,产生EV6事件,EV6事件代表寻址已完成,数据1代表数据正通过移位寄存器进行输入,,EV6_1是没有对应的事件标志,只适用于接收1个字节的情况,这个,EV6_1,是数据1还在移位,数据没有收到,所以事件没有标志位,之后当时序单元完成时,把应答位发送出去,移入的一个字节就整体转移到数据寄存器,同时置RXNE标志位,表数据寄存器费空,收到了一个字节的数据,就是,EV7事件,当把数据读走后,,EV7事件就没了,说明此时数据1被读走,当然数据1还没读走的时候,数据2就可以直接移入移位寄存器,之后,数据2移位完成,收到数据2,产生,EV7事件,读走数据2,,EV7事件没了,按照这个流程,就一直接收数据,最后,当不需要接收时,需要在最后一个时序单元发生时,提前把ACK置0,,并设置终止条件的请求,这就是,EV7_1事件,之后,在时序完成后,设置了ACK=0,这里就给出非应答,由于设置STOP位,产生终止条件。

软件硬件波形对比

在这里插入图片描述
上面波形是软件I2C波形,下面波形是硬件I2C波形。
软件和硬件生成时序异同:引脚电平变化趋势一样,时钟线规整程度上看,硬件I2C更加规整;软件I2C,由于加了延时,软件时序不规整。

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

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

相关文章

GIF录屏工具Gif123 v3.3.0单文件

软件介绍 GIF的优势是小、轻、快,适合时间短、画面小、需要嵌入其他页面,打开就自动循环播放的动画。Gif123可录制合成鼠标轨迹,可调整鼠标指针大小,可在设置中打开鼠标指针高亮光圈功能,高亮光圈可跟随鼠标移动以指示鼠标位置。软件极其简单&#xff0…

使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单

明月的服务器一直使用的是 iptables,随着近几年 IPv6 的普及,明月切身体会到还是 IPSET 最方便了,无论你是 IPv4 还是 IPv6 都可以方便的管理,无论你是加入白名单还是黑名单,都非常的简单高效!今天就参照明月自己的实操…

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

安全测试 之 安全漏洞 CSRF

1. 背景 安全测试是在功能测试的基础上进行的,它验证软件的安全需求,确保产品在遭受恶意攻击时仍能正常运行,并保护用户信息不受侵犯。 2. CSRF 定义 CSRF(Cross-Site Request Forgery),中文名为“跨站请…

halo进阶-主题插件使用

开始捣鼓捣鼓halo,换换主题,加个页面 可参考:Halo 文档 安装/更新主题 主题如同壁纸,萝卜青菜各有所爱,大家按需更换即可; Halo好在一键更换主题,炒鸡方便。 安装/更新插件 此插件还扩展了插件…

神经网络 torch.nn---损失函数与反向传播

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation Loss Function的作用 每次训练神经网络的时候都会有一个目标,也会有一个输出。目标和输出之间的误差,就是用Loss Function来衡量的。所以,…

超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)

1. 模型检验 1.1 Holdout交叉验证 1.1.1 算法 在这种交叉验证技术中,整个数据集被随机划分为训练集和验证集。根据经验,整个数据集的近 70% 用作训练集,其余 30% 用作验证集。 优点:可以快速进行区分,仅仅通过一次区…

【cmake】cmake cache

cmake cache是什么 cmake cache是cmake在配置好后生成的一个CMakeCache.txt的文件,里面存储了一堆变量,这些变量一般都是关于项目的配置和环境的。 比如你用的什么编译器,编译器选项,还有项目目录。 例如(在cmakelist…

06- 数组的基础知识详细讲解

06- 数组的基础知识详细讲解 一、基本概念 一次性定义多个相同类型的变量,并且给它们分配一片连续的内存。 int arr[5];1.1 初始化 只有在定义的时候赋值,才可以称为初始化。数组只有在初始化的时候才可以统一赋值。 以下是一些示例规则: …

Vivado 设置关联使用第三方编辑器 Notepad++

目录 1.前言2.Vivado关联外部编辑器步骤3.Notepad的一些便捷操作 微信公众号获取更多FPGA相关源码: 1.前言 Vivado软件自带的编辑器超级难用,代码高亮对比不明显,而且白色背景看久了眼睛痛。为了写代码时有更加舒适的体验,可以…

伯克希尔·哈撒韦:“股神”的“登神长阶”

股价跳水大家见过不少,但一秒跌掉62万美元的你见过吗? 今天我们来聊聊“股市”巴菲特的公司——伯克希尔哈撒韦 最近,由于纽交所技术故障,伯克希尔哈撒韦A类股股价上演一秒归“零”,从超过62万美元跌成185.1美元&…

《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题

其他无法解析的外部符号: 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl ML_AddinManger::metaObject(void)const "… 无法解析的外部符号 “public: virtual void * __cdecl ML_AddinManger::qt_metacast(char const *)” (?…

微信小程序毕业设计-民大食堂用餐综合服务平台系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

查看服务器端口是否打开,如何查看服务器端口是否打开

查看服务器端口是否打开,是确保服务器正常运行和网络通信畅通的关键步骤。以下是几个有力的方法,帮助你快速、准确地判断端口状态。 首先,你可以使用telnet命令来检测端口的连通性。telnet是一个网络协议,可以用于远程登录和管理网…

中国新闻网怎么投稿 新闻稿件文章如何发布到中国新闻网上,附中国新闻网价格明细

中国新闻网是中国最具影响力和权威性的新闻门户网站之一。作为广大作者和媒体从业者,怎样向中国新闻网投稿一直是一个备受关注的话题。在这篇文章中,我们将着重介绍媒介库网发稿平台,并分享如何在该平台上成功投稿至中国新闻网。 媒介库网发稿…

代码片段 | Matlab三维图显示[ R T 0 1] 的最佳方法

% 输入N组RT矩阵 N 4; R zeros(3, 3, N); T zeros(3, N); R(:,:,1) [-0.902608 0.250129 0.350335 ; 0.314198 0.939127 0.138996 ;-0.294242 0.235533 -0.926253 ]; T(:,1) [205.877;2796.02; 907.116];R(:,:,2) [-0.123936 0.643885 0.755018 ;0.816604 0.464468 -0.26…

Docker基础篇之本地镜像发布到阿里云

文章目录 1. 本地镜像发布到阿里云的流程2. 阿里云开发平台3. 将自己的本地镜像推送到阿里云 1. 本地镜像发布到阿里云的流程 阿里云ECS Docker生态如下图所示: 2. 阿里云开发平台 在控制台找到容器和镜像服务: 然后创建一个个人实例: 下面…

LeetCode 算法:合并区间c++

原题链接🔗:合并区间 难度:中等⭐️⭐️ 题目 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰…

java第二十课 —— 面向对象习题

类与对象练习题 编写类 A01,定义方法 max,实现求某个 double 数组的最大值,并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…

内地户口转香港身份的7种途径!2024年怎么同时拥有2个身份?一篇说明白

很多人还不知道怎么同时拥有内地身份和香港身份,这里一次性说明白,不同背景情况及政策有可能随时变化,这里分享最近拿香港身份的7种途径。 #01 优才『香港优秀人才计划』 获批准的申请人无须在来港定居前先获得本地雇主聘任。所有申请人均必…