【STM32】USART串口和I2C通信

news2024/9/21 4:40:50

在这里插入图片描述
个人主页~


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位


在这里插入图片描述

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

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

相关文章

Chapter 29 类型注解

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、变量的类型注解二、函数的类型注解三、Union类型注解 前言 类型注解为我们提供了一种清晰的方式来描述变量和函数的预期类型,使得代码的意图更加明确。…

GMMREG:基于高斯混合模型的鲁棒点集配准

其关键思想都是用连续密度函数表示离散点集,即高斯混合模型。不同点在于本节算法采用L2距离来衡量两个点云之间的相似性,而5.7节中的NDT算法采用的是作者定义的匹配势来衡量,实际上是所有线段对之间的差异。并且本节算法中加入了薄板样条插值…

打造分布式缓存组件【场景】

本文将采用AOP 反射 Redis自定义缓存标签,重构缓存代码,打造基础架构分布式缓存组件 配置 需要在Redis配置类中开启AOP自动代理,即通过EnableAspectJAutoProxy 注解实现该功能 import com.fasterxml.jackson.annotation.JsonAutoDetect; …

「链表」链表原地算法合集:原地翻转|原地删除|原地取中|原地查重 / LeetCode 206|237|2095|287(C++)

概述 对于一张单向链表,我们总是使用双指针实现一些算法逻辑,这旨在用常量级别空间复杂度和线性时间复杂度来解决一些问题。 所谓原地算法,是指不使用额外空间的算法。 现在,我们利用双指针实现以下四种行为。 //Definition fo…

Linux驱动.之I2C,iic驱动层(二)

一、 Linux下IIC驱动架构 本篇只分析,一个整体框架。 1、首先说说,单片机,的i2c硬件接口图,一个i2c接口,通过sda和scl总线,外接了多个设备device,通过单片机,来控制i2c的信号发生&…

VUE和Element Plus

1.VUE 1.下载和配置环境 使用vue编程,我们需要使用到的编程软件是vs code,还需要使用node.js,这个的作用就类似于JDK,当我们都下载好之后,winR键打开命令提示符,我们在这里可以查看版本, npm…

《计算机网络 - 自顶向下方法》阅读笔记

《计算机网络 - 自顶向下方法》阅读笔记 应用层、运输层、网络层、数据链路层 计算机网络和因特网: 因特网: ​ 是一个世界范围的计算机网络,互联了全世界的计算机设备 计算机设备:手机,电脑,游戏机&#…

MATLAB数据可视化:在地图上画京沪线的城市连线

matlab自带的geoplot(lat,lon) 可以在地理坐标中绘制线条。使用 lat和lon分别指定以度为单位的经度和纬度坐标。 绘制京沪线所经城市线条: citys [116.350009,39.853928; 116.683546,39.538304; 117.201509,39.085318; 116.838715,38.304676;...116.359244,37.436…

Java网络编程——HTTP协议原理

协议 我们在网上冲浪时,会在浏览器地址栏输入一个网址,然后就能打开网页了。比如,输入 https://www.douban.com/就可以访问到豆瓣的主页: 那么大家是否好奇:https 是什么意思,作用又是什么呢?…

语言模型简介和Ngram模型(1)

语言模型介绍一 语言模型语言模型概念语言模型应用-语音识别声纹特征提取语言模型挑选成句 语言模型应用-手写识别语言模型应用-输入法语言模型分类语言模型评价指标-困惑度PPL N-gram语言模型马尔科夫假设平滑问题平滑问题解决一平滑问题解决二 插值优化语言模型应用-文本纠错…

unity 创建项目报错feature has expired (H0041),sentinel key not found (H0007)

两个报错同一种处理方式。 1、删除以下路径所有文件:C:\ProgramData\SafeNet Sentinel(注意:ProgramData为隐藏文件) 2、打开Cmd(WinR键,输入cmd回车),进入Unity安装所在盘符&#…

SecureCRT记录会话日志

在使用SecureCRT软件的时候,有个非常实用的功能:记录会话日志,就是可以把当前会话的所有记录保存成文本文件。下面简单介绍一下如何使用这个功能。 首先点击SecureCRT软件左上角的文件 然后点击会话日志即可 然后选择一个路径保存日志&#…

物流仓库安全视频智能管理方案:构建全方位、高效能的防护体系

一、背景分析 随着物流行业的快速发展和仓储需求的日益增长,仓库安全成为企业运营中不可忽视的重要环节。传统的人工监控方式不仅效率低下,且难以做到全天候、无死角覆盖,给仓库资产和人员安全带来潜在风险。因此,引入仓库安全视…

Datawhale AI夏令营第四期 魔搭-AIGC方向 task01笔记

目录 赛题内容 可图Kolors-LoRA风格故事挑战赛 baseline要点讲解(请配合Datawhale速通教程食用) Step1 设置算例及比赛账号的报名和授权 Step2 进行赛事报名并创建PAI实例 Step3 执行baseline Step4 进行赛题提交 微调结果上传魔搭 lora 调参参数介绍及 SD 的基础知识点…

ST-LINK烧录MCU

打开ST-LINK软件: 主板断电状态下接入烧录器,烧录器USB连接电脑: 主板上电,点击连接按钮: 点击加载文件: 点击写入按钮,烧录成功后拔掉烧录器,主板重新上电

CPU 流水线技术初识

在当今数字化的时代,计算机已经成为我们生活中不可或缺的一部分。而在计算机的核心部位,中央处理器(CPU)则是其重要的组成部分。CPU 的性能决定了计算机的运行速度和处理能力,而流水线技术则是 CPU 性能提升的关键所在…

SCAU华南农业大学 高级程序语言设计(C语言)OJ实验题解

有错漏/建议/意见 欢迎在评论区提出!!! 实验1 C语言程序初步 堂前习题 6567 第一个C程序 描述: 将下列程序输入Visual C,编译、连接和运行该程序,运行通过后,提交程序。 输入: …

不同环境下RabbitMQ的安装-3 操作RabbitMQ

前面两篇从不同环境下RabbitMQ的安装-1 为什么要使用消息服务 到同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ介绍了关于如何在ARM架构、X86架构和Window系统下如何安装,各位小伙伴可以根据自己的实际开发场景参考安装。 到本篇是一些…

宿主机与容器(docker)之间的数据共享

目录 一台宿主机上的容器和宿主机之间的数据共享 创建卷 进入Docker的卷的存储位置 进入卷ep1的数据存储位置 创建容器并挂载至卷ep1上 测试: 进入容器内部查看 一台宿主机上的多个容器之间的数据共享 挂载新的docker容器在该卷上 查看修改的数据是否一致…

CocosCreator使用 ProtoBuf WebSocket与服务器对接方法

在 Cocos Creator 中使用 .proto 文件和转换成 TypeScript(TS)两者各有其优缺点,具体选择取决于你的项目需求和团队的开发习惯。以下是两者的一些比较: 1、使用 .proto 文件的优点: 跨语言支持:Protocol B…