串口通信协议

2023-05-16

通信协议的基本概念 

用于定义通信过程及细节规则的协议称为通信协议,通信系统之间为了完成通信所必须遵循的规则和约定(数据包格式/字段的内容/字段的含义/发送的时间/接收的时间等细节)

个人理解:就是消息在传输过程中,以什么样的形式传输,不同信息怎么表示,不同信息放在什么地方

所有通信系统之间通信,需要相同的协议(一般是外设与主板)

协议就是规则

协议实现:通过程序语言将协议文档实现为具体的程序代码;再将代码集成在某个软件或者操作系统中,以实现通信的目的。

将数据包每个字段拆开分析,找到数据的部分

原始的数据包是以16进制的数据和字母组成的,而Wireshark软件是将这些数字和字母翻译成英文。

计算机接收到的数据包中,可以以16进制显示出来,也可以以2进制显示出来。

通讯的基本概念

1、串行通讯与并行通讯(按数据的传送方式)

串行通讯:指设备之间通过少量数据信号线(一般是 8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。

并行通讯:指使用 8、16、32 及 64 根或更多的数据线进行传输的通讯方式,同时传输多个数据位的数据。

两者比较:在数据传输速率相同时,并行效率更高,可以传输更多数据量;而串行通讯节省成本。并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能。比较如下:

2、全双工、半双工、单工通讯(按数据通讯方向)

全双工:在同一时刻,两个设备间可以同时收发数据;

半双工:两设备间可以收发数据,但不能在同一时刻进行;

单工:在任何时刻只能进行一个方向的通讯,且固定一方为发送设备,一方为接收设备。

 3、同步通讯和异步通讯(数据通讯的同步方式):是否使用时钟信号进行区分

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

 异步通讯:不使用时钟信号进行数据同步,直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。

 两者比较:在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。

4、通讯速率:比特率和波特率

比特率(Bitrate):每秒钟传输的二进制位数,单位为比特每秒(bit/s)。

波特率(Baudrate):表示每秒钟传输了多少个码元

三、串口协议

USART——串口通讯

包括RS232、RS499、RS423、RS422和RS485等接口规范和标准规范

串口通讯协议的物理层及协议层:

1、物理层:串口通讯的物理层有很多标准及变种,主要有RS-232标准,一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。

2、协议层:串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据 

数据校验

奇校验:有效数据和校验位中“1”的个数为奇数;

偶校验:有效数据和校验位中“1”的个数为偶数;

3、USART——通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)

RX、TX

串行通信:以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。

字符帧:一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。


I2C通讯协议

I2C通讯协议(Inter-Integrated Circuit):由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

1、物理层:双向串行数据线(SDA),串行时钟线(SCL)

(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。

2、协议层:定义了通讯的起始和停止信号、数据有效性、响应、仲裁时钟同步和地址广播等环节

S:传输开始信号;SLAVE_ADDRESS: 从机地址;R/W:传输方向选择位,1为读,0为写
A/A:应答(ACK)或非应答(NACK)信号;P:停止传输信号

通讯过程:起始信号产生后,所有从机就开始等待主机紧接下来广播 的从机地址信号(SLAVE_ADDRESS)。在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据 I2C协议,这个从机地址可以是 7位或 10位。在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1时,则相反,即主机由从机读数据。从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

读和写数据:I2C通讯更常用的是复合格式,该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

(2)通讯的起始和停止信号:起始和停止信号一般由主机产生

起始信号:SCL为高,SDA 高 —>低;

停止信号:SCL为高,SDA 低 —>高;

 数据有效性:传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。

3、I2C特性及架构

软件模拟协议:直接控制芯片的两个 GPIO 引脚,分别用作 SCL 及 SDA,按照上述信号的时序要求,直接控制引脚的输出(若是接收数据时则读取 SDA 电平),就可以实现 I2C 通讯。由直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态。

硬件协议:STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。
 

SPI通讯协议

SPI(Serial Peripheral Interface):串行外围设备接口,是一种高速全双工的通信总线。

1、SPI物理层:3条总线及片选线(SCK、MOSI、MISO、片选线共4根)

 (1)片选线:从设备选择信号线,当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI及 MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。

(3) MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(4) MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

2、协议层:SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

SPI通讯时序:

 (1)通讯的起始和停止信号:

起始信号:NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。

停止信号:NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

(2)数据有效性:SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK的下降沿时被采样。即在 SCK的下降沿时刻,MOSI及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO为下一次表示数据做准备。SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

 DMA——直接存储器存取

DMA(Direct Memory Access):是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器

1、DMA请求:如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA的传输,直到传输完毕。

2、通道:DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一
时间只能接收一个,不能同时接收多个。

3、仲裁器:当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器理。

4、DMA 数据配置: DMA 传输数据的方向有三个——从外设到存储器,从存储器到外设,从存储器到存储器。
 

USART/I2C/SPI比较

1、通信速率比较:

SPI > I2C > UART
(1)同步通信>异步通信;
(2)同步通信时必须有一根时钟线连接传输的两端;
(3)都是串行通信方式,并行通信用于内部存储间的通信,如flash;
(4)适合传输的距离和通信速率成反比关系;

2、连线方式:
SPI:2数据线、1时钟线、1CS(设备片选线),串行同步通信全双工;
I2C:1数据线、1时钟线,串行同步通信半双工,传输距离比UART短;
UART:2数据线、1地线,串行异步通信全双工,传输距离比I2C长些;

(I2C接口是“器件间”接口,是在一块板子之内传输数据)
(UART是 “设备间”接口,更多的是用于两台设备之间传输数据)
 

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

串口通信协议 的相关文章

随机推荐

  • MySQL-约束(三)

    MySQL 约束 约束的定义常见的约束类型表级约束与列级约束例子非空约束 NOT NULL 唯一约束 UNIQUE 联合唯一约束 默认约束 DEFAULT 主键约束 PRIMARY KEY 复合主键约束复合主键与联合主键 外键约束 FORE
  • 双系统之kali

    双系统之kali 所用工具制作kali的引导盘硬盘分区安装kali设置启动引导设置root密码U盘恢复 下面文章多为图片形式 xff0c 每个图片中包含详细的步骤 所用工具 16G的U盘一个 xff0c 电脑一台 所有的软件均已上传至百度网
  • 连接GitHub提示远程主机关闭连接

    连接GitHub提示远程主机关闭连接 发现问题排查问题反思 错误代码 xff1a kex exchange identification Connection closed by remote host 发现问题 今天晚上使用git连接了G
  • Linux - Nginx安装

    Linux Nginx安装 下载 amp 配置启动优化nginx添加新模块 本文由于是学习 xff0c 所以使用tar包安装 xff0c Linux版本CentOS7 xff0c nginx 1 20 2 xff0c 本次安装路径为 usr
  • 异常记录-3

    异常记录 3 异常类名描述问题原因解决方案异常重现 异常类名 org springframework beans BeanInstantiationException 描述 Failed to instantiate javax servl
  • 异常记录-22

    异常记录 22 异常描述问题原因解决方案异常重现 异常 ssl SSLEOFError EOF occurred in violation of protocol ssl c 997 描述 urllib3 exceptions MaxRet
  • Linux - RabbitMQ部署

    Linux RabbitMQ部署 准备部署账户创建使用 准备 span class token function cat span etc redhat release 查看自己的服务器什么版本的 xff0c 本人使用的CentOS8 安装
  • Linux - MongoDB部署

    MongoDB部署 准备部署mongoDB部署 启动优化角色 参考 准备 MongoDB下载 官方下载 选择自己需要的版本 xff0c 以及服务器版本 xff0c 以及安装方式 xff0c 本篇文章我们安装6 0MongoDB使用CentO
  • 异常记录-23

    异常记录 23 异常描述问题原因解决方案异常重现 异常 64 WebFilter 描述 Java 过滤器 64 WebFilter不起作用 问题原因 64 WebFilter需要注册到Bean中 xff0c 只写注解不起作用的 解决方案 在
  • Vscode黑色主题很难看到鼠标

    Vscode黑色主题很难看到鼠标 xff0c 像瞎了一样 xff0c 找半天不知道鼠标在哪里 xff0c 解决办法 xff1a 控制面板 鼠标 指针 看 自定义 选择 文本选择 点击 浏览 选择 beam r xff0c 这个是光标周围带白
  • python中变量前面加单下划线和双下划线的区别&python的私有属性

    一 在py文件中 变量名字前面加单下划线和双下划线都是对变量的保护 xff0c 一种约定 xff0c 用来指定变量私有 程序员用来指定私有变量的一种方式 不能用from module import 导入 xff0c 其他方面和公有一样访问
  • APM、PIXHAWK、PX4的关系

  • QT小记:QT程序异常结束的可能原因

    一 问题 xff1a 程序异常结束 二 解决 1 解决思路 xff08 1 xff09 QT程序异常结束的原因之一可能引用了某个库 xff0c 但是某个库QT找不到 xff0c 就会出现崩溃的问题 解决 xff1a 1 检查pro文件是否正
  • C语言:十进制转换成十六进制字符串和数组

    1 十进制转换成十六进制字符串 include lt stdio h gt 函数 xff1a 将十进制数字转换为十六进制 xff0c 并将转换后的数字存储在字符串中并输出 void dec2hex int n char str 100 in
  • 【统计计算】课程总结笔记

    传统的主成分分析法 xff08 PCA xff09 缺陷在于 xff1a 对于 小样本问题 xff08 样本维数d远大于样本个数N xff09 xff0c 样本协方差矩阵规模 d d 太大了 xff0c 在后续求特征值问题中计算量较大 于是
  • ros --- 双目相机内参与外参标定

    ros 双目相机内参与外参标定 小觅相机直接获取参数手动重新标定1 双目相机内外参标定生成标定板录制 stereo calibra bag标定标定结果标定验证 2 双目 43 imu外参标定录制 stereo 43 imu calibra
  • RT-Thread之入门跑代码

    本文将讲述如何在window10中利用tensorflow跑代码 xff0c 并且编译成bin文件 xff0c 最后在k210中运行 一 在window上安装tensorflow框架 xff08 python3 7 xff09 1 安装An
  • keil5的基本使用

    项目文件后缀 硬件下载 1 编译 2 下载 软件仿真 一 基本知识 1 选择软件仿真选项 2 编译 3 启动软件仿真 4 运行代码 二 软件仿真的具体使用 1 我们想运行到 哪一步就在那一步添加断点 xff08 在左边的空白处左键点一下就可
  • pytorch之池化层

    实际图像里 xff0c 我们感兴趣的物体不会总出现在固定位置 xff1a 即使我们连续拍摄同一个物体也极有可能出现像素位置上的偏移 这会导致同一个边缘对应的输出可能出现在卷积输出 Y中的不同位置 xff0c 进而对后面的模式识别造成不便 在
  • 串口通信协议

    通信协议的基本概念 用于定义通信过程及细节规则的协议称为通信协议 xff0c 通信系统之间为了完成通信所必须遵循的规则和约定 xff08 数据包格式 字段的内容 字段的含义 发送的时间 接收的时间等细节 xff09 个人理解 xff1a 就