串口通信协议【I2C、SPI、UART、RS232、RS422、RS485、CAN、TTL、USB】

2023-05-16

(1)I2C

集成电路互连总线接口(Inter IC):同步串行半双工传输总线,连接嵌入式处理器及其外围器件。

支持器件:LCD驱动器、Flash存储器

特点

①有两根传输线(时钟线SCL、双向数据线SDA)、GAN接地。

  ②主从模式:通信双方为主设备(Master)和从设备(Slave),在总线上的每一个设备都可以作为主设备或从设备,但一个总线上一般只有一个主设备和多个从设备。主设备是用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU,而从设备只能被动相应主设备发起的通信请求,所以各种I2C接口芯片作为从设备使用。

  ③I2C上每个从设备都有7bit的物理地址(MSB),且该地址是唯一的,固化在芯片上,可以从datasheet中获取。I2C地址中全0为广播地址,所以I2C总线上理论可以有2^7-1个从设备

设计用于低速设备的连接,速度不及SPI,快于串口通信,接线简单

总体上主设备是先发送地址,再发送或接受数据

iic是同步通信方式,允许不定长度的数据,也就是每一对起始信号和终止信号中间可以传输多个8bit数据。

主机发送数据流程

1、当总线空闲的时候,主机发送一个起始信号S,代表开始通信
2、主机接着发送一个从机的物理地址7bit和一位读写控制位(0为写、1为读)
3、从机进行地址匹配,匹配成功后发送一个应答信号ACK(低电平为0)
4、主机收到应答信号,接着开始发送第一个字节的数据
5、从机收到数据后返回一个ACK
6、主机收到应答信号后,接着发送下一个字节

7、当主机发送完最后一个字节,并且接收到从机的应答信号时,接着发送一个停止信号P结束通信,并且释放总线
8、从机收到P信号之后也退出和主机之间的通信

主机接收数据流程

当总线空闲的时候,主机发送一个起始信号S,代表开始通信
主机接着发送一个从机的物理地址7bit和一位读写控制位(0为写、1为读)
从机进行地址匹配,匹配成功后发送一个应答信号ACK Acknowledge低电平为0),接着开始发送第一个字节数据
主机收到数据之后向从机返回一个ACK
从机收到应答信号后,接着发送下一个字节
当主机接收完数据之后,向从机发送一个NAK信号Not Acknowledge,从机收到非应答信号后停止发送数据
主句发送ACK之后,发送一个停止信号结束通信,并释放总线

 

字节格式

SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前 。 

 

 (2)SPI

SPI(Serial Peripheral Interface串行外设接口)。SPI总线是同步、全双工双向4线式串行接口总线。它是由“单个主设备+多个从设备”构成的系统。

SPI是一个同步的数据总线,也就是说它是用单独的数据线一个单独的时钟信号来保证发送端和接收端的完美同步

时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样

4条逻辑线

MISO:Master input slave output 主机输入,从机输出(数据来自从机);

MOSI:Master output slave input 主机输出,从机输入(数据来自主机);

SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机; 

SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号


 

在这里插入图片描述

整体的传输过程

1、主机先将NSS信号拉低,这样保证开始接收数据;

2、当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);

 注:由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(。

3、主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;

4、主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

时钟极性和时钟相位

时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;

  • CKP = 0:时钟空闲IDLE为低电平 0
  • CKP = 1:时钟空闲IDLE为高电平1
  • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
  • CKE = 1:在时钟信号SCK的第二个跳变沿采样;

其中黑色线为采样数据的时刻;

蓝色线为SCK时钟信号;

模式编码

SPI的时钟极性和相位的配置通常称为 SPI模式,所有可能的模式都遵循以下约定;具体如下表所示

 多从机模式

多NSS

 

 菊花链

菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;

 优缺点

  • 全双工串行通信;
  • 高速数据传输速率。
  • 简单的软件配置;
  • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
  • 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)
  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
  • 通常仅支持一个主设备;
  • 需要更多的引脚(与I2C不同);
  • 没有定义硬件级别的错误检查协议;
  • 与RS-232和CAN总线相比,只能支持非常短的距离;

(3)UART

UART(Universal Asynchronous Receiver Transmitter:通用异步收发器),是电脑硬件的一部分,它把将要传输的资料在串行通信与并行通信之间加以转换,UART通常被集成于其他通讯接口的连接上。UART即我们通常说的“串口”。该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。

 对于发送设备和接收设备来说,两者的串行通信配置应该设置为完全相同

 UART帧格式在这里插入图片描述

空闲位:不进行传输数据时,默认为逻辑1,为高电平
起始位:先发出一个逻辑“0”,表示消息帧的开始
数据位:紧接着起始位之后,可由5~8位组成,通常传输8位即一个字节发送数据的位,后发送数据的高位;
奇偶校验位:紧接着数据位后面(可有可无),使得“1”的位数应为偶数(偶校验)或奇数(奇校验),校验数据传输是否正确;
停止位:它是消息传输结束的标志,它可以是1位、1.5位、2位的高电平, 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
波特率:是衡量数据传输速率的指标,表示每秒钟传输的位数。例如设置串口的波特率为9600,则表示是1s传输9600个bit的数据,则传送每个位的时间为 1s / 9600 ≈ 104us,从而区分消息帧中每个位传输的数据;

缺点:UART一般直接使用TTL信号来表示0和1,但TTL信号抗干扰能力较差,数据在传输过程中很容易出错;且TTL信号的通信距离也很短

UART和USART 

USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器。

USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,后者就是UART。所以说UART姑且可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。 

U是通用,A是异步,S是同步

 UART只是对信号的时序进行了定义,而未定义接口的电气特性

(4)RS232

现在工业控制的RS-232接口一般只使用RXD、TXD、GND三条线,且PC机一般采用DB-9连接器;

 特性:
工作方式:单端(非平衡
节点数:点对点通讯(1收1发)
最大传输距离:50ft ( 50 * 0.3048 = 15.24m
最大传输速率:20kbit/s
连接方式:点对点(全双工)
电气特性:-3V ~ -15V表示逻辑1,3V ~ 15V表示逻辑0
常用芯片有max232、SP232等
缺点:通信距离短,速率低,而且只能点对点通信,无法组建多机通信系统,且容易受外界电气干扰导致信息传输错误

由于单片机接口一般是TTL电平,如果接232电平的外设,就需要加TTL转RS232的模块。如下图,可用芯片MAX232进行转换。

(5)RS422 

RS-422有4根信号线:两根发送、两根接收和一根地线。全双工通信。

它有一个主设备,其余为从设备,从设备之间不能通信,所以RS-422支持点对多的双向通信

在这里插入图片描述

RS-422标准定义了一种平衡通信接口,改变了RS-232标准的单端通信的方式,总线上使用差分电压进行信号传输。传输速率提高到10Mbit/s,传输距离长达4000ft=1219.2m(速率低于100kbit/s时),而且运行总线上最多连接10个接收器。

特性:
工作方式:差分(平衡)
节点数:点对多通讯(1发10收)
最大传输距离:4000ft ( 4000 * 0.3048 = 1219.2m
最大传输速率:10Mbit/s
连接方式:一点对多点(四线制,全双工
电气特性:2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0
缺点:连接的设备少,抗干扰能力不强,无法完全满足工业需求。
常用芯片有max232、SP232等

(6)RS485

RS-485标准运行连接多个收发器,即具有多站能力,增加了多点、双向的通信能力

RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。

采用两线半双工传输,最大速率10Mb/s,电平逻辑是两线的电平差来决定的,提高抗干扰能力,传输距离长(几十米到上千米)。

特性:
工作方式:差分(平衡);
节点数:点对多通讯(1发32收);
最大传输距离:4000ft ( 4000 * 0.3048 = 1219.2m);
最大传输速率:10Mbit/s;
连接方式:多点对多点(两线制,半双工);
电气特性:2V ~ 6V表示逻辑1,-2V ~ -6V表示逻辑0;
常用芯片有max485、SP3072EEN等,以SP3072EEN收发器芯片的典型应用电路如下

 TTL转成RS-485很常见,比如MAX485,参考电路如下

(7)CAN

CAN(Control Area Network)是控制器局域网络的简称,是一种能够实现分布式实时控制的串行通信网络。CAN总线的功能复杂且智能。主要用于汽车通信。目前是国际上应用最广泛的现场总线之一

CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。

每一个设备既可做主设备也可做从设备。CAN总线的通信距离可达10千米(速率低于5Kbps),速度可达1Mbps(通信距离小于40M)。

 主要特性


1、数据传输距离远(最远10km);

2、数据传输速率高(最高数据传输速率1Mbit/s);

3、具备优秀的仲裁机制

4、使用筛选器实现多地址的数据帧传递;

5、借助遥控帧实现远程数据请求;

6、具备错误检测与处理功能;

7、具备数据自动重发功能;

8、故障节点可自动脱离总线且不影响总线上其它节点的正常工作
 

CAN的通信帧

(1)数据帧


用途:用于发送单元向接收单元传送数据

数据帧由7个段构成
帧起始:表示数据帧和远程帧的起始,他仅由一个“显性电平”位组成。
仲裁段:是表示帧优先级的段标准帧的仲裁段由11bit的标识符ID和RTR(远程发送请求)位组成;扩展帧的仲裁段由29bit的标识符ID、SRR(替代远程请求位)、IDE位和RTR为构成。
控制段:是表示数据的字节数和保留位的段,标准帧与扩展帧的控制段格式不同。
数据段:用于承载数据的内容,它包含0~8B的数据,从MSB(最高有效位)开始输出。
CRC段:是用于检查帧传输是否错误的段,它由15bit的CRC序列和1bit的CRC界定符(用于分隔)构成。
ACK段:是用于确认接收是否正确的段,它由ACK槽和ACK界定符(用于分隔)构成,长度为2bit
帧结束:用于表示数据帧的结束,它由7bit的隐性位构成。

 (2)遥控帧

用于接收单元向具有相同ID的发送单元请求数据

(3)错误帧

用于当检测出错误时向其他单元通知错误

(4)过载帧

用于接收单元通知发送单元其尚未做好接收准备

(5)帧间隔

用于分隔数据帧和遥控帧的帧
帧间隔的构成元素有三个:
一是间隔,它由3bit的隐性位构成。
二是总线空闲,它由隐性电平构成,且无长度限制。只有在总线处于空闲状态下,要发送的单元才开始访问总线。
三是延迟传送,它由8bit的隐性位构成。

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

串口通信协议【I2C、SPI、UART、RS232、RS422、RS485、CAN、TTL、USB】 的相关文章

  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的
  • SPI接口详细介绍

    1 概述 SPI Serial Peripheral Interface 是串行外围设备接口 是一种高速 全双工 同步的通信总线 常规只占用四根线 节约了芯片管脚 PCB的布局省空间 现在越来越多的芯片集成了这种通信协议 常见的有EEPRO
  • 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
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • SPI总线verilog hdl实现(1)SPI通信

    SPI总线传输只需要4根线就能完成 这四根线的作用分别如下 SCK Serial Clock SCK是串行时钟线 作用是Master向Slave传输时钟信号 控制数据交换的时机和速率 MOSI Master Out Slave in 在SP
  • Linux,spidev:为什么它不应该直接在设备树中?

    我想定义一个具有用户模式访问权限的 SPI 设备 如中所述http linux sunxi org SPIdev 按照这些示例 我在设备树中添加了以下内容 ecspi1 other stuff mydev 0 compatible spid
  • 找不到i2c注册宏?

    我正在 raspi 上开发 I2C 驱动程序 register I2C device static static const struct i2c board info rasp i2c devices mbed mbedID in the
  • 为什么我只收到第一个地址字节? (I2C协议)

    期望从机确认并返回数据 但它没有 这是我的协议 这是我的数据表 数据表提到 从机将通过首先发送 MSB 字节来应答 Byte0 和 byte1 包含 预测值 所有字节均由主机确认 Edit 源库 另外仅供参考 我使用的是 Arduino F
  • 如何为连接到 I2C gpio 扩展器的虚拟 mdio-gpio 设备配置 ACPI *.asl

    我正在使用 Q7 模块 x86 并尝试在 Linux 上使用 ACPI SSDT Overlay 配置我们的外设 但我对此很挣扎 我想我误解了ACPI的一些核心概念 Problem CPU gt I2C gt PCA9575 GPIO Ex
  • STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART) 与 HAL 库?

    背景 这是我的一些背景 以便你们知道我有或没有哪些相关知识 我完全是这种嵌入式系统的新手 而且我对电子产品一无所知 我是一个纯粹的软件人员 我唯一的嵌入式系统经验是Raspberry Pi 它与STM32F4 Discovery有很大不同
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 如何将 I2C 地址传递给 Adafruit CircuitPython 代码? (运行 ADS1115)

    我正在尝试使用两个 I2C 地址 0x48 0x49 在一个 Raspberry Pi 上运行两个 Adafruit ADS1115 每个设备的地址可以通过将 ADDR 引脚连接为高电平 0x49 或使其悬空 默认为 0x48 来设置 我已
  • Spidev 不使用 ioctl 同时写入/读取

    我希望找到一些帮助 即使这个问题可能更多地与硬件相关而不是与软件相关 我们将会看到 我正在开发基于 Freescales P1021 处理器 ppc e500v2 内核 的定制板 将连接外部 PCB 并可通过 SPI 进行配置 该外部 PC
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT
  • 如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1

随机推荐