【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

news2024/12/28 21:38:40

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、通信基本知识
    • 1.1 MCU的参见外设
    • 1.2 通信的分类
      • 按基本的类型
      • 从传输方向上来分
  • 二、UART(串口通讯)
    • 2.1 简介
    • 2.2 时序图分析
    • 2.3 UART的局限性
  • 三、I2C
    • 3.1简介
    • 3.1 硬件部分的知识
    • 3.2 通讯规则与时序分析:
  • 四、SPI
    • 4.1 简介
    • 4.2 时序图
  • 五、 总结


前言

在嵌入式系统开发中,通信协议扮演着至关重要的角色。UART、I2C、SPI是三种常用的串行通信协议,各自具有独特的特点和应用场景。本教程将深入解析这些协议的基本原理与时序。

一、通信基本知识

1.1 MCU的参见外设

存储设备(SD卡)、显示设备(屏幕)、传感器设备(GPS、温湿度传感器)等等

在这里插入图片描述

1.2 通信的分类

按基本的类型

串行通信:串行通信是一种通过一条数据线逐位发送数据的通信方式。数据按照顺序一位接一位地传输,这使得串行通信只需要较少的信号线,通常包括数据线、地线以及可能的时钟线和控制线。

并行通信
并行通信是一种通过多条数据线同时传输多位数据的通信方式。在同一时钟周期内,多个比特并行传输到目标设备。通常用于需要高传输速率的短距离通信。

从传输方向上来分

单工通信:单工通信就是公路上只允许车辆单向行驶,但数据只能从发送机发送给接收机,不能反向发送
在这里插入图片描述

半双工通信:半双工通信就是公路上允许车辆双向行驶,数据可以在发送机和接收机之间相互传输,但是不能同时发送
在这里插入图片描述
全双工通信:全双工通信就是公路上允许车辆同时双向行驶,数据可以在发送机和接收机之间同时相互传输
在这里插入图片描述

波特率
波特率是发送二进制数据位的速率,单位是bps(即每秒传输二进制位的数量)

二、UART(串口通讯)

2.1 简介

简介:
通用异步收发器,是一种通用串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,常用于单片机与单片机或外部辅助设备之间的通信,
在这里插入图片描述

2.2 时序图分析

在这里插入图片描述
注意
UART从低位开始发送数据,一次只能发送8位数据,加上起始位和停止位,实际上一共是发送了10位
UART应用的场景
RS232 9针串行接口:一般用于计算机和单片机之间的通信
USB转串口:这个是目前计算机和单片机之间通信最常见的方式
整体来说UART多用于板间通信,比如单片机与单片机,单片机与计算机,一个设备与另一个设备之间的通讯。

2.3 UART的局限性

1.不能远距离传输信号
因为串口通讯使用的是TTL电平,只能在很短的距离进行通讯,不然信号很容易受到干扰,如果需要远离的通信,则需要在中间加入抗干扰的芯片,因此,衍生出了RS232(最大支持30米)、RS485(最大距离可以超过1000米),同时RS485还增加了一对多的通信功能。
在这里插入图片描述
2.通信速递慢
大部分的情况下,我们使用的最高串口的波特率为115200(11.25KB/s),按照这个速度,一个小时都写不满一张64M的SD卡。究其原因,是UART的通信需要双方约定好特定的波特率,由于早期的单片机的频率低,时钟精度低的问题,双方不可能保持严格的一致,传输的速度太快很容易出现误码的情况。
解决这个问题的爆发就是,加入一个CLOCK的信号,双方不需要约定具体的通信速度,因此衍生出了SPI(最高的传输速度,可突破10M)
在这里插入图片描述
3.不能一对多通信(原则上只支持一对一的方式)
当系统有很多个传感器时进行数据传输时,MCU就需要多个串口来连接这些设备,会导致接口资源的浪费。
在这里插入图片描述
因此,衍生出了I2C通讯,它的最大的优势就是支持一对多的通讯方式,
I2C通讯有两根线,一个是时钟线CLOCK,一个是数据线DATA,每个设备都挂在在这两根线上,故称为总线。每个设备都有自己的独立的ID号(地址)。当单片机想要和任意的设备通讯时,只需要按照特定的通讯协议,找到相应的设备进行通讯即可。
在这里插入图片描述

三、I2C

3.1简介

简介
(1) I2C:是PHILIPS公司开发的一种两线式、串行、半双工同步通信总线,可以挂载多个参与通信的器件,常用于板内通信,比如单片机与外围芯片之间短距离、低速的信号传输

(2) I2C协议主要是解决了单片机一对多的通信问题,通过构建一条信息通道,只需两个IO口,两条线,就可以把电路板上的所有芯片串起来,利用这个信息通道相互传输数据,相比于UART的通讯方式,大大节约了单片机的宝贵的IO资源,也降低了PCB的布线成本

3.1 硬件部分的知识

(1) 问题一:在某一时刻,如果有两个设备同时发送数据,应该会发生什么?比如设备A要发送1,设备B 要发送0,如下图所示,最终数据总线上会是高电平还是低电平?
在这里插入图片描述
回答
为解决上述的问题,I2C做了一些阉割的处理(这也是I2C硬件设计最精髓的地方),
先介绍一下,一般芯片如何输出高低电平
在芯片10口的内部一般会有两颗MOS管,上面的MOS管导通就输出高电平,下面的MOS管导通就输出高电平
在这里插入图片描述
如果两个芯片都挂在在同一个数据的总线上,在某一时刻,芯片A输出高电平,芯片B输出低电平,此时,电流就直接从电源流入地,造成电路短路,必定元器件内烧毁
在这里插入图片描述
所以,为了避免这种情况的发生,I2C总线对于设备的IO口,做了一些阉割处理,去掉了上面的MOS管,这样就不可能存在短路的情况了。
在这里插入图片描述
不过这样也会带来另外的问题:设备只能输出低电平,无法输出高电平。
解决办法
在数据总线上,加一颗上拉电阻,那么数据总线就默认输出高电平了(也就是后面的通讯时,空闲状态为什么是高电平的原因
重新回到一开始的问题两个设备如果同时要发送信号,怎么办?
在这里插入图片描述
当设备A输出高电平,设备B输出低电平时,此时总线式处于低电平的,无法满足设备A的需求,此时就需要软件协议来解决这个问题(也就是发送数据前,要进行寻址的操作,确定通讯的设备

总结
I2C为了解决多设备共用总线,而步烧毁电路的问题,采用开漏输出的方案,配合上拉电阻,就可以输出完整的高低电平,这个上拉电阻的取值一般在几千欧姆(4.7k欧姆),如果总线设备多且通信速度要求高的话,电阻就选着小一些,反之,电阻大一些
在这里插入图片描述
注意
由于I2C采用开漏输出加上拉电阻的模式,所以I2C的抗干扰的能力比较弱,只适合用于同一块电路板上的芯片之间的通信,并不适合超过30cm电路板之间的通讯

3.2 通讯规则与时序分析:

SCL时钟线:SCL时钟线用于同步
SDA数据线:用于传输数据
在这里插入图片描述

I2C总线能挂载多个器件,且支持多主机模式,也就是说,线路上的任何一个器件都可以作为主机,但受限于只有一根信号线,同一也就是发起和结束一次通信的权利时刻只能有一个主机,主机拥有该时刻下总线的控制权,而从机只能被主机呼叫。
问题:那线路上有这么多器件,主机是怎么识别出自己要呼叫的从机?
回答
在I2C总线协议中,每个器件都有一个固定的号码,他是一个7位的地址 ,如上图所示,每个设备的地址。例如,主机要获取设备E2PROM的数据,会事先发一个0x31找到E2PROM设备
I2C的时序图
在这里插入图片描述
寻址流程
1.I2C协议发送数据是从高位到低位依次发送,当总线空闲时,SCL时钟线和SDA数据线均保持高电平,
2.当主机要开始传输数据时,会先将SDA电平拉低,而此时SDA数据线上这个从高到低的跳变沿,就是起始位
3.接下来就是进行期间寻址,在SCL低电平时依次发送七位地址位
4.地址发送完之后,紧接着主机会发送一个读写指示位,低电平表示要发送数据,高电平表示要请求数据
5.主机发送完以上数据从机如果成加接收,会发送一个应答位到总线上
注意:只有SCL处于低电平时,SDA可以变化,SCL高电平时,SDA需要保持,以方便数据接收方读取操作
数据发送
在这里插入图片描述
I2C通信一般流程:
1.主机发送起始位并进行从机寻址
2.得到应答后主机开始发送 / 读取数据位
3.数据发送 / 读取完成主机发送停止位结束此次通信
在这里插入图片描述

应用的设备:
1.温湿度传感器

四、SPI

4.1 简介

简介
串行外围设备接口,是一种高速、全双工、同步通信总线,常用于单片机和E2PROM、FLASH、实时时钟、数字信号处理器等器件的通信,它主要是主从方式通信,通常只有一个主机和数个从机。
在这里插入图片描述
SCLK:时钟信号,由主机产生(Must)
MOSl:主机给从机发送指令或数据的通道
MIS0:主机读取从机的状态或数据的通道
CS:从机片选使能信号

在同一时刻,主机只能跟一个从机进行通信,当总线存在多个从机时,需要进行片选,将从机的CS接口电平拉低或者拉低。
在这里插入图片描述

4.2 时序图

以SCLK时钟线空闲时时高电平为例:
1.当SCLK出现下降沿时(从高电平跳到低电平时),进行数据输出
2.当SCLK出现上升沿时(从低电平跳到高电平时),进行数据采样
在这里插入图片描述
注意
1.SPI发送数据也是从高位到低位依次发送数据
2.SPI的时钟线SCLK在空闲的时候可以是高电平也可是低电平(由时钟的极性决定)
3.和I2C相比,SPI没有开始位、结束位、应答位,故规则上简单很多

CPIOL时钟极性
a. CPOL=0时,SCLK空闲时状态为低电平
b. CPOL=1时,SCLK空闲时状态为高电平

CPHA时钟的相位:它决定了什么时候进行数据输出,什么时候进行数据采样
a. CPHA=0时,每个周期的第一个跳变沿采样
b. CPHA=1时,每个周期的第一个跳变沿输出

不管上述哪一种设置,输出和采样都是交替进行,以上的两两组合,就构成了SPI的四种工作模式

五、 总结

在这里插入图片描述
常见的问题:UART/I2C/SPI这三种通讯协议之间的异同点是什么?
回答
1.通讯模式上:
SPI和IIC是同步通信,依赖时钟信号;而UART是异步通信,使用起始位和停止位来界定数据包。
2.从通讯的管脚上来说:
UART:只使用数据线和地线。通信双方需要预先约定波特率
I2C:使用两条线进行通信:数据线(SDA)和时钟线(SCL)。
SPI:使用四条线进行通信:主设备输出数据线(MOSI)、主设备输入数据线(MISO)、时钟线(SCLK)和从设备选择线(CS)

3.通讯的速率上:
SPI通常提供最高的数据传输速度(可突破10M),其次是IIC,UART相对较慢.

4.多设备通信方面:
IIC和SPI都支持多设备通信,但SPI需要为每个设备提供单独的SS(片选)信号线,而IIC通过地址识别设备。而UART原则上只支持一对一的通讯方式。
5.从纠错的方面:
UART有奇偶检验的方式来纠错,I2C有应答的方式来纠错,SPI没有

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

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

相关文章

Docker 部署 plumelog 最新版本 实现日志采集

1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…

Empire Lupin One靶机

靶机 ip:192.168.152.157 我们访问页面 第一步信息收集 我们先扫描一下端口 扫描到开启了 22 端口 80 端口 我们使用御剑扫描一下网站的后台 我们挨个访问一下 发现 apache 的帮助页面,暂时记录,看看等会有没有需要 我们查看到 robots.tx…

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

hdfs命令(三)- hdfs 管理命令(三)- hdfs dfsadmin命令

文章目录 前言一、hdfs分布式文件系统管理命令1. 介绍2. 语法及解释3. 命令3.1 生成HDFS集群的状态报告3.1.1 语法及解释3.1.2 示例 3.2 重新加载配置文件并更新NameNode中的节点列表3.3 刷新指定DataNode上的NameNode信息3.3.1 语法 3.4 获取并显示指定DataNode的信息3.4.1 语…

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击,标签为“替换为:”的文本框,注意光标一定要打在图红色方框圈中的文本框中! 4.点击格式选择字体 5.勾选上标…

JAVA:最简单多线程方法调用

以下介绍在JAVA中,最简单调用多线程的方法。 在需要使用多线程方法的类中,新增线程类Thread并实现方法run。 //定义多线程class ThreadLinePoints extends Thread{private String m;public ThreadLinePoints(){}public ThreadLinePoints(String m){this…

Hadoop中MapReduce过程中Shuffle过程实现自定义排序

文章目录 Hadoop中MapReduce过程中Shuffle过程实现自定义排序一、引言二、实现WritableComparable接口1、自定义Key类 三、使用Job.setSortComparatorClass方法2、设置自定义排序器3、自定义排序器类 四、使用示例五、总结 Hadoop中MapReduce过程中Shuffle过程实现自定义排序 一…

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设,成为了人类社会数字化迁徙的助推剂,让新三大件之间的耦合越来越紧密。从物理世界到数字世…

Windows 11 中部署 Linux 项目

一、总体思路 在 Windows 11 中部署 Linux 项目,主要是借助 Windows Subsystem for Linux(WSL)来实现。在WSL中新建基于Linux的项目虚拟环境,以供WIN下已克隆的项目使用。WSL 允许在 Windows 系统上运行原生的 Linux 二进制可执行…

【ETCD】【实操篇(十五)】etcd集群成员管理:如何高效地添加、删除与更新节点

etcd 是一个高可用的分布式键值存储,广泛应用于存储服务发现、配置管理等场景。为了确保集群的稳定性和可扩展性,管理成员节点的添加、删除和更新变得尤为重要。本文将指导您如何在etcd集群中处理成员管理,帮助您高效地维护集群节点。 目录 …

数据结构与算法Python版 平衡二叉查找树AVL

文章目录 一、平衡二叉查找树二、AVL树测试三、AVL树-算法分析 一、平衡二叉查找树 平衡二叉查找树-AVL树的定义 AVL树:在key插入时一直保持平衡的二叉查找树。可以利用AVL树实现抽象数据类型映射Map。与二叉查找树相比,AVL树基本上与二叉查找树的实现…

【Redis】Redis 安装与启动

在实际工作中,大多数企业选择基于 Linux 服务器来部署项目。本文演示如何使用 MobaXterm 远程连接工具,在 CentOS 7 上安装和启动 Redis 服务(三种启动方式,包括默认启动、指定配置启动和开机自启)。在安装之前&#x…

通过Js动态控制Bootstrap模态框-弹窗效果

目的&#xff1a;实现弹出窗、仅关闭弹窗之后才能操作&#xff08;按ESC可退出&#xff09;。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

el-table合并单元行后的多选框选中问题

问题描述 合并单元行以后&#xff0c;首列的多选框也会合并&#xff0c;此时选中该多选框其实是只选中了合并单元行的第一行的多选框&#xff0c;其他的都未被选中。 解决方案 原本想着手动去修改表头的半选状态和全选状态 &#xff0c;但是没有找到相关方法&#xff0c;后面觉…

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…

图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档

1、第一种情况-无数据库表&#xff0c;但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模&#xff0c;如下图&#xff1a; 1.2 Report配置和导出 1、点击&#xff1a;Report->Reports&#xff0c;如下图&#xff1a; 2、点击&…

UE--如何用 Python 调用 C++ 及蓝图函数

前言 先讲下如何用 Python 调用 C 函数吧。 详细可见我的上篇文章 最关键的一点就是得在函数上加一个宏&#xff1a;UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable) static bool GetOrCreatePackage(const FString& PackagePath, UPackage*& OutPackag…

小程序租赁系统开发的优势与实践探索

内容概要 小程序租赁系统开发正在引起广泛关注&#xff0c;特别是在数字化快速发展的今天。很多企业开始意识到&#xff0c;小程序不仅能为他们带来更多的客户&#xff0c;还能极大地提高管理效率。借助小程序&#xff0c;用户在租赁时可以更加方便地浏览和选择产品&#xff0…

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…