UART、RS232、RS485、I2C和SPI的介绍

2023-05-16

基本知识

  • 串行通信:多个数据通过一条数据线,依次传输
  • 并行通信:多个数据通过多条数据线,一次性传输
  • 单工通信:只能接收数据或者发送数据(遥控器、收音机)
  • 半双工通信:在同一时刻,只能接收数据或者发送数据(对讲机)
  • 全双工通信:在同一时刻,既可以接收数据,也可以发送数据(电话)
  • 波特率:用于描述通信时的通信速度,其单位是 bps(bit per second),即每秒钟传送 bit 的数量

UART

UART(Universal Asynchronous Receiver Transmitter),即通用异步收发器。

  • 特点:
    1、有两根数据线(RXDTXD
    2、串行、异步通信
    3、全双工通信
    4、点对点通信:接收端和发送端(两个设备)

  • 应用:在嵌入式系统中,常用于主机和辅助设备之间的通信

  • 时序图
    在这里插入图片描述
    一次完整的数据传输包括:起始位、数据位、校验位(可有可无)和停止位
    传输数据的时候,高电平(置1)表示空闲
    起始位: 置低电平(0),表示通信的开始
    数据位: 起始位后开始通信,传输数据,先传送数据低位,再传送数据高位(数据位可以发送5-8位,一般发送8位数据(即一个字节))
    校验位:(可有可无) 验证数据是否发送正确,只能检查错误,不能修正,加上后,通信速度变慢
    停止位: 置高电平(置1),表示一次通信的结束(占用1位、1.5位或者2位)

  • UART每次通信只能发送一个字节,不能够累计发送(避免累计误差);若要发送多个字节数据,需要先发送一个字节,然后结束通信,再开始通信,发送下一个字节

  • 因为是异步通信,没有时钟线,所以通过波特率来区分 01还是0011

  • 硬件连接图
    在这里插入图片描述

  • 一般情况下,SOC会集成 UART控制器,在使用UART进行通信的时候只需要对其内部的相关寄存器进行设置,即可完成通信

USART

USART是通用同步/异步收发器(带同步时钟线 USART_CK),只是一种协议方式,根据不同电平方式分为 RS232协议和RS485协议。

UART串口通信存在的问题:
1、电气接口不统一
2、抗干扰能力差:UART 直接使用 TTL信号表示 01,但 TTL信号的抗干扰能力很差,传输过程中很容易出错
3、通信距离短:因为 TTL信号的抗干扰能力较差,所以其通信距离也很短。一般只用于一个电路板上两个不同芯片之间的通信(板载间通信)

RS232协议:(点对点通信)
1、基于串口,所以时序图和 UART串口一致
2、在电气层上做了一些改变,统一电气接口(定义了一个标准的连接器,标准中对连接器的每个引脚的作用加以规定,还对信号的电平加以规定)
3、抗干扰能力变强,通信距离变长(一般可达15米)
4、电气接口为 DB-9,一般使用 RXDTXDGND这三条线
5、规定逻辑为 1的电平为 -5V到-15V;规定逻辑为 0 的电平为 +5V到+15V

硬件连接:
在这里插入图片描述

RS232协议存在的问题:
1、接口的信号电平值较高,易损坏接口电路的芯片
2、与 TTL电平不兼容,需要电平转换芯片才能与 TTL电路连接
3、通信速度低
4、易产生共模干扰,抗噪声干扰性弱
5、通信距离15米,还是较短

RS485协议
特点:(半双工通信)
1、采用差分信号进行数据传输(双绞线),使用两线间电压差为 +2V到+6V表示逻辑0;两线间电压差为 -2V到-6V表示逻辑1,从而实现了远距离通信(1500米);且在电子噪声较大的环境下,能够有效传输信号
2、允许连接多个收发器,具有多站能力,也就是可以建立一个设备网络
3、RS485接口信号的电平比RS232降低了,所以不易损坏接口电路的芯片

硬件连接图(设备网络,RS485总线上挂载多个设备,主从机制参考 I2C总线)
120Ω电阻用来消除信号线上的共模干扰
在这里插入图片描述

I2C

I2C总线是一种串行、同步、半双工通信的多主机通信总线,有两根数据线:SDA(数据线)、SCL(时钟线);硬件结构简单,成本较低
应用: 同一块电路上的不同芯片之间进行通信
特点:
1、I2C总线是一种多主机总线,连接在 I2C总线上的器件分为主机和从机;
2、主机有权发起和结束一次通信,而从机只能被主机呼叫;
3、当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误发生;
4、每个连接到 I2C总线上的器件,都有一个唯一的地址(7位),且每个器件都可以作为主机(同一时刻只有一个主机),也可以作为从机;总线上的器件增加和删除不影响其它器件的正常工作;
5、I2C总线在通信时,总线上发送数据的器件叫发送器,接收数据的器件叫接收器

划分:

  • 传输模式
    标准模式(最快100k/s)
    快速模式(最快400k/s)
    高速模式(最快3.4M/s)
    10位寻址(最多1024个从机地址),可以和7位寻址兼容
  • 按模式:主发送,主接收,从接收,从发送
    我告诉你:“晚上10点提醒我看球赛.”----对于我来说,这是主发送
    我问你:"到时间了吗?"你:“还没呐”-----对于我来说,这是主接收
    你提醒我:“10点啦!球赛开始啦!”-------对于我来说,这是从接收
    你问我:"现在几比几啦?"我:“还是0:0”–对于我来说,这是从发送

硬件连接图
在这里插入图片描述通信过程:
1、主机发送 起始信号,启用总线(这时总线上的所有设备都可以收到,并且其它设备在此器件就不会启用总线了)
2、主机发送一个字节的数据指明 从机地址 和后续字节的 传送方向(是主机—>从机,还是从机—>主机)
一个字节的数据:前7位为从机地址,最后一位是传送方向(是0表示主机—>从机,1表示从机—>主机)
3、被寻址的从机发送 应答信号 回复主机,其它设备查看地址不是自己的地址,并不会理会
4、发送器发送一个字节数据
5、接收器发送应答信号回应发送器
第4、5步 循环…
6、通信完成后,主机发送 停止信号 释放总线,一次通信完成

起始信号:SCL处于高电平时,SDA由高变低
停止信号:SCL处于高电平时,SDA由低变高
字节传送与应答: 发送器发送一个字节数据(先传送高位,再传送低位);接收器发送 应答位 来回应,(1位低电平应答)
同步信号:
传输数据期间,
SCL低电平期间,发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生改变
SCL高电平期间,接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生改变(因为SCL高电平时,数据线上信号改变会被认为是起始信号或者停止信号

SPI

SPI(Serial Peripheral Interface)是串行外设接口的缩写,是一种高速、全双工、同步的串行通信总线;最少有四根线:MISO(主设备输入、从设备输出),MOSI(主设备输出、从设备输入),SCLK(时钟线),CS(片选线)
SPI采用主从方式工作,一般有一个主设备和一个或多个从设备

硬件连接图
每多连接一个从设备,就要多用连接一条片选线,和I2C利用地址来寻址的方式不同
在这里插入图片描述通信过程:
1、SPI总线传输数据:先传送高位,再传送低位;一个字节传送完成后,无需应答,即可开始下一个字节的传送
2、SPI总线采用同步方式工作,时钟在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿接收器从数据线上读取数据,从而完成一位数据的传送;八个时钟周期即可完成一个字节数据的传送

极性和相位:根据芯片手册来判断
SPI总线有四种不同的工作模式,取决于 极性(CPOL)相位(CPHA)

CPOL表示 SCLK 空闲时的状态:
CPOL = 0,SCLK低电平表示总线空闲
CPOL = 1,SCLK高电平表示总线空闲

CPHA表示采样时刻:
CPHA = 0,每个周期的第一个时钟沿采样,相位为0
CPHA = 1,每个周期的第二个时钟沿采样,相位为1

I2CSPI 的异同

相同点:
1、均采用串行、同步的方式
2、均采用 TTL电平,传输距离和应用场景类似(近距离传输,板载通信)
3、均采用主从方式工作
不同点:
1、I2C为半双工通信;SPI为全双工通信
2、I2C有应答机制;SPI无需应答
3、I2C通过总线广播 从机地址 来寻址;SPI通过 向片选线发送使能信号 来寻址
4、I2C的时钟极性和相位固定;SPI的时钟极性和相位可以调整

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

UART、RS232、RS485、I2C和SPI的介绍 的相关文章

  • FPGA驱动0.96oled显示屏 (4线 SPI) verilog语言

    之前也陆陆续续看了很多博客 也都能在自己的屏幕上显示出来 但是问题就是不知道怎么修改代码显示自己希望显示的东西 而且由于没注释原因看不太懂 最终的实现效果最终实现效果视频 b站视频链接1 评论区有人给了源码的百度网盘链接 csdn博客链接1
  • BH1750 传感器实战教学 —— 驱动移植篇

    前言 上一篇 BH1750 的实战教学我们说明的实际应用中传感器的硬件设计 BH1750 传感器实战教学 硬件设计篇 我们提到过在本次使用的芯片为 51 内核 I2C 通讯驱动实现与 STM32 上还是有很大区别的 对于我们来说 已经掌握了
  • Linux SPI 总线 和设备驱动架构之三:SPI控制器驱动

    通过第一篇文章 我们已经知道 整个SPI驱动架构可以分为协议驱动 通用接口层和控制器驱动三大部分 其中 控制器驱动负责最底层的数据收发工作 为了完成数据收发工作 控制器驱动需要完成以下这些功能 1 申请必要的硬件资源 例如中断 DMA通道
  • 使用HAL库开发STM32:UART基础使用

    文章目录 目的 基础说明与初始化 基础说明 初始化 数据接收和发送 轮询方式 中断方式 DMA方式 其它说明 总结 目的 UART 异步串口 是单片机非常常用的一个功能 一般用作设备或模块间通讯的一种方式 通常所说的232或是485通讯从写
  • SPI菊花链原理和配置

    一 概述 在一个主机和多个从器件的典型 SPI 系统中 通常采用专门的片选信号来寻址从器件 随着从器件数量不断增加 片选线也随之增多 这种情况将给电路板布板带来很大的挑战 一个布板方法就是采用菊链结构 本文详细讲述了 SPI 系统的菊链配置
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • Spring Factories

    该文章转载自 https blog csdn net lvoyee article details 82017057 Spring Boot中有一种非常解耦的扩展机制 Spring Factories 这种扩展机制实际上是仿照Java中的S
  • I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例 例如MPU6500 LSM6DS3 I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分 START起始位 STOP停止位 ACK NACK信号 从机器件地址 从机寄存器地址 I2C读的时序比较繁琐
  • 难懂?这样理解SPI与CAN很简单!

    难懂 这样理解SPI与CAN很简单 什么是串行通讯 为什么仍需使用串行通讯 SPI与CAN SPI 接口特点 CAN现场总线特点 什么是串行通讯 在正式进入主题前 我么先来介绍一下什么叫做 串行通信 串行通信是计算机的一种数据传输通信方式
  • Linux:从用户空间实例化:eeprom new_device

    环境 x86 Ubuntu 14 04 我想获得类似的东西 i2c0 eeprom eeprom 50 compatible at 24c32 reg lt 0x50 gt 但因为在 x86 中没有可用的设备树 所以我遵循i2c insta
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • RS485:设备的 ioctl 不合适

    我使用以下代码访问 RS485 从站 但收到错误 读取 ioctl 端口 25 时出错 设备的 ioctl 不合适 我的代码如下 include
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 英特尔伽利略裸机 UART

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

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • GATT 配置文件和 UART 服务

    我是开发通过蓝牙连接到外围设备的移动应用程序的新手 我搜索到 GATT 是用于蓝牙LE 通信的相关配置文件 但我们的客户建议我们使用 UART 服务 现在我很困惑 1 这两件事是如何关联的 2 我们是否必须选择其中之一 如果是的话 每一个的
  • 计算 modbus RTU 3.5 字符时间

    我是 Modbus 新手 正在使用 Modbus RTU 开发应用程序 我想知道如何找出RTU消息帧分离时间 在Modbus RTU规范中 它提到了3 5个字符时间 但是没有更多关于如何决定这个间隔的数据 计算分离时间的步骤是什么 看看第1
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 嵌入式Linux中UART上的9位协议

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

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐