UART、IIC、SPI、CAN通信的区别与应用

2023-05-16

文章目录

  • 1、通信的基本知识
    • 1.1、数据通信的种类
      • 1.1.1、串行通信
      • 1.1.2、并行通信
      • 1.1.3、总结
    • 1.2、数据通信的传输方向
      • 1.2.1、单工
      • 1.2.2、半双工
      • 1.2.3、全双工
      • 1.2.4、总结
    • 1.3、数据通信的方式
      • 1.3.1、同步通信
      • 1.3.2、异步通信
      • 1.3.3、同步与异步的区别
    • 1.4、通信基本知识的总结
  • 2、UART通信详解
    • 2.1、描述
    • 2.2、应用范围
    • 2.3、优缺点
    • 2.4、硬件连接
    • 2.5、通信格式
    • 2.6、波特率
    • 2.7、拓展
  • 3、IIC通信详解
    • 3.1、描述
    • 3.2、应用范围
    • 3.3、优缺点
    • 3.4、硬件连接
    • 3.5、通信格式
    • 3.6、IIC三种速率
    • 3.7、寻址
  • 4、SPI通信
    • 4.1、描述
    • 4.2、应用范围
    • 4.3、优缺点
    • 4.4、硬件连接
    • 4.5、总线模式
    • 4.6、通讯协议
  • 5、三种通信方式的总结
  • 6、未完待续

1、通信的基本知识

1.1、数据通信的种类

数据通信基本方式可以分为串行通信与并行通信两种

1.1.1、串行通信

(1)定义:串行通信是指利用一条传输线将数据一位位地顺序传送。

(2)传输方式:传输一个字节(8个位)的数据时,串口是将8个位排好队,逐个地在1条连接线上传输。

(3)特点:通信线路简单,成本较低,适用于远距离通信,但传输速度慢

(4)实例:uart、iic、spi、usb总线等

1.1.2、并行通信

(1)定义:并行通信是指利用多条传输线将一个数据的各位同时传送。

(2)传输方式:传输一个字节(8个位)的数据时,并口是将8个位一字排开,分别在8条连接线上同时传输。

(3)特点:传输速度快,适用于短距离通信

1.1.3、总结

请添加图片描述

随着技术的发展,时钟频率越来越高,平行导线之间的相互干扰也越来越严重。因为串口的线很少,所以线之间的干扰很容易控制。相反,可以通过不断提高时钟频率来提高传输速率,所以现在很多高速器件都采用串行通信

1.2、数据通信的传输方向

数据的传输模式一共有三种:单工、半双工、全双工

1.2.1、单工

(1)特点:任何时刻两个设备都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备。只有一条数据通道,例如广播电台和收音机

(2)优缺点

​ 优点:可以利用通信信道的整个带宽,所以一次性可以传输更多的数据

​ 缺点:通信是单向的,设备之间没有相互通信,效率低

1.2.2、半双工

(1)特点:允许二台设备双向通信,但不能同时进行。必须等待一端的数据传输完成后才能开始另一端的数据传输。只有一条数据通道, 就像对讲机通话一样,需要等对面讲完以后才能开始这端的讲话

(2)优缺点

​ 优点:半双工在同一时刻也是占用整条带宽,所以每次也能传输很多数据

​ 缺点:通信一方在传输数据,另一方只能等待接收数据,存在一点时延

1.2.3、全双工

(1)特点:两个设备之间可以同时收发数据。通道分为两部分,一部分用于发送数据,另一部分用于接收数据。一般的电话、手机就是全双工的系统,因为在讲话时同时也可以听到对方的声音。

(2)优缺点

​ 优点:通信双方可以同时发送和接收数据,效率很高

​ 缺点:假如设备之间不存在专用路径,那么信道容量就会减少一半

1.2.4、总结

请添加图片描述

1.3、数据通信的方式

通讯的数据同步方式,又分为同步和异步两种。可以根据通讯过程中是否有使用到时钟信号进行简单的区分。简单来说就是发送和接收按照同一个时钟周期工作就叫同步,发送和接收没有按照统一的时钟工作就叫异步。

1.3.1、同步通信

(1)描述:

在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样

(2)优缺点

同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小

(3)应用范围

通信网中,有大批量数据需要传输
请添加图片描述

1.3.2、异步通信

(1)描述:

在异步通讯中,不使用时钟信号进行数据同步,异步通信在发送字符时,所发送的字符之间的时间间隔可以是任意的。当然,接收端必须时刻做好接收的准备,发送端可以在任意时刻开始发送字符。但是因此必须在每一个字符中加入起始位、奇偶校验位、停止位等。某些通讯中还需要双方约定数据的传输速率,以便更好地同步 。波特率(bps)是衡量数据传送速率的指标。

(2)优缺点

异步通信的好处是通信设备简单、便宜,但传输效率较低(因为开始位和停止位的开销所占比例较大)

(3)应用范围

应用于在工业、实际应用中。适用于短距离、速率不高的情况下

请添加图片描述

1.3.3、同步与异步的区别

(1)时钟频率:同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求,发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

(2)同步通信效率高;异步通信效率较低

(3)同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。

(4)同步通信可用于点对多点;异步通信只适用于点对点。

(5)同步是阻塞模式,等接收方发回响应以后才发下一个数据包;异步是非阻塞模式,不等接收方发回响应,接着发送下个数据包的通讯方式

(6)其中SPI和IIC为同步通信;UART为异步通信

1.4、通信基本知识的总结

请添加图片描述请添加图片描述

说完通信的基本知识,让我们再来看一下,Uart、IIC、SPI、CAN通信等

2、UART通信详解

2.1、描述

UART:(Universal Asynchronous Receiver Transmitter)通用异步收发器,一般由波特率产生器、UART接收器、UART发送器组组成,三根线

uart是一种通用可全双工、异步、串行通信方式,不需要严格的时间限制

2.2、应用范围

常用于控制计算机与串行设备的芯片、Debug打印调试

2.3、优缺点

与SPI、IIC相比速度较慢,比较复杂,只能与一个设备进行连接通信

2.4、硬件连接

至少需要三根线相连:发送线TX、接收线RX、底线GND

2.5、通信格式

包含起始位、数据位、奇偶检验位、停止位

(1)起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

(2)数据位:数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。

(3)奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

(4)停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

请添加图片描述

2.6、波特率

数据传输的速率。在数据传输和接收双方,需要预先统一波特率,以便正确的传输数据。有以下几个档位:300、600、1200、2400、4800、9600、19200、38400、56000、57600、115200、128000,也可以自定义

2.7、拓展

UART是一个大家族,其包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范。它们的主要区别在于其各自的电平范围不相同。

UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间),所以RS232/485就是代表一种电平标准,只是与TTL不同的一种电平。

3、IIC通信详解

3.1、描述

IIC也可以写做I2C,全称是Inter IC bus,IIC只有一根数据线和有一根SDA,即属于半双工、同步、串口通信方式;即能发送接收数据,但不能同时进行。

具有多主控接口标准,速率不快,具有总线仲裁机制,非常适合器件间近距离经常性数据通信,可实现设备组网。

3.2、应用范围

这些功能比较多而且速率要求不高的场合,MEMS的姿态传感器(陀螺仪,加速度计,磁强计)、一些加密芯片、E2PROM、时钟芯片、触摸芯片等

3.3、优缺点

I2C的速度比SPI速度慢,协议比SPI复杂,但是连线比标准的SPI要少,用地址选择从机

3.4、硬件连接

IIC总线有两线

时钟线SCL,由master提供

数据线SDA

3.5、通信格式

(1)空闲状态:I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态

(2)IIC中的信号有2种:起始信号、停止信号

​ 起始信号:SCL保持高电平期间,SDA的电平被拉低,称为I2C总线总线的起始信号

​ 停止信号:SCL保持高电平期间,SDA被释放,返回高电平,称为I2C总线的停止信号

(3)写操作,首先发送起始位,然后依次发送控制字节、地址字节、数据字节,每发送完一个字节后,需要一个应答信号ACK,最后发送停止位。
请添加图片描述
请添加图片描述

(4)读操作:在读之前,主机需先发送地址字节给从机完成地址字节的设置(此过程是写操作,读写标志为0),地址字节发送完成后接收应答信号ACK,随后主机产生起始信号,随后发送控制字节(此过程是读操作,读写标志为1),然后从机响应应答信号,并发送8位数据字节,最后主机发送非应答信号NACK,发送停止位。读操作将从设置的地址开始读取,读取数据完成后,内部地址计数器自增1,指向下一个地址单元。
请添加图片描述

(4) SCL 的高电平期间,SDA上的电平必须保持稳定,只有在SCL为低电平期间,才允许 SDA上的电平改变状态。

为什么SDA在SCL低电平期间才允许改变状态?
因为当SCL处于高电平状态时,SDA拉低表示的是起始位,拉高表示的是停止位,所以当数据位中0和1出现时,如果在SCL高电平状态下SDA状态变化的话,就无法区分数据和起始、停止位。

3.6、IIC三种速率

(1)低速模式 100 kb/s

(2)快速模式 400 kb/s

(3)高速模式 3.4M/s

3.7、寻址

IIC总线是主从设备,从机地址位数为7位。一个主机在总线上最多可以挂127个从机(7位地址最多128,去除0x0广播地址,还剩127),设备间通过不同的设备地址来区分

请添加图片描述

4、SPI通信

4.1、描述

SPI是一种可全双工,同步、串口通信总线,可实现多个SPI设备互联,硬件4条线,无应答,无校验

4.2、应用范围

EEPROM,FLASH,实时时钟,AD转换器,数字信号处理

4.3、优缺点

(1)SPI没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。

(2)比I2C总线要快,速度可达到几Mbps,用GPIO拉低CS(片选)选择从机

4.4、硬件连接

SPI硬件上有四根线

(1)MISO:主设备数据输入,从设备数据输出

(2)MOSI:主设备数据输出,从设备数据输入

(3)SCLK:时钟信号。主设备产生

(4)SS/CS:从设备片选信号,主设备控制

(5)SDI:serial data input

(6)SDO:serial data output

这里有些人会把SDI /SDO 和 MOSI /MISO 弄混
看芯片,如果标的是SDI/SDO,则是固定了输入输出脚。
当做主机(master)时,SDI就是MISO,SDO就是MOSI。
当做从机(slave)时,SDI就是MOSI,SDO就是MISO。
请添加图片描述

4.5、总线模式

请添加图片描述

时钟、数据脚都并接,主机通过CS脚来控制不同的设备使能

4.6、通讯协议

参考下面的链接

5、三种通信方式的总结

做了一张对比表格更好看出三种方式的异同有哪些,如下图:

请添加图片描述

6、未完待续

参考连接:https://blog.csdn.net/Rocher_22/article/details/116590629
https://blog.csdn.net/u010783226/article/details/118603326
https://blog.csdn.net/weixin_45137708/article/details/127438869
https://blog.csdn.net/tao475824827/article/details/106800859
https://blog.csdn.net/oDuanYanGuHong/article/details/128494532

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

UART、IIC、SPI、CAN通信的区别与应用 的相关文章

  • 一文读懂CAN总线及通信协议

    CAN总线的汽车 CAN概念 CAN是控制器域网 Controller Area Network CAN 的简称 是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的 并最终成为国际标准 ISO11898 是ISO国际标准化的串行通信
  • STMCubeMX5.10版本CAN使用loopback模式自测

    使用芯片 STM32F103C8T6 cube软件版本 5 10 软件包版本为 STM32Cube FW F1 V1 7 0 一 配置时钟为使用外部晶振 并配置为72M 二 使能 can 并配置参数 设置can波特率为500k 并设置为lo
  • CAN2.0和J1939协议的关系

    转发自http www cankau cn support help can vs j1939 html 很长时间没搞明白j1939与CAN2 0的关系 这篇文章让我明白了 CAN2 0是一种总线规范 是数据链路层的技术 J1939是SAE
  • MicroPython串口数据转换技巧

    技巧一 还原从串口接收的HEX字符串 首先上官方文档 确认接收数据类型为bytes 串口读来的bytes类型HEX数据转换成HEX类型字符串转换函数 ByteToHex的转换 返回数据16进制字符串 def ByteToHex bins r
  • FPGA驱动0.96oled显示屏 (4线 SPI) verilog语言

    之前也陆陆续续看了很多博客 也都能在自己的屏幕上显示出来 但是问题就是不知道怎么修改代码显示自己希望显示的东西 而且由于没注释原因看不太懂 最终的实现效果最终实现效果视频 b站视频链接1 评论区有人给了源码的百度网盘链接 csdn博客链接1
  • I2C走线技巧、及上拉电阻、电源电压、总线电容三者间的函数关系

    目录 I2C总线PCB布线注意事项 博客其他文档可以学习 https www cnblogs com zhiqiang zhang I2C总线线路的走线方式 I2C器件与I2C总线的接线方式 I2C总线连接规范 I2C总线中上拉电阻 电源电
  • micropython-SPI通讯

    micropython SPI通讯 1 什么是SPI 2 SPI通讯原理 3 Micropython中的SPI 4 ZTMR测试SPI 1 ZTMR中SPI引脚 2 ZTMRSPI自测 2 SPI 2板之间通讯测试 1 什么是SPI SPI
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • spi,ClassLoader,双亲委托模式

    转载 https www cnblogs com hiyujie p wo xueJava1ClassLoader yu shuang qin wei tuo mo sh html 1 ClassLoader分类 Java虚拟机会创建三类C
  • STM32 CAN通信的学习笔记总结(从小白开始)

    知识来源于互联网 回馈于互联网 目录 1 总体概述 1 1 基本概念 1 2 通讯方式 1 3 为什么使用CAN 1 4 CAN的协议及组成 2 上帝视角看CAN的通讯过程 2 1 数据传输原理实现 2 2 通信的整个过程 2 2 1 空闲
  • Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

    在Linux系统中 SPI 的用户模式设备接口的驱动源码位于 drivers spi spidev c 在应用层生成 dev spidev 的节点 可以通过 read write 达到与硬件设备的 SPI 通信 下面介绍spidev驱动移植
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • Linux,spidev:为什么它不应该直接在设备树中?

    我想定义一个具有用户模式访问权限的 SPI 设备 如中所述http linux sunxi org SPIdev 按照这些示例 我在设备树中添加了以下内容 ecspi1 other stuff mydev 0 compatible spid
  • 谁在驱动程序代码中调用“probe”函数?

    我试图理解thisomap2 panda 板的 mcspi 驱动程序代码 我不明白谁打电话probe函数以及调用链是什么this驱动代码 设备连接时如何通知驱动程序 探针函数由spi omap2 mcspi c保存在static struc
  • UART ISR Tx Rx 架构

    我让事情变得复杂了吗 我正在构建我的代码 以便通过 UART 从 8051 micro 与外围设备进行通信 外设响应主机的命令 一次只能响应一个命令 这是一个简单的发送和接收协议 tx1 rx1 tx2 rx2 tx3 rx3 每个 TX
  • 功放诊断测试

    1 切换trace显示时间模式 Toggle time mode 2 测seedkey 需要加载seednkey dll 3 功能寻址和物理寻址切换
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data
  • 嵌入式Linux中UART上的9位协议

    我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议 目前我正在 am335x evm 板上对此进行测试 我计划使用坚持平价来做到这一点 理想情况下 我希望不需要实际修改 omap serial c 驱动程序的任何代码 9

随机推荐

  • Java Agent

    在 Java 字节码 一文中有提到 xff0c 使用 Java Agent 操控字节码 xff0c 本文将讨论 Java Agent xff0c 这是普通 Java 开发人员的真正的黑魔法 Java Agent 能够通过执行字节码的直接修改
  • 通过gitlab远程统计git代码量

    git的代码量大多数都是根据命令行统计 xff0c 或者根据第三方插件统计 但是都不满足我的需求 xff0c 因为我们代码都由gitlab管理 xff0c 于是想到了通过gitlab暴露出来的接口获取数据 第一步 xff0c 生成私钥 登录
  • Qt第二十二章:将控件放到另一个控件的后面或前面

    话不多说 xff1a 看图
  • 缓存行填充与@sun.misc.Contended注解

    1 缓存模型 CPU和主内存之间有好几层缓存 xff0c 因为与cpu的速度相比 xff0c 访问主内存的速度是非常慢的 如果频繁对同一个数据做运算 xff0c 每次都从内存中加载 xff0c 运算完之后再写回到主内存中 xff0c 将会严
  • ThreadLocal那点事

    目录 1 ThreadLocal原理 2 ThreadLocal内存泄漏 3 ThreadLocal最佳实践 4 FastThreadLocal原理 5 FastThreadLocal最佳实践 6 ThreadLocal与FastThrea
  • 关于雪花算法的设计与思考

    2017年的时候项目组在开发一款大区游戏 xff0c 由于之前demo阶段的玩家id都是单服生成的 xff0c 只能保证单进程中的唯一 xff0c 而无法保证在分布式服务器端的唯一性 随着项目的开发进展 xff0c 需要设计能保证在分布式的
  • java反射之Method的invoke方法实现

    在框架中经常会会用到method invoke 方法 xff0c 用来执行某个的对象的目标方法 以前写代码用到反射时 xff0c 总是获取先获取Method xff0c 然后传入对应的Class实例对象执行方法 然而前段时间研究invoke
  • A*寻路算法之解决路径多拐点问题

    1 问题描述 最近公司正在开发的游戏涉及到了寻路算法 xff0c 然后我从网上找了一份A 算法代码 xff0c 整理了一下写了一个A 算法基础实现 然而 xff0c 在真正实用时A 寻路时 xff0c 却发现了几个问题 xff1a 基础实现
  • 代理模式与委托模式的异同点

    在 设计模式之禅 xff08 第二版 xff09 中 xff0c 作者说 代理模式也叫做委托模式 xff0c 显然是认为代理模式和委托模式是毫无差别的 然而在实际开发中 xff0c 我们通常可以很明确的知道一个模式究竟是代理模式还是委托模式
  • TCP/IP编程之select函数详解

    前述 xff1a linux下的I O复用模型目前很多都已经不用select函数了 xff0c 而是用epoll xff0c 但是为什么还需要了解select编程呢 xff0c 其实是从两个方面考虑的 xff1a 一是为了通过select去
  • 堆栈的详细解释

    一 在c中分为这几个存储区 1 栈 由编译器自动分配释放 2 堆 一般由程序员分配释放 xff0c 若程序员不释放 xff0c 程序结束时可能由OS回收 3 全局区 xff08 静态区 xff09 xff0c 全局变量和静态变量的存储是放在
  • Gmapping、hector、Cartographer三种激光SLAM算法简单对比

    文章目录 一 Gmapping是基于粒子滤波的算法 二 Hector SLAM三 Cartographer 一 Gmapping是基于粒子滤波的算法 缺点 xff1a 严重依赖里程计 xff0c 无法适应无人机及地面不平坦的区域 xff0c
  • TCP连接建立过程

    TCP连接建立过程 浏览器访问网站 xff0c 通过域名解析找到ip地址后会与服务器端建立连接 其中TCP xff08 Transmission Control Protocol xff0c 传输控制协议 xff09 是一种面向连接的 可靠
  • 海康威视错误代码文档大全【完整版】

    简介 本文收录了海康各大设备错误码 xff0c 按ctrl 43 f查询 xff1b 包含网络通讯库错误码 阵列错误码 安全激活相关错误码 智能设备错误码 RTSP通讯库错误码 软解码库错误码 转封装库错误码 语音对讲库错误码 Qos流控库
  • lighttpd http响应报文(Response)增加安全头Referrer-Policy和X-Permitted-Cross-Domain-Policies方法

    X Permitted Cross Domain Policies和Referrer Policy说明 X Permitted Cross Domain Policies X Permitted Cross Domain Policies
  • ROS使用ARUCO识别二维码获取位置信息做定位使用

    使用ARUCO识别二维码获取位置信息 1 安装软件 cd catkin ws src git clone b kinetic devel https github com pal robotics aruco ros cd catkin m
  • Keil 编译时无法找到头文件解决

    Keil 编译时无法找到头文件解决方法 1 背景 Keil 编译的时候无法找到头文件 xff0c 搜了下相关问题及解决方法 xff0c 有介绍说是因为文件夹中有数字 xff0c 无法搜到头文件 xff0c 进行了更改 xff0c 还是找不到
  • 学习open62541 --- [71] Alarm and Condition

    本文讲述Alarm and Condition的用法 xff0c 主要以源码里提供的例子为基础进行讲解和演示 xff0c 即tutorial server alarms conditions c xff0c 该例子写的有点乱 xff0c 本
  • 学习open62541 ---[68] 使用Wireshark观察通信消息

    Wireshark是强大的网络协议分析工具 xff0c 而open62541也是基于socket的 xff0c 所以也可以用其来观察OPCUA通信消息 一 安装Wireshark 去https www wireshark org 去下载并安
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同