【单片机通讯协议】—— 常用的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没有
相关文章:

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART(串口通讯)2.1 简介2.2 时序图分析2.3 UART的…...

Vue3 核心语法
1. OptionsAPI 与 CompositionAPI Vue2 的API设计是 Options(配置)风格的。Vue3 的API设计是 Composition(组合)风格的。 1.1 Options API 的弊端 Options类型的 API,数据、方法、计算属性等,是分散在&a…...

LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战
🤩LLaMA-Factory GLM LoRA 微调 安装llama-factory包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git进入下载好的llama-factory,安装依赖包 cd LLaMA-Factory pip install -e ".[torch,metrics]" #上面这步操作会完成…...

GTM023 W.H.Greub线性代数经典教材:Linear Algebra
这本教材是我高中时期入门线性代数的主要教材,我的很多基础知识都来源于这本书,如今看回这本书可以说满满的回忆。这本书可以说,是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化,没有什么直观可言&a…...
交换机与路由器的区别
交换机和路由器是网络中的两种关键设备,它们各自承担不同的功能,主要区别体现在以下几个方面: 一、工作层次与功能 交换机: 工作层次:交换机主要工作在OSI模型的第二层,即数据链路层。 功能:交…...

springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
牙科诊所管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定牙科诊所管理系统的…...

soular使用教程
用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…...

纯div+css+js弹出窗
目的:实现弹出窗、仅关闭弹窗之后才能操作。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…...

一篇文章学会HTML
目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...

QGIS二次开发(插件开发)
实习二 QGIS插件开发 2.1 任务要求 a)用C语言编写qgis插件,实现带有x/y坐标的文本文件的地图显示。 用文件流fstream操作文本文件,读取其中的坐标数据。基于QgsPlugin相关类派生出一个插件,并加到插件工厂中。基于QgsVectorLaye…...
Web防火墙和下一代防火墙的区别
介绍 客户经常询问“当我已经拥有下一代防火墙(NGFW)时,为什么需要Web应用程序防火墙(WAF)?”。本博文的目的是解释两种解决方案之间的区别,重点关注Web应用程序防火墙可以提供的附加值。 什么…...
Linux:alias别名永久有效
一、背景 日常使用bash时候,有些常用的命令参数的组合命令太长,很难记,此时可以利用Linux提供的alias命令生成命令的别名(命令的隐射),但是我们会发现,当退出了终端后重新登录就失效了ÿ…...

【递归与回溯深度解析:经典题解精讲(中篇)】—— LeetCode
文章目录 组合目标和组合总和字母大小写全排序优美的排列N皇后 组合 思路:回溯算法 问题要求从 1 到 n 中选出 k 个数的所有组合。 使用回溯算法递归构造解。 每次递归时,记录当前的组合路径,当组合长度达到 k 时,将其加入结果集…...

01.HTTPS的实现原理-HTTPS的概念
01.HTTPS的实现原理-HTTPS的概念 简介1. HTTPS的概念和安全性2. HTTPS的实现原理3. HTTPS和HTTP的区别4. OSI七层协议模型5. SSL和TLS的区别 简介 该系列文章主要讲述了HTTPS协议与HTTP协议的区别,以及HTTPS如何实现安全传输。内容分为三部分:HTTPS的实…...

一文详解MacOS+CLion——构建libtorch机器学习开发环境
对于希望在本地环境中进行深度学习开发的开发者来说,配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上,利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch,快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…...
【LeetCode 面试经典150题】详细题解之哈希表篇
【LeetCode 面试经典150题】详细题解之哈希表篇 1 哈希表的基础1.1 基础概念及实现1.2.1 哈希表的工作原理1.2.2 705.设计哈希集合1.2.3 706.设计哈希映射 1.2 HashMap相关1.2.1 基本操作1.2.2 遍历 1.3 Hashtable1.4 LinkedHashMap1.5 HashSet**1.5.1基本特性**1.5.2 基本方法…...

linux socket编程之udp_dict_serve服务端--引入配置文件
注意:本篇博客只是对上一篇博客功能的增加 1.创建配置文件(翻译) Dict.txt apple: 苹果 banana: 香蕉 cat: 猫 dog: 狗 book: 书 pen: 笔 happy: 快乐的 sad: 悲伤的 run: 跑 jump: 跳 teacher: 老师 student: 学生 car: 汽车 bus: 公交车 love: 爱 hate: 恨 hell…...
selenium学习笔记(二)
文章目录 前言设计模式POMPOM概念POM优势POM设计原则POM的实现 selenium的常用操作处理动态元素截图操作勾选复选框多层框架/窗口定位操作下拉框上传文件操作处理弹窗切换窗口拖拽操作 如何处理浏览器驱动更新导致的问题selenium与网站监控监听网页内容变化监控网络请求 seleni…...

宏集eX710物联网工控屏在石油开采机械中的应用与优势
案例概况 客户:天津某石油机械公司 应用产品:宏集eX710物联网工控屏 应用场景:钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂,涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…...
linux——vi命令常用操作
一、vi模式 vi一般分为三种模式,分别是命令行模式、插入模式、末行模式 1.命令模式:控制屏幕光标的移动,按 :进入末行模式,按 i(其他插入命令也可) 进入插入模式; 2.插入模式&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...