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的介绍 的相关文章

  • STM32设置为I2C从机

    硬件平台 STM32F401 编辑器 keil 5 18 操作系统 win7 一 I2C协议 在传输数据的时候 SDA线必须在时钟的高电平周期保持稳定 SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 起始和停止条件 SC
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • Linux下CH452数码管芯片驱动调试(GPIO模拟I2C)

    1 设备连接 主控板处理器为Cortex A5处理器 内核4 9 0 主控板和CH452引脚定义如下表1 1所示 表1 1 主控板和CH452引脚定义 序号 CH452引脚定义 主控板引脚定义 1 SDA PB29 2 SCL PB30 3
  • Linux SPI 总线 和设备驱动架构之三:SPI控制器驱动

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

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

    该文章转载自 https blog csdn net lvoyee article details 82017057 Spring Boot中有一种非常解耦的扩展机制 Spring Factories 这种扩展机制实际上是仿照Java中的S
  • CORE-ESP32C3

    目录 参考博文 源于网友oled eink aht10项目 源代码修改及复现说明 主要修改 显示效果 编辑硬件准备 软件版本 日志及soc下载工具 软件使用 接线说明 天气显示屏 硬件接线 温度采集 日期温度显示屏 正常初始化LOG 示例代
  • 搭建STM32F407的SPI-Flash(基于STM32CubeMX)

    网上有不少例子 都对 但对我来说碰到几个坑 避免以后再犯错 mark下 目标 通过SPI接口 对Nor Flash进行读写 开发板上Nor Flash 是W25Q128 128Mbit 也就是16MB样子 CubeMx端配置 配置要分两个
  • 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
  • 谁在驱动程序代码中调用“probe”函数?

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

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • SPI 电子墨水显示屏与 PIC 18F46K22 连接时出现问题

    我正在使用一个图18F46K22 https ww1 microchip com downloads en DeviceDoc 40001412G pdf在 SPI 主模式下与Waveshare 1 54 电子纸模组 https www w
  • ADXL345 与 ESP32 I2C 垃圾值问题

    我已根据以下教程使用 I2C 接口将 ESP32 与 ADXL345 连接起来Tutorial http www esp32learning com code esp32 and adxl345 sensor example php 但是
  • 启用 DMA 的 UART Tx 模式

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

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 在 Raspberry Pi 上使用 Python smbus - 与语法混淆

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT
  • 编写I2C设备驱动时探测问题

    我是编写Linux设备驱动程序的新手 如果有什么愚蠢的问题和我糟糕的英语请原谅我 我正在尝试为触摸屏编写一个驱动程序 它通过 I2C 与 CPU 通信 我尝试在linux平台上添加设备驱动程序 注册成功 我的意思是驱动程序已加载 但探测功能

随机推荐