STM32—I2C通信外设

1.I2C外设简介

  • STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
  • 支持多主机模型(可变多主机)
  • 支持7位/10位地址模式(11110......)
  • 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
  • 支持DMA(多字节读写)
  • 兼容SMBus协议,SMBus(System Management Bus),是系统管理总线,SMBus是基于I2C总线改进而来的,主要用于电源管理系统中,SMBus和I2C非常像
  • STM32F103C8T6 硬件I2C资源:I2C1、I2C2

硬件12C也有很多独有的优势:执行效率比较高,可以节省软件资源,功能比较强大,可以实现完整的多主机通信模型,时序波形规整,通信速率快,等等

如果你只是简单应用,可以选择比较灵活的软件I2C,如果你对性能指标要求比较高,就可以考虑一下硬件I2C

2.I2C框图

左边是这个外设的通信引脚SDA和SCL,这就是12C通信的两个引脚,这个SMBALERT是SMBus用的,12C用不到,不用管的,那像这种外设模块引出来的引脚,般都是借用GPIO口的复用模式与外部世界相连的,

首先上面这一块,是SDA,也就是数据控制部分,这里数据收发的核心部分,是这里的数据寄存器和数据移位寄存器,当我们需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会进一步转到移位寄存器里,我们就可以直接把下一个数据放到数据寄存器里等着了,一旦前一个数据移位完成,下一个数据就可以无缝衔接,继续发送,当数据由数据寄存器转到移位寄存器时,就会置状态寄存器的TXE位为1,表示发送奇存器为空,这就是发送的流程

那在接收时,也是这路,输入的数据,一位一位地从引脚移入到移位寄存器里,当一个字节的数据收齐之后,数据就整体从移位寄存器转到数据寄存器,同时置标志位RXNE,表示接收寄存器非空,这时我们就可以把数据从数据寄存器读出来了

至于什么时候收,什么时候发,需要我们写入控制寄存器的对应位进行操作,对于起始条件、终止条件、应管位什么的,这里也都有控制电路可以完成

下面这里还有两个功能,个是比较器和自身地址寄存器、双地址寄存器,另一个是帧错误校验计算和帧错误校验寄存器,

  • 比较器和地址寄存器这是从机模式使用的,刚才说了STM32的I2C是基于可变多主机模型设计的,STM32不进行通信的时候,就是从机,既然作为从机,它就应该可以被别人召唤,想被别人召唤,它就应该有从机地址吧,就可以由这个自身地址寄存器指定,我们可以自定一个从机地址,写到这个寄存器,当STM32作为从机,在被寻址时,如果收到的寻址通过比较器判断,和自身地址相同,那STM32就作为从机,响应外部主机的召唤,并且这个STM32支持同时响应两个从机地址,所以就有自身地址寄存器和双地址寄存器,这一块,我们需要在多主机的模型下来理解
  • 右边这部分这是STM32设计的一个数据校验模块,当我们发送一个多字节的数据帧时,在这里硬件可以自动执行CRC校验计算,CRC是一种很常见的数据校验算法,它会根据前面这些数据,进行各种数据运算,然后会得到一个字节的校验位,附加在这个数据的后面,在接收到这一帧数据后,STM32的硬件也可以自动执行校验的判定,如果数据在传输的过程中出错了,CRC校验算法就通不过,硬件就会置校验错误标志位,告诉你数据错了,使用的时候注意点,这个校验过程就跟串口的奇偶校验差不多,也是用于进行数据有效性验证的

下面SCL的这部分,时钟控制,是用来控制SCL线的,在这个时钟控制寄存器写对应的位,电路就会执行对应的功能,然后控制逻辑电路,也是黑盒子,写入控制寄存器,可以对整个电路进行控制,读取状态寄存器,可以得知电路的工作状态,之后是中断,当内部有一些标志位置1之后,可能事件比较紧急,就可以申请中断,如果我们开启了这个中断,那当这个事件发生后,程序就可以跳到中断函数来处理这个事件了

最后是DMA请求与响应,在进行很多字节的收发时,可以配合DMA来提高效率

3.I2C基本结构

首先移位寄存器和数据寄存器DR的配合,是通信的核心部分,这里因为l2C是高位先行,所以这个移位寄存器是向左移位,在发送的时候,最高位先移出去,然后是次高位,等等,一个SCL时钟,移位一次,移位8次,这样就能把一个字节,由高位到低位,依次放到SDA线上了

那在接收的时候呢,数据通过GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了

之后GPI0口这里,使用硬件I2C的时候,这两个对应的GPIO口,都要配置成复用开漏输出的模式,复用,就是GPIO的状态是交由片上外设来控制的,开漏输出,这是12C协议要求的端口配置

然后SCL这里时钟控制器通过GPIO去控制时钟线,这里我简化成一主多从的模型了,所以时钟这里只画了输出的方向,实际上前面这里,如果是多主机的模型,时钟线也是会进行输入的

然后继续,SDA的部分,输出数据,通过GPIO,输出到端口,输入数据,也是通过GPIO,输入到移位寄存器,那这两个箭头连接在GPIO的哪个位置呢,

4.主机发送

当STM32想要执行指定地址写的时候,就要按照这个主发送器传送序列图来进行,这里有7位地址的主发送和10位地址的主发送,他们的区别就是,7位地址,起始条件后的一个字节是寻址,10位地址,起始条件后的两个字节都是寻址,其中前一个字节,这里写的是帧头,内容是5位的标志位11110+2位地址+1位读写位,然后后一个字节,内容就是纯粹的8位地址了,两个字节加一起,构成10位的寻址,这是10位地址的寻址方式

7位主发送这个时序呢,流程是起始,从机地址,应答,后面是数据1,应答,数据2,应答等等,最后是P,停止,因为12C协议只规定了起始之后必须是寻址,至于后面数据的用途,并没有明确的规定,这些数据可以由各个芯片厂商自己来规定,比如MPU6050规定就是寻址之后,数据1为指定寄存器地址,数据2为指定寄存器地址下的数据,之后的数据N,就是从指定寄存器地址开始依次往后写,这就是一个典型的指定地址写的时序流程

然后我们从头来看一下,首先,初始化之后,总线默认空闲状态,STM32默认是从模式,为了产生一个起始条件,STM32需要写入控制寄存器,手册中在这个控制寄存器CR1中,有个STAKT位,在这一位写1,就可以产生起始条件了,当起始条件发出后,这一位可以由硬件清除,所以,只要在这一位写1,STM32就自动产生起始条件了

之后,STM32由从模式转为主模式,也就是多主机模型下,STM32有数据要发,就要跳出来,这个意思,然后,控制完硬件电路之后,就要检查标志位,来看看硬件有没有达到我们想要的状态,在这里,起始条件之后,会发生EV5事件,这个EV5事件,你就可以把它当成是标志位,这个手册这里都是用EV(Event)几这个事件来代替标志位的,为什么要设计这个EV几,EV几事件,而不直接说产生什么标志位呢,这是因为,有的状态会同时产生多个标志位,所以这个EV几事件,就是组合了多个标志位的一个大标志位,在库函数中也会有对应的,检查EV几事件是否发生的函数,所以就当成是一个大标志位来理解就行了

当我们检测起始条件已发送时(EV5),就可以发送一个字节的从机地址了,从机地址需要写到数据寄存器DR中,写入DR之后硬件电路就会自动把这一个字节转到移位寄存器里,再把这一个字节发送到12C总线上,之后硬件会自动接收应答并判断,如果没有应答,硬件会置应答失败的标志位,然后这个标志位可以申请中断来提醒我们,当寻址完成之后,会发生EV6事件(地址发送结束),EV6事件结束后,是EV8_1事件,EV8_1事件就是TxE标志位=1,移位寄存器空,数据寄存器空,这时需要我们写入数据寄存器DR进行数据发送了,一旦写入DR之后,因为移位寄存器也是空,所以DR会立刻转到移位寄存器进行发送,这时就是EV8事件,移位寄存器韭空,数据寄存器空,这时就是移位寄存器正在发数据的状态,所以流程这里,数据1的时序就产生了,

在EV8后面没有了,写入DR密存器将清除该事件,所以按理说,这个位置应该是写入了下一个数据,也就是后面这个数据2,在这个时刻就被写入到数据寄存器里等着了,然后接收应答位之后,数据2就转入移位寄存器进行发送,此时的状态是移位寄存器非空,数据寄存器空,所以这时,这个EV8事件就又发生了,之后这个位置,数据2还正在移位发送,但此时下一个数据,已经被写到数据寄存器等着了,所以这个时候EV8事件消失,按照这个流程来,一旦我们检测到EV8事件,就可以写入下一个数据了,

最后,当我们想要发送的数据写完之后,这时就没有新的数据可以写入到数据寄存器了,当移位寄存器当前的数据移位完成时,此时就是移位寄存器空,数据寄存器也空的状态,这个事件就是这里的EV8_2,下面解释,EV8_2是TxE=1,也就是数据寄存器空,BTF (Bvte Transfer Finished),这个是字节发送结束标志位,所以在这里,当检测到EV8_2时,就可以产生终止条件了,显然,应该在控制寄存器里有相应的位可以控制

5.主机接收

主机接收的流程,这里有7位主接收和10位主接收,从这个7位主接收的时序看,这里时序的流程是起始,从机地址+读,接收应答,然后就是,接收数据,发送应答,接收数据,发送应答,最后一个数据,给非应答,之后终止,可以看出,这个时序应该是当前地址读的时序

下面10位地址的当前地址读,就复杂一些,这里是,起始,发送帧头,这个帧头里的读写位,应该还是写的,因为后面还要跟着发送第二个字节的地址,之后继续发送第二个字节的8位地址,这样才能进行寻址,然后要想转入读的时序,必须再发送重复起始条件,发送帧头,这次帧头的读写位就是读的了,因为发送读的指令之后,必须要立刻转入读的时序,所以这第二个字节的地址就没有了,直接转入接收数据的时序,这是10位地址的操作流程

7位:首先,写入控制寄存器的START位,产生其实条件,然后等待EV5事件,EV5事件就代表起始条件已发送,之后是寻址,接收应答,结束后产生EV6事件,EV6事件代表,寻址已完成,之后数据1这块,代表数据正在通过移位寄存器进行输入,EV6_1事件,下面解释是没有对应的事件标志,只适于接收1个字节的情况,这个EV6_1,可以看到,数据1其实还正在移位,还没收到呢,所以这个事件就没有标志位,之后当这个时序单元完成时,硬件会自动根据我们的配置,把应答位发送出去

如何配置是否要给应答呢,也是看手册:控制寄存器CR1里,这里有一位ACK:应答使能,如果写1,在接收到一个学节后就返回一个应答,写0就是不给应答,当这个时序单元结束后,就说明移位寄存器就已经成功移入一个字节的数据1了,这时,移入的一个字节就整体转移到数据奇存器,同时置RXNE标志位,表示数据寄存器非空,也就是收到了一个字节的数据,这个状态就是EV7事件,RXNE=1,数据寄存器非空,读DR寄存器清除该事件,也就是,收到数据了,当我们把数据读走之后,这个事件就没有了,上面这里,EV7事件没有了,说明此时数据1被读走,当然数据1还没读走的时候,数据2就可以直接移入移位寄存器了,之后,数据2移位完成收到数据2,产生EV7事件,读走数据2,EV7事件没有了,最后,当我们不需要继续接收时,需要在最后一个时序单元发生时,提前把刚才说的应答位控制寄存器ACK置0,并且设置终止条件请求,这就是EV7-1事件,和EV7一样后面加了一句,设置ACK=0和STOP请求,也就是我们想要结束了,之后,在这个时序完成后,由于设置了ACK=0,所以这里就会给出非应答,最后由于设置STOP位,所以产生终止条件,这样接收一个字节的时序就完成了

6.软件/硬件波形对比

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

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

相关文章

JavaWeb JavaScript 11.XML —— 配置文件

生活想埋没我,没想到我是颗种子 —— 24.9.19 一、XML 1.什么是XML XML是EXtensible Markup Languge的缩写,翻译过来就是可扩展标记语言。所以很明显,XML和HTML一样都是标记语言,也就是说它们的基本语法都是标签 可扩展 三个字…

OpenCV基础入门30讲(Python)——第二讲 图像色彩转换

常见的几种颜色类型介绍 1、彩色图像(Color Image,BGR) 数据类型:uint8通道数:3(BGR:蓝色、绿色、红色)描述:彩色图像有三个通道,每个通道的值范围是 0 到 …

【图书推荐】《Autodesk Inventor 2024入门与案例实战(视频教学版)》

本书重点 配套示例文件、PPT课件、教学视频、电子教案、课程标准、骄婿大纲、模拟试题、作者微信群答疑服务。 内容简介 《Autodesk Inventor 2024入门与案例实战:视频教学版》以Autodesk Inventor 2024为平台,重点介绍Autodesk Inventor 2024中文版的…

洗衣机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

洗衣机制造业作为传统制造业的重要组成部分,通过引入5G智能工厂物联数字孪生平台,加速推进自身的数字化转型进程。这一创新模式不仅极大地提升了生产效率,还深刻改变了产品的设计、生产、管理及运维流程,为行业带来了前所未有的竞…

[数据集][目标检测]手机识别检测数据集VOC+YOLO格式9997张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):9997 标注数量(xml文件个数):9997 标注数量(txt文件个数):9997 标注…

saltstack企业实战

saltstack官网最新文档 saltstack架构设计 saltstack 高可用方案:Salt官网是有 HARebalance minion配置里写多个master地址 failover(syndic) 架构 操作系统:CentOS7.6salt版本:3000.3 多master https://www.cn…

【贪心算法】贪心算法一

贪心算法一 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.柠檬水找零 题目…

【2023工业异常检测文献】SimpleNet

SimpleNet:ASimpleNetworkforImageAnomalyDetectionandLocalization 1、Background 图像异常检测和定位主要任务是识别并定位图像中异常区域。 工业异常检测最大的难题在于异常样本少,一般采用无监督方法,在训练过程中只使用正常样本。 解决工业异常检…

无人机黑飞打击技术详解

随着无人机技术的普及,无人机“黑飞”(未经授权或违反规定的飞行)现象日益严重,对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战,各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

光控资本:沪指涨0.59%,酿酒板块大幅拉升,数字货币概念等活跃

19日早盘,两市首要指数全线拉升,深证成指、创业板指涨约1%;场内超4800股飘红。 截至午间收盘,沪指涨0.59%报2733.38点,深证成指涨1.25%,创业板指涨0.99%,两市估计成交4263亿元。 盘面上看&…

C++ 9.19

练习&#xff1a;要求在堆区申请5个double类型的空间&#xff0c;用于存储5名学生的成绩。请自行封装函数完成 1> 空间的申请 2> 学生成绩的录入 3> 学生成绩的输出 4> 学生成绩进行降序排序 5> 释放申请的空间 主程序中用于测试上述函数 #include<ios…

google map小叉号不显示

背景需求 需要在uniapp中接入google地图,研究了一番,都没有找到合适的,现在说一下教程。 效果图 前期工作 这两点缺一不可,否则你啥也看不到。 1、电脑安装L-O-U梯 用于访问G-OO-G-LE的API或者创建google map key。 2、手机安装L-O-U梯 用于显示google地图。我就是手…

项目生命周期的类型

‌项目生命周期的类型包括预测型生命周期、迭代型生命周期、增量型生命周期、适应型生命周期和混合型生命周期。 预测型生命周期&#xff08;或称为瀑布型生命周期&#xff09; 从名称中我们就可以看出&#xff0c;我们对行业和项目是非常了解的&#xff0c;可以预测到下一步…

观后感:《中国数据库前世今生》——时代变迁中的数据库崛起

最近观看了《中国数据库前世今生》纪录片&#xff0c;这部影片详细梳理了从1980年代至今&#xff0c;中国数据库技术发展的跌宕历程。作为一名程序员&#xff0c;这部纪录片让我不禁感慨数据库技术的飞速进步&#xff0c;也让我更深入地理解了数据库技术在我们日常生活中的重要…

计算机毕业设计:Java心理在线测评测试系统开题报告+源代码效果图

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

气膜场馆造价解析:来自气膜厂家的专业解答—轻空间

气膜场馆作为一种新型的建筑形式&#xff0c;凭借其独特的结构和材料优势&#xff0c;逐渐在体育、文旅、工业等领域崭露头角。相较于传统建筑&#xff0c;气膜场馆在造价方面具有显著的优势&#xff0c;尤其是在节能、环保、安全等方面表现突出。然而&#xff0c;气膜场馆的造…

简单题70.爬楼梯 (Java)2024920

问题描述&#xff1a; java&#xff1a; class Solution {public int climbStairs(int n) {int f1 1;int f2 2;if(n<2){return n;}for(int s 3;s < n;s){int t f1 f2;f1 f2;f2 t;}return f2;} }

【C++】C++ STL探索:Priority Queue与仿函数的深入解析

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue 这篇文…

YOLOv9改进策略【注意力机制篇】| MCAttention 多尺度交叉轴注意力

一、本文介绍 本文记录的是基于MCA注意力模块的YOLOv9目标检测改进方法研究。普通的轴向注意力难以实现长距离交互&#xff0c;不利于捕获分割任务中所需的空间结构或形状&#xff0c;而MCA注意力模块通过构建了两个并行轴向注意力之间的交互&#xff0c;更有效地利用多尺度特…

vue3 ant-design 4.x 表格动态行样式设置

vue3 ant-design 4.x 表格动态行样式设置 1. 使用场景2. 实现方式 1. 使用场景 告警数据需要依据是否已读展示不同的文字颜色2. 实现方式 1&#xff09;首先给a-table设置class&#xff0c;然后使用rowClassName属性绑定动态设置样式方法 <a-tableclass"alarm-table…