详解UART、I2C、SPI常用通信协议(全是细节)

2023-10-30

前言

        UART、I2C和SPI是我们在嵌入式开发中比较常见的通信协议了,没有最好的通信协议,每个通信协议都有自己的优缺点。如果想要通信速度快,SPI 将是理想的选择;如果用户想要连接多个设备而不是过于复杂,I2C 将是理想的选择,因为它最多可以连接 127 个设备并且易于管理;UART的通信速度相对较慢,通信也比较简单,单对单。

        uart接口比较常用于主设备与蓝牙、wifi模块的通信、打印调试等。

        i2c接口多用于和传感器的通信,例如触摸屏、计步器、温度传感器、EEPROM等。

        spi接口多用于对速率要求高一些的场景,如spi flash、spi lcd屏、SD卡等。

1. UART通信

1.1 UART基本概念

UART(Universal Asynchronous Receiver/Transmitter):解释为通用异步接收传输,是一种串行、异步、全双工的通信协议。

UART 没有时钟线,使用两条数据线进行设备通信,每个设备上都有一个 RX 引脚和一个 TX 引脚(RX 用于接收,TX 用于传输), RX 引脚连接到另一个设备的 TX 引脚;

由于 UART 没有时钟线,因此添加了起始位和停止位以表示数据的开始和结束;

③ 两个通信设备间必须以大致相同的波特率(误差不超过10%)运行,否则就可能操作数据错乱;

④ 异步通信以一个字符为传输单位,通信中两个相邻字符之间的时间间隔是不固定,但同一字符中相邻两个位之间的时间间隔是固定的。

1.2 通信数据格式

空闲:空闲时总线为高电平,通常软件上把数据线配置为推挽、上拉;

起始位:主设备发送一个逻辑“0”信号表示传输字符的开始

数据位:数据位可以是5~9位组成的一个字符(通常为8位),从最低位开始传输

校验位:通常我们设置为无奇偶检验位;

                奇校验:如果数据位中“1”的个数为偶数,则校验位为“1”,为奇数,则校验位为‘0’;

                偶校验:如果数据位中“1”的个数为偶数,则校验位为“0”,为奇数,则校验位为“1”;

停止位:可以是 1 、1.5 位或 2 位的逻辑“1”电平,由于同一字符间相邻位的传输时间是固定的,每个设备uart都有自己的时钟,在通信中两个设备之间很可能会出现一点不同步,所以停止位不仅表示传输结束,还能提供纠正时钟的作用,停止位越多,数据传输越稳定,但数据传输速度越慢。

1.3  UART、USART区别

USART (通用同步/异步接收器/发送器)可以说和uart是包含关系,uart有的功能usart都有(异步功能模式),usart可以工作在异步和同步模式下。

        在同步模式下,有自己的时钟线,此时接收端不需要知道发送端的波特率,数据是以帧的形式传输的,传输速率比uart高。

        uart的协议结构很简单,而USART 更为复杂,可以生成与许多不同标准协议相对应的形式的数据,例如 IrDA、LIN、智能卡、RS-485 接口的驱动程序启用和 Modbus 等。

2.  I2C通信

2.1.  I2C基本概念

I2C(内部集成电路)接口有2条线,分别是SCL(串行时钟线)SDA(串行数据线)。SCL用作数据的同步传输,一般由主设备提供给从设备;另外,由于数据线只有一条;因此,它是个串行、同步、半双工的通信接口。

 I2C支持多主、多从;任何设备都可以同时作为主从,但同时只能有一个主控,一个I2C控制器可以支持挂多个I2C从机设备,其中每个从机的设备地址都是不一样的,以便I2C主控制器访问到该设备;

硬件I2C的SCL和SDA接口电路必须外接上拉电阻,空闲时,两条线都为高电平;

 起始、停止信号都是由主机端发出的,在起始信号产生后,总线就处于被占用的状态;在停止信号产生后,总线就处于空闲状态;

④ I2C总线以一个字节(8bit)为单位传输数据,每传输一个字节时,必须得到数据接收方的应答信号,数据都是从最高有效位开始传输,

 I2C的每次通信都是由主设备发起的,在这个过程中,发起端扮演了两个角色,当处于应答时段发起端扮演从端,其余时间都扮演主端;

 主设备每次发送数据和读写位时,都会等待从设备的响应信号ACK。

2.2  通信协议格式

空闲态:SCL和SDA线均为高电平,处于空闲状态;

起始信号:当SCL为高电平期间,SDA由高到低电平的跳变(启动信号是一种电平跳变时序信号,而不是一个电平信号);

地址位:由7位或者10位组成,主设备端发送从设备的设备地址;

读写位:逻辑“0”表示主向从写操作,逻辑“1”表示主向从读操作;

应答位:从设备通过将SDA线拉为低电平来表示ACK(有效应答)成功,SDA被拉高表示NACK(无效应答);

数据位:一个字节代表一个数据,SCL为高电平的时候读取SDA的有效数据,每字节数据后都需要接收从设备的应答,检测是否接收成功;

停止信号:当SCL为高电平期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

2.3  工作过程

在空闲状态的时候,主设备向从设备发送起始信号,告诉从设备将要开始i2c通信了;

发送完起始信号后,接着发送需要通信的从设备的设备地址,该i2c控制器下的每个从设备对比该设备地址,比对不正确的忽略此次通信,匹配成功的继续通信;

接着主设备发送读写位,主设备释放总线,并等待从设备的应答信号,发起端接收到应答信号后,从设备就会释放总线控制,总线控制权归还给发起端;

写操作:

        发送需要操作的从设备寄存器地址 + 写入寄存器的值;

读操作:

        相对写操作会复杂些,写入需要读的从设备寄存器地址,等待从设备的应答后,主设备重新向从设备发送起始信号 + 从设备地址 ,并将读写位设备为读,等待从设备应答,最后就会开始接收从设备发送过来的数据,直到停止信号发生。

2.4  传输模式

        除超快速模式外,其它都是可以向后兼容的,也就是说快速模式设备向后兼容,可以与 0 至 100 kbit/s I2C 总线系统的标准模式设备通信,然而,由于标准模式设备不向上兼容,它们不能在快速 I2C 总线系统中运行。

网图

2.5.  I2C死锁问题

死锁是什么意思呢?就是你在等我做某件事,而我又在等你做某件事,然后双方就互相等待,啥也不去做了,这就是死锁。

发生死锁的常见情况有两种

① 从设备回复ACK时主设备异常复位

② 从设备回复数据位为0时,主设备异常复位

两者的共同点就是SDA在主设备异常复位时,处于被从设备拉为低电平的状态,而SCL在主设备复位后处于空闲状态(高电平)。此时从设备会等待主设备拉低SCL取ACK或数据位,主设备会等待从设备释放SDA线。主设备和从设备互相等待,进入死锁状态。

解决死锁问题的可尝试方法:

  • 主设备检测到SDA拉低超过一段时间后,主动复位从设备并释放SDA线。这种方法的前提是从设备有复位引脚,MCU可以控制从设备的复位引脚对其进行复位。
  • 主设备检测到SDA拉低超过一段时间后,将9个时钟信号推入时钟总线(即接收应答信号),然后取出从设备的ACK位,使从设备释放SDA到高电平。
  • 在主设备和从设备之间串联一个 I2C 缓冲器,可以自动检测死锁情况。当检测到死锁时,会主动断开与主设备的连接,并向从设备发送9个时钟信号,从设备释放SDA线后,会重新与主设备建立连接。

I2C死锁问题无法从根本上避免。除了MCU异常复位导致I2C死锁外,正常通信过程中从设备也可能异常拉低SDA导致死锁。因此,软件应该设计成当死锁发生时能够从死锁中恢复,这样I2C通信才能继续进行。

3. SPI通信

3.1  SPI基本概念

SPI(Serial Peripheral Interface):串行外设接口,它是由摩托罗拉开发的一种串行同步全双工的通信协议,可以同时发送和接收数据,发送的数据先发到发送数据缓存区中,然后再到移位寄存器中按位传送,数据都是以字节为单位,高位优先发送。

① SPI 总线总共有 4 条线:   

  • MOSI :主设备数据输出,从设备数据输入;
  • MISO :主设备数据输入,从设备数据输出;
  • SCLK: 主设备产生的时钟信号;
  • CS/SS:(Chip select)由master设备控制,选择与哪个SPI从设备通信;通常设为低电平表示使能该从设备;

②  支持一主多从,一个主设备控制多个从设备,通常配置为每个从设备对应一条CS线,通过拉低CS信号,选择需要通信的从设备,如果同时将两个SS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码;

③ 在一个时钟周期内,SPI 设备会进行1 bit 数据的发送和接收,其实就是主从间数据交换的过程,在数据传输的过程中,接收到的数据必须在下一次数据传输之前被采样,如果之前接收到的数据没有被采样,那么之前的数据就会被覆盖掉,丢失。

④ 主、从设备必须工作在同一模式下。

3.2  四种工作模式

SPI通信时钟信号是由主设备产生的,其工作模式就涉及到时钟极性(CKP/CPOL)和时钟相位(CKE/CPHA)了,时钟极性和时钟相位共同决定SPI读取数据的模式;

时钟极性:设为“0”表示空闲状态时钟为低电平,

                  设为“1”表示空闲状态时钟为高电平;

时钟相位:设为"0"表示在时钟信号的第一个跳变沿采样,

                   设为"1"表示在时钟信号的第二个跳变沿采样;

要理解这四个工作模式,你必须要知道的一点就是,SPI通信传输过程其实就是主、从设备数据交换的一个过程,MOSI 和 MISO在一个时钟周期内都会进行数据位的发送和接收,如果不需要接收的数据,直接忽略就可以了,不做处理。

3.2.1  模式0 (CPOL = 0,CPHA = 0)

在空闲状态下,SCLK处于低电平,在第1个时钟边沿进行数据采样。SCLK由低电平到高电平的跳变进行数据采样(第一个跳变沿采样),采样完在下一个跳变沿发送数据。

 3.2.2 模式1 (CPOL = 0,CPHA = 1)

在空闲状态下,SCLK处于低电平,在第2个时钟边沿进行数据采样,第一个时钟沿进行发送数据。

 3.2.3 模式2 (CPOL = 1,CPHA = 0)

在空闲状态下,SCLK处于高电平,在第1个时钟边沿进行数据采样。SCLK由高电平到低电平的跳变进行数据采样(第一个跳变沿采样),采样完在下一个跳变沿发送数据。

 3.2.4 模式3 (CPOL = 1,CPHA = 1)

在空闲状态下,SCLK处于高电平,在第2个时钟边沿进行数据采样,第一个时钟沿进行发送数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解UART、I2C、SPI常用通信协议(全是细节) 的相关文章

  • 项目中没有 requirements.txt

    项目下创建一个文件 autoinstall py 复制下面的代码 在项目最开始加入import autoinstall 直接运行项目即可 import sys import os from importlib import import m
  • 《机器学习有意思! 01》- 世界上最简单的机器学习入门

    本文首发于https jizhi im blog post ml is fun 01 你是否也曾听人们谈起机器学习但是只有一个朦胧的概念 你是否厌倦了在同事的高谈阔论中颓然欲睡 此诚求变之机 本教程适合所有对机器学习感到好奇 却不知从何下手
  • js的垃圾回收机制

    js 垃圾回收机制 GC 1 GC garbage collection js具有 自动 垃圾回收机制 即执行环境会负责管理代码执行过程中使用的内存 2 GC会定期 周期性的 找出那些不再继续使用的变量 然后释放其内存 3 不再使用的变量即
  • MySQL之explain 的type列 & Extra列

    explain 可以分析 select 语句的执行 即 MySQL 的 执行计划 一 type 列 MySQL 在表里找到所需行的方式 包括 由左至右 由最差到最好 All index range ref eq ref const syst

随机推荐

  • QT 基础布局类总结

    文章目录 系列文章目录 前言 一 水平布局 二 垂直布局 三 网格布局 总结 前言 1 水平布局 垂直布局 网格布局均放置于QGroupBox中 2 继承QWidget类 在构造函数中调用setLayout 函数 即可完成布局 一 水平布局
  • 经典面试智力题200+题和解答

    招聘时期到了 总少不了需要准备智力题 考来考去大多是各种旧题 本来是考智力的事情 现在几乎已经变成了题海战术的考试 所以我们也不能在这一块落后 学习各种奇巧淫技 扩展一下思路 同时免得笔试面试吃亏 搜集了大量智力题 有些还挺有意思 顺便活跃
  • EnPass+WebDAV(一个跨平台密码管理解决方案)

    使用 EnPass密码管理软件 和 坚果云WebDAV 服务来搭建一个跨平台的密码管理方案 前言 相信很多人仍然处于 一个密码走天下 这一状态 但这种情况在当今互联网时代无异于裸奔 各种服务器漏洞造成的密码泄露 还有 撞库 等连锁反应 所以
  • 如何巧妙拒绝别人,搭配Online有小妙招

    相信很多人都会有拒绝别人的烦恼 一旦开口拒绝 难免会得罪人 如果答应下来 自己又无力帮助 这时往往存在矛盾冲突关系 那么如何解决这个问题呢 搭配Online提醒您要注意巧妙拒绝方面的技巧啦 1 耐心倾听对方的请求 即使心里清楚自己最后要拒绝
  • 新榜

    在过去的一个月中 淄博烧烤的相关话题霸屏网络 这些媒介话题里承载了多少受众的向往与想象 根据2022年淄博市文旅局公开年报 去年 淄博官方就着力融媒体 在抖音 快手等平台创新使用 淄博到底有多牛 主题形式 通过视频内容和文案策划 长效推广淄
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 区块链的数据是存储在链上,还是在数据库中?(答案是这个问题并不成立,来一起了解一下吧)

    很多人都想了解区块链的数据到底什么时候是存储在链上 什么时候又储存在相应节点的数据库中间呢 今天我们就来解决这个有趣的问题 首先我们必须了解清楚两个概念 区块链数据 链上数据 首先 区块链数据包括区块数据和状态数据两者 区块数据描述的实际是
  • hive分区表详细介绍

    一 什么是分区表以及作用 数据分区的概念以及存在很久了 通常使用分区来水平分散压力 将数据从物理上移到和使用最频繁的用户更近的地方 以及实现其目的 hive中有分区表的概念 我们可以看到分区具重要性能优势 而且分区表还可以将数据以一种符合逻
  • Datalore安装使用教程

    发现一个jetbrain出的好东西 使用体验完爆jupyter notebook以及jupyter lab的软件 就是安装有点复杂 官网写得有点不清楚 这里简单介绍一下 首先他只能在linux运行 其他环境暂时不支持 首先 去https w
  • react简要分析

    一 简介 前段时间看到一个用33行代码就实现了一个非常基本的react代码 感觉还是蛮有趣的 代码如下 其主要实现了两大功能 生成虚拟DOM 根据虚拟DOM渲染出真实的DOM 无注释版 https github com leontrolsk
  • linux下查看物理CPU个数、核数、逻辑CPU个数

    cat proc cpuinfo中的信息 processor 逻辑处理器的id physical id 物理封装的处理器的id core id 每个核心的id cpu cores 位于相同物理封装的处理器中的内核数量 siblings 位于
  • 消息队列中间件 - 详解RabbitMQ6种模式

    RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式 简单模式 工作模式 订阅模式 路由模式 主题模式 RPC模式 进行场景和参数进行讲解 PHP代码作为实例 安装 客户端实现 添加扩展 执行composer phar inst
  • 《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

    1 以太网 1 1 介绍 以太网是现实世界中最普遍的一种计算机网络 以太网有两类 第一类是经典以太网 第二类是交换式以太网 使用了一种称为交换机的设备连接不同的计算机 经典以太网 是以太网的原始形式 运行速度从 3 10 Mbps 不等 交
  • 51单片机实战 1 --四个独立按键控制四位数码管

    本文基于普中51开发板 在其例程代码稍加改动而成的 单片机的入门小项目也很益智 启动单片机 四位数码管显示0000 按下s1并松开 显示1000 再按下s1并松开显示2000 连续10次按下并松开s2 数码管显示2100 2200 2300
  • WSL安装图形界面

    效果如下 1 下载并安装VcXsrv 链接如下 https sourceforge net projects vcxsrv 下载完安装一路next即可 或者自行选择安装路径 2 安装桌面环境 安装xfce4 terminalsudo apt
  • mysql的锁

    锁 锁机制用于管理对共享资源的并发访问 用来实现事务的隔离级别 锁类型 共享锁和排他锁都是行级锁 MySQL当中事务采用的是粒度锁 针对表 B 树 页 B 树叶子 节点 行 B 树叶子节点当中某一段记录行 三种粒度加锁 共享锁 S 可理解为
  • Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

    目录 前言 1 添加特有属性 方法 示例1 添加特有属性 示例2 添加特有方法 2 私有属性 方法 1 私有化示例 2 私有化属性 方法可以在类的内部使用 3 强制访问私有化属性 方法 4 property装饰器去操作私有属性 方法 总结
  • 【测试入门】测试用例经典设计方法 —— 因果图法

    01 因果图设计测试用例的步骤 1 分析需求 阅读需求文档 如果User Case很复杂 尽量将它分解成若干个简单的部分 这样做的好处是 不必在一次处理过程中考虑所有的原因 没有固定的流程说明究竟分解到何种程度才算简单 需要测试人员根据自己
  • 【LeetCode-面试经典150题-day24】

    目录 35 搜索插入位置 74 搜索二维矩阵 162 寻找峰值 33 搜索旋转排序数组 35 搜索插入位置 题意 给定一个排序数组和一个目标值 在数组中找到目标值 并返回其索引 如果目标值不存在于数组中 返回它将会被按顺序插入的位置 请必须
  • 详解UART、I2C、SPI常用通信协议(全是细节)

    前言 UART I2C和SPI是我们在嵌入式开发中比较常见的通信协议了 没有最好的通信协议 每个通信协议都有自己的优缺点 如果想要通信速度快 SPI 将是理想的选择 如果用户想要连接多个设备而不是过于复杂 I2C 将是理想的选择 因为它最多