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

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

文章目录

  • 前言
  • 一、通信基本知识
    • 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没有

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ceph 手动部署(CentOS9)

#Ceph手动部署、CentOS9、squid版本、数字版本19.2.0 #部署服务:块、对象、文件 一、部署前规划 1、兼容性确认 2、资源规划 节点类型节点名称操作系统CPU/内存硬盘网络组件安装集群节点CephAdm01CentOS94U/8GOS:40G,OSD:2*100GIP1:192.169.0.9(管理&集群),IP2:…

CentOS7 解决ping:www.baidu.com 未知的名称或服务

CentOS7 解决ping:www.baidu.com“未知的名称或服务 在VM查看网络配置 查看虚拟网络编辑器 编辑网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注意:不同机器的配置文件名可能不相同,通过 ip addr 命令查看 将 ONBOOT 从 no 改…

GPU 进阶笔记(二):华为昇腾 910B GPU

大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探:鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…

[ICCD 2022]Towards Sparsification of Graph Neural Networks

论文网址:[2209.04766] Towards Sparsification of Graph Neural Networks 论文代码:github.com 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正&#…

人工智能与传统编程的主要区别是什么?

传统编程:开发者预先编写软件行为规则,代码基于程序员定义逻辑处理输入并产生确定输出,具有确定性、手动编写规则和结构化逻辑特点,如垃圾邮件分类程序基于预设关键词等规则。AI 编程:从数据中学习而非手动编写规则&am…

Mac电脑python多版本环境安装与切换

我当前是python3.9.6环境,需要使用3.9.8环境,通过brew安装3.9.8版本,然后通过pyenv切换环境 步骤 1: 安装 pyenv brew install pyenv brew install pyenv-virtualenv 步骤 2: 安装 Python 3.9.8(使用 pyenv 安装指定版本的 Pyth…

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中,控制材质的参数值和向量值

人工智能(AI)简史:推动新时代的科技力量

一、人工智能简介 人工智能(AI,Artificial Intelligence)是计算机科学的一个分支,旨在研究和开发可以模拟、扩展或增强人类智能的系统。它涉及多种技术和方法,包括机器学习、深度学习、自然语言处理(NLP&a…

Github优质项目推荐(第十期)

文章目录 Github优质项目推荐(第十期)一、【postiz-app】,14.6k stars - 您的终极 AI 社交媒体调度工具二、【lobe-chat】,50.1k stars - AI 聊天框架三、【cobalt】,22.1k stars - 媒体下载器四、【build-your-own-x】…

DeepSeek V3“报错家门”:我是ChatGPT

搜 :海讯无双Ai 要说这两天大模型圈的顶流话题,那绝对是非DeepSeek V3莫属了。 不过在网友们纷纷测试之际,有个bug也成了热议的焦点—— 只是少了一个问号,DeepSeek V3竟然称自己是ChatGPT。 甚至让它讲个笑话,生成…

通过 4 种方法将数据从 OnePlus 传输到Android

概括 由于它们是不同的品牌,因此将数据从 OnePlus 传输到Android是否很困难?也许您可以从这篇介绍 OnePlus 到Coolmuster Android数据传输的 4 个实用解决方案的文章中获得帮助。学习完它们后,您将有一个顺利的转移过程,所以为什…

Spring Boot的开发工具(DevTools)模块中的热更新特性导致的问题

问题: java.lang.ClassCastException: class cn.best.scholarflow.framework.system.domain.entity.SysUser cannot be cast to class cn.best.scholarflow.framework.system.domain.entity.SysUser (cn.best.scholarflow.framework.system.domain.…

频域滤波为什么使用psf2otf函数?

MATLAB中circshift函数是psf2otf函数的核心,在MATLAB中circshift函数的原理分析——psf2otf函数的核心直观解释了为什么需要循环移位。 MATLAB提出了psf2otf函数,先做循环移位,再计算离散傅里叶变换。如果有空域的卷积核,通过这个…

计算机网络-L2TP Over IPSec基础实验

一、概述 上次我们进行了标准L2TP的配置,但是在最后我们在进行业务流量访问时看到流量是没有进行加密的,这就导致可能得安全风险,所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec,然…

springboot3整合knife4j详细版,包会!(不带swagger2玩)

1. 引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version> </dependency>2. 配置文件 简短必要版 # 配置springd…

Mac 安装Mysql启动Mysql以及数据库的常规操作

Mac 安装Mysql启动Mysql以及数据库的常规操作 一、mysql的安装 1、登录官方网站:dev.mysql.com/downloads/mysql/ 二、查看系统架构 uname -m 在MAC中&#xff1a; 如果输出结果是 x86_64&#xff0c;则表示你的系统是 x86-64 架构。 如果输出结果是 arm64&#xff0c;则表示…

module ‘django.db.models‘ has no attribute ‘FieldDoesNotExist‘

module ‘django.db.models’ has no attribute ‘FieldDoesNotExist’ xadmin报错 原因 django与xadmin版本不匹配。 django==3.2.7 xadmin-django==3.0.2解决方案 在xadmin/view/edit.py的388行改为 from django.core import exceptions if self.request_method ==

马斯克X-AI发布了文生图模型Aurora,已经集成到聊天机器人Grok中。

千呼万唤&#xff0c;马斯克X-AI发布了文生图模型Aurora&#xff0c;并将其整合进了聊天机器人Grok中。Aurora不仅支持文本输入&#xff0c;还可从用户提供的图像中获取灵感&#xff0c;或直接编辑用户上传的图像。 Aurora 是一个自回归混合专家网络&#xff0c;经过训练可以从…

如何在IDEA一个窗口中导入多个项目

一般在IDEA窗口中想导入一个新项目&#xff0c;会提示我们在当前窗口还是新窗口。如果选新窗口&#xff0c;就会新打开一个窗口&#xff0c;此时新窗口里面只有新导入的项目。 而为了浏览起来更方便&#xff0c;需要实现在IDEA一个窗口中导入多个项目。具体步骤如下&#xff1…

Disruptor 有哪些典型的使用场景?

大家好&#xff0c;我是君哥。 Disruptor 是一款高性能的内存有界队列&#xff0c;它通过内存预分配、无锁并发、解决伪共享问题、使用 RingBuffer 取代阻塞队列等措施来大幅提升队列性能。 但开发者们往往对它的使用场景不太了解&#xff0c;到底应该在哪些场景使用呢&#…