【STM32】USART串口和I2C通信
个人主页~
USART串口和I2C通信
- USART串口
- 一、串口
- 1、简介
- 2、电路要求
- 3、参数及时序
- 二、USART外设
- 1、USART结构
- 2、波特率发生器
- 三、数据包
- 1、HEX数据包
- HEX数据包接收
- 2、文本数据包
- 文本数据包接收
- I2C通信
- 一、简介
- 二、通信协议
- 1、硬件电路
- 2、I2C时序基本单元
- 三、I2C外设
- 1、简介
- 2、基本结构
- 3、主机发送
- 4、主机接收
USART串口
一、串口
1、简介
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单、可实现两个设备的互相通信
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与其他模块互相通信
2、电路要求
简单双向串口通信有两根通讯线:发送端TX和接收端RX,以及两根供电线:VCC和GND,TX和RX是单端信号,它们的高低电平都是相对于GND的,所以GND也可以看做是通讯线
TX和RX要交叉连接,一个设备的输出代表着另一个设备的输入,如果只需要单向的数据传输时,可以只接一根通信线
3、参数及时序
串口通信的速率就是波特率,单位为波特,在二进制下,波特率相当于比特率
串口通信先后由起始位1位、数据位8位、(校验位1位)、停止位1位四个位一帧共10(11)位组成,一般启用校验就是11位,不启用校验就是10位
起始位标志一个数据帧的开始,固定为低电平
停止位标志一个数据帧的结束,固定为高电平
在空闲时也就是不通讯的时候,默认为高电平也就是1,在开始写入时,起始位置为0,为低电平,给出一个开始通信的信号,然后依序写入数据位8位,写入数据位时低位先行,也就是最后一个二进制数放到第一个数据位上,然后写入校验位,然后来到停止位置为1,为高电平,恢复默认状态
在需要串口通信时,按照波特率的要求,定时翻转引脚电平就可以了
校验位是用于数据验证的,共三种校验方式:奇校验、偶校验、无校验
如果设定为奇校验位,那么它会统计数据位中1的个数,如果为奇数个那么就为1,为偶数个就为0,如果设定为偶校验位,则反之,如果无校验方式,那么这一位直接无
这样的检验方式可以保证在传输过程中如果有一位数据丢失了可以被检测出来,可是它只能检测一位数据的丢失,如果两位数据都丢失了它是检测不出来的,鸡肋
1位起始位、8位数据位、(1位校验位)、1位停止位共10(11)位打包成一帧通过TX发送到RX中,RX一位一位的读取,这样就实现了串口通信
二、USART外设
USART,通用同步/异步收发器,是STM32内部集成的硬件外设,可以根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚打包发送出去,也可以自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
自带波特率发生器,最高为4.5Mbit/s
可以配置是否有校验位,并且可以选择无校验、奇校验还是偶校验,可以配置停止位的长度为0.5/1/1.5/2,因为停止位的长度决定了帧的间隔
1、USART结构
可以看到TX和RX两个引脚,它们连接到IrDA SIR编解码模块,负责通过引脚进入数据的解码和通过引脚离开数据的编码,TX引脚连接到发送移位寄存器,RX引脚连接到接收移位寄存器,发送移位寄存器的作用是一位一位地移出去,接收移位寄存器的作用是一位一位地写进来
接收和发送寄存器RDR、TDR,在程序中只能操纵一个寄存器DR,实际上在硬件中分为了两个,RDR是只读寄存器,TDR是只写寄存器
当有数据写入TDR中时,硬件电路自动检查发送移位寄存器是否有数据正在移位,如果没有,这个数据就会立刻移动到发送移位寄存器中准备发送,发送时向右移位,将数据一位一位地输出到TX引脚,当数据从TDR移动到发送移位寄存器时,会置一个标志位,叫做TXE(TX Empty),用于判定发送数据寄存器TDR是否为空,如果TXE为1,就可以在TDR中写入下一个数据
通过RX引脚将数据写入接收移位寄存器,硬件电路自动检查接收数据寄存器是否有数据正在移位,如果没有,这个数据就会立刻移动到接收移位寄存器中准备接收,接收时向右移位,将数据一位一位地写进数据寄存器,当数据从读取移位寄存器移动到接收数据寄存器RDR时,会置一个标志位,叫做RXNE(RX Nonempty),用于判定接受数据寄存器RDR是否不为空,如果RXNE为1,RDR就可以继续读取RX引脚的数据
硬件数据流控可以避免接收或发送数据过多过快导致的数据覆盖的问题,有两个引脚:nRTS(Request To Send)用于发送,nCTS(Clear To Send)用于接收,一个设备的RTS连接另一个设备的CTS,当一个设备可接收时,RTS置低电平,请求对方发送,当这个设备忙,不想接收时,RTS置高电平,对方CTS接收到后就会暂时停止发送
这就是USART的基本功能了,其他的不多介绍
2、波特率发生器
发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
波特率 = 时钟频率/(16*DIV)
波特率是很重要的,它决定了设备读取高低电平的间隔,也就是说,设备能否正确读取到正确的信息,都取决于波特率的匹配
三、数据包
1、HEX数据包
在HEX数据包里,数据都是以原始的字节数据本身呈现的
HEX数据包分为两种,一种是固定的包长,也就是每次打包的数据长度相同,然后由包头和包尾将它包起来,另一种是不固定包长,也就是每次打包的数据长度可以不同,也是由包头和包尾包起来
包头包尾的作用是标志位,包头标志数据开始,包尾标志数据结束
由于包头包尾也是数据,当我们需要包起来的数据和包头包尾重复了,我们可以尽量选择固定包长的方式打包数据,再一个就是尽量传输与包头包尾不同的数据,还有就是增加包头包尾的数据个数,比如说两个数据做包头,两个数据做包尾
HEX数据包接收
置一个标志位,开始值为0,在检测到包头时置为1,然后开始接收数据,如果是固定包长数据包,那么就接收相应固定个数个数据后将标志位置为2,等待包尾,检测到包尾后打包,置标志位为0,如果是不固定包长数据包,就是在接收数据的同时检测包尾,出现包尾标志位就置为0
2、文本数据包
文本数据包的本质也是字节数据,不过经过编码和译码最终成了字符形式,这个数据包也是通过包头和包尾包起来的,这样的包头包尾与需要打包的数据出现重复的可能性会大大降低
文本数据包接收
跟HEX数据包接收差不多,也是置一个标志位,开始值为0,在检测到包头时置为1,然后开始接收数据,如果是固定包长数据包,那么就接收相应固定个数个数据后将标志位置为2,等待包尾,检测到包尾后打包,置标志位为0,如果是不固定包长数据包,就是在接收数据的同时检测包尾,出现包尾标志位就置为0,不过这个包头和包尾变成了字符,且一般包尾是‘\n’换行
I2C通信
一、简介
I2C(Inter IC BUS),读作I方C,2是平方的意思,它有两根通信线:SCL(Serial Clock)、SDA(Serial Data),是同步(主机通过时钟线SCL发送时钟信号,控制数据传输的节奏,确保发送和接收双方的数据同步,也就是二者时钟相同),半双工通信(通过一根数据线SDA实现数据的双向传输,但在同一时刻只能有一个设备发送数据,另一个设备接收数据,通过切换数据传输方向)
在一个设备与另一个设备通信时,接收到数据的一方在接收完毕后会有数据应答,即告诉发送数据的设备一声已经接收到了,且一个主机可以通过I2C通信挂载多个设备
二、通信协议
1、硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻
IC是被控机,也就是从机,从机接到I2C总线上,CPU对SCL线有绝对的控制权,任何从机不允许控制SCL线,CPU对SDA稍微放松,在CPU发送数据的时候,从机只能被动的读取,在需要从机向主机写入时,CPU同意后,从机才能获得暂时的SDA控制权
上图是SCL和SDA的输入输出的模式,为开漏输出,我们之前提到过,开漏输出只有一个MOS管,接GND,在MOS管开通时为低电平,在MOS管关闭时为浮空输出,此时在外接一个如上上图的上拉电阻,起到一个弱上拉的作用,就可以在MOS管关闭时为高电平,且这种弱上拉的高电平不会对电路造成损害
2、I2C时序基本单元
一个完整的数据帧由起始条件开始,终止条件结束
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
这里的起始终止条件跟串口通信的起始位终止位是一样的,并且起始和终止的信号只能由主机控制
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节,主机在接收之前需要释放SDA(因为释放SDA后才能切换为输入模式,也就是高电平)
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答,主机在接收之前需要释放SDA
如果从机发送一个数据后主机有应答,从机就继续发送数据
如果从机发送一个数据主机无应答,从机就将SDA的控制权交出
三、I2C外设
1、简介
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能
支持多主机模型,是可变多主机模型,就是有很多从机,在需要收发信号时有一个从机跳出来做主机,当活动结束后,又变回从机
2、基本结构
数据移位寄存器(高位先行,向左移位)与数据寄存器DR(DATA REGISTER)相互配合,实现逻辑与上面的USART串口实现逻辑基本相同,只是上方的USART串口为全双工通信,拥有独立的写入寄存器和读取寄存器,而I2C通信是一种半双工通信,写入和读取都是用一套寄存器
输入数据通过SDA进入到数据移位寄存器,然后写进数据寄存器DR,输出数据通过数据寄存器DR写入到数据移位寄存器,再将数据向左移位一位一位移出
这里还有PEC功能,这个相当于前面所说的串口通信中的校验位,用于校验数据的传输是否正确
还有比较器和地址寄存器,在多主机模型下,所有设备都是从机,所以这里需要一个存放一个自身地址的寄存器,以及主机寻址判断是否与自身地址相同的比较器
时钟控制寄存器用来控制时钟控制电路,时钟控制电路控制SCL线,控制寄存器可以对电路进行控制,读取状态寄存器可以读取当前电路状态,然后再内部请求中断时可以进行中断程序,以及请求DMA的协助
3、主机发送
我们碰到的从机一般都是7位地址的,也有10位地址的,入门先了解7位地址的
Start后,会发生EV5事件,置SB为1,当SB为1时,代表起始条件已发送,读SR1然后将地址写入DR寄存器将清除该事件,也就是无需我们手动清除
EV5事件后,在数据寄存器DR接收到开始条件后,开始写入从机地址,然后数据从数据寄存器DR转移到移位寄存器中,将这一个字节发送到I2C总线上,之后硬件会自动接收应答并判断,也就是上边所说的比较器和地址寄存器的作用
发送地址结束后,会发生EV6事件,将ADDR置为1,标志着主机发送地址完成,读SR1后读SR2将清除该事件说明也不需要我们手动清除
EV6事件结束后,会发生EB8_1事件,置TxE(数据寄存器为空)为1,此时移位寄存器和数据寄存器DR都为空,写入数据寄存器DR,写入后会立刻转移到移位寄存器中,发生EV8事件,移位寄存器非空,数据寄存器为空,之后就是直接发送
在数据1的在应答之前,我们发现EV8事件已经消失,说明此时数据寄存器DR已经被写入,也就是数据2被写入到数据寄存器DR中,应答结束后发生EV8事件,继续发送数据,如此循环往复就可以将N个数据发送
当我们发送完所有我们想要发送的数据,并且移位寄存器和数据寄存器DR都为空时,发生EV8_2事件,置TxE为1,BTF为1(字节发送结束标志位),就会触发Stop停止条件,在停止寄存器里写1,终止发送
4、主机接收
前面的部分一直到EV6事件与上方效果相同,不再赘述
EV6事件结束后发生EV6_1事件,在数据1进行移位的过程中发生,所以没有对应的时间标志,作用是清除相应和停止条件的产生位,然后给一个应答,在应答结束后说明移位寄存器已经成功移入一个字节的数据1了,此时整个字节同时转移到数据寄存器DR,同时置RxNE标志位为1(数据寄存器DR非空),也就是EV7事件
按照上述流程,一直到最后一个数据接收前提前将应答位控制寄存器ACK置0,设置STOP终止条件请求,也就是EV7_1事件,此时数据寄存器DR非空,还在接收,之后置非应答位NA,最后置STOP位
相关文章:

【STM32】USART串口和I2C通信
个人主页~ USART串口和I2C通信 USART串口一、串口1、简介2、电路要求3、参数及时序 二、USART外设1、USART结构2、波特率发生器 三、数据包1、HEX数据包HEX数据包接收 2、文本数据包文本数据包接收 I2C通信一、简介二、通信协议1、硬件电路2、I2C时序基本单元 三、I2C外设1、简…...

【Material-UI】按钮组:垂直按钮组详解
文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、垂直按钮组的应用场景1. 导航菜单2. 表单操作3. 选项切换 三、按钮组的样式定制1. 变体(Variants)2. 颜色(Colors) 四、垂直按钮组的优势1. 空间利用2. 可读性与易用性3. 视觉…...

DDR5 的优势与应用
DDR5 是新一代 DRAM 内存,具有一系列强大的功能,可提升可靠性、可用性和可维护性 (RAS),降低能耗并显著提高性能。请查看下方表格,了解 DDR4 和 DDR5 之间的一些主要特性差异。 DDR5 的优势 特性/选项 DDR4DDR5DDR5 优势数据速率…...

STM32 - 笔记
1 STM32的串口通信 【keysking的STM32教程】 第8集 STM32的串口通信_哔哩哔哩_bilibili 波特律动 串口助手...

基于QT实现的简易WPS(已开源)
一、开发工具及开源地址: 开发工具:QTCreator ,QT 5 开源地址: GitHub - Whale-xh/WPS_official: Simple WPS based on QTSimple WPS based on QT. Contribute to Whale-xh/WPS_official development by creating an acc…...
Flask-WTF 表单处理详细教程(第六阶段)
目录 Flask-WTF 表单处理详细教程1. 安装 Flask-WTF2. 创建 Flask 应用3. 创建表单类表单字段解释: 4. 渲染表单渲染模板CSRF 保护 5. 表单验证6. 处理错误7. 完整示例8. 结论 Flask-WTF 表单处理详细教程 Flask-WTF 是 Flask 框架的一个扩展,简化了 We…...

C语言 | Leetcode C语言题解之第330题按要求补齐数组
题目: 题解: int minPatches(int* nums, int numsSize, int n) {int patches 0;long long x 1;int index 0;while (x < n) {if (index < numsSize && nums[index] < x) {x nums[index];index;} else {x << 1;patches;}}retu…...

无人机之测绘行业篇
无人机倾斜摄影技术凭借快速高效、机动灵活、成本低等优势,正慢慢颠覆传统测绘的作业方式,已成为测绘行业的“新宠”,将倾斜摄影技术应用到无人机上,实际上就是在做一个三维模型,而建立起来的这个模型更加真实…...
Java编程:每日挑战
目录 题目1.一个抽象类并不需要其中所有的方法都是抽象的。( )2.下面有关java hashmap的说法错误的是?A. HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。B. HashMap 的实现不是同步的,意味着它不…...

【自动驾驶】ubuntu server安装桌面版
目录 安装桌面版当锁屏界面使用root用户登录错误时 这里环境一开始是ubuntu20.04服务器版本 安装桌面版 sudo apt-get update sudo apt-get upgrade apt-get install -y ubuntu-desktop # 如果你不想安装一些附加的程序,可用以下命令 sudo apt install --no-instal…...

前端模块化-手写mini-vite
前言 本文总结了一些关于 Vite 的工作原理,以及一些实现细节。 本节对应的 demo 可以在这里找到。 什么是 Vite Vite 是一个基于浏览器原生 ES imports 的开发服务器。利用浏览器去解析 imports,在服务器端按需编译返回,完全跳过了打包这个…...

SpringBoot中fastjson扩展: 自定义序列化和反序列化方法实战
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」 ☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 :…...

【QT】鼠标按键事件 - QMouseEvent QKeyEvent
qt 事件 事件1. 事件概念2. 事件的处理3. 按键事件(1)单个按键(2)组合按键 4. 鼠标事件(1)鼠标单击事件(2)鼠标释放事件(3)鼠标双击事件(4&#x…...
纯手工在内网部署一个Docker私有仓库
纯手工在内网部署一个Docker私有仓库 下载Docker仓库的镜像上传仓库的镜像导入仓库的镜像启动仓库镜像配置客户端的Docker上传镜像到本地仓库从本地仓库拉取镜像 下载Docker仓库的镜像 这个镜像不太好找,有需要的可以从下面的地址中下载。 通过百度网盘分享的文件…...
农林经济管理学报
《农林经济管理学报》是由江西省教育厅主管、江西农业大学主办、北京大学中国农业政策研究中心和中国人民大学农业与农村发展学院学术支持的农林经管类学术双月刊,以主要刊载农林经济政策与理论,反映农林经济管理前沿动态和研究成果,开展学术…...

【初阶数据结构题目】16.用队列实现栈
用队列实现栈 点击链接答题 思路: 出栈:找不为空的队列,将size-1个数据导入到另一个队列中。 入栈:往不为空队列里面插入数据 取栈顶元素: 例如: 两个队列: Q1:1 2 3Q2:…...
使用 OpenAI Whisper v2 模型进行中英文混合语音识别
https://huggingface.co/openai/whisper-large-v2 使用 OpenAI Whisper 模型进行中英文混合语音识别 在本篇博客中,我们将详细介绍如何使用 OpenAI 的 Whisper 模型进行中英文混合语音识别,并设置 Hugging Face 的缓存路径。 简介 Whisper 是 OpenAI 提供的一个强大的自动…...
代码随想录算法训练营day37|动态规划part05
完全背包问题; 第一题:518. Coin Change II class Solution {public int change(int amount, int[] coins) {//递推表达式int[] dp new int[amount 1];//初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装dp[0] 1;fo…...
Git 如何提交代码
一. 简介 前面几篇文章简单学习了 git常用命令,文章如下: Git使用过程中涉及的几个区域-CSDN博客 Git常用命令的使用-CSDN博客 本文学习一下 如何使用 git命令,将本地代码提交到远程仓库。 二. 使用 git命令将本地代码提交到远程仓库中 …...

SpringBoot-application.properties为对象赋值
简单对象赋值 第一种方式 首先让该Bean交由Spring管理,然后加上ConfigurationProperties(prefix"前缀") <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>&l…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...