硬件串口通信协议学习(UART、IIC、SPI、CAN)
0.前言
学习资料:江协科技的个人空间-江协科技个人主页-哔哩哔哩视频
- 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
- 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

- 全双工:通信双方能够同时进行双向通信,一般有两根数据线。比如TX和RX,MOSI和MISO,发送和接收互不影响。
- 半双工:只有一条数据线(IIC、CAN和USB),
- 时钟信号:高速接收方什么时候需要采集数据,分为同步和异步。IIC和SPI有单独的时钟线,所以他们是同步的,接收方可以在时钟信号的指引下进行采样。剩下的串口,CAN和USB没有时钟线,所以需要双方约定一个采样频率,为异步通信。
CAN协议使用两条差分信号线进行通信,其中一条线是CAN高线,另一条线是CAN低线。这两条线通过电压的差异来表示数据的0和1。CAN协议的物理层只有这两条差分线,因此在一个时刻只能表示一个信号,所以CAN通信是半双工的,即在同一时刻只能有一个节点发送信号,其他节点只能接收信号。
USB协议,数据传输方向,D+只能接另外一个设备的D+,D-接D-,一根数据线为半双工。
USART中的“S”表示同步,只支持时钟输出,不支持时钟输入,是为了兼容别的协议或特殊用途而设计的,并不支持两个USART之间进行同步通信,所以这个功能几乎不会用到,一般更常使用的是UART异步收发器。
一、UART协议
1.1 UART协议简介
- UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,它是一种常见的串口通信接口。
- 使用差分信号可以抑制共模噪声,可以极大的提高信号的抗干扰特性,所以一般差分信号的传输速度和传输距离都非常高。

- TX与RX要交叉连接
- 当只需单向的数据传输时,可以只接一根通信线
- 当电平标准不一致时,需要加电平转换芯片
电平标准:
- TTL电平:+3.3V或+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
串口参数及时序:
- 波特率:串口通信的速率(bit/s)
- 起始位:标志一个数据帧的开始,固定为低电平
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 校验位(选填):用于数据验证,根据数据位计算得来
- 停止位:用于数据帧间隔,固定为高电平
无校验位:

有校验位:

1.2 串口通信时序图
串口时序:低位先行,先发送B0(先转换为二进制,然后先画低位波形)
发送一个字节的数据0x55(0101 0101):8位数据+1位停止位,无校验位
起始位低电平,停止位高电平

偶校验位(低电平0):

二、IIC协议
2.1 IIC协议简介
- I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
- 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
- 同步,半双工
- 带数据应答
- 支持总线挂载多设备(一主多从、多主多从)
硬件电路:
- 所有I2C设备的SCL连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

- 从机的权利比较小,对于SCL线,在任何时刻都只能被动的读取,从机不允许控制SCL线。
- 对于SDA数据线,从机不允许主动发起对SDA的控制。只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地获取SDA的控制权。
主机的SDA引脚在发送的时候是输出模式,在接收的时候是输入模式。为了避免总线没协调好,导致电源短路的问题。IIC的设计是禁止所有设备输出强上拉的高电平。
设计为弱上拉电阻(4.7K)加开漏输出的模式。
这个模式具有“线与”的功能,只要总线上有一个输出低电平,总线就处于低电平。只有所有设备都输出高电平,总线才输出高电平。
2.2 IIC时序基本单元
起始和终止信号均由主机产生,从机不允许产生起始和终止信号,所以在总线空闲状态时,从机必须始终放手。
- 起始条件:SCL高电平期间,SDA从高电平切换到低电平。下降沿,触发起始条件。
- 终止条件:SCL高电平期间,SDA从低电平切换到高电平。上升沿,触发终止条件,回到最初的空闲状态(SDA和SCL均为高电平)
- 除了起始和终止条件,每个时序单元的SCL都是以低电平开始,低电平结束。

- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行,先发送B7),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

- SCL低电平期间:允许SDA的电平发生变化,如果发送1就为高电平,发送0为低电平。
- SCL高电平期间:不允许SDA的电平发生变化。
- 一般在SCL上升沿的时刻,从机就已经读取完成了。从机在上升沿时立刻把数据读走。主机在放手SCL一段时间后(高电平),就可以继续拉低SCL,传输下一位了。
- 主机也需要在SCL下降沿之后,尽快把数据放在SDA上。
- 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA,即高电平)

- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
-
- 接收应答:主机发送完毕后,需要立刻调用接收应答的时序(在SCL低电平期间,SDA切换为高电平)

2.3 IIC通信时序参考图
- 指定地址写
- 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

空闲状态,SDA、SCL均为高电平。
然后主机需要给从机写入数据时,SCL高电平期间,拉低SDA,产生起始条件。
发送一个字节的数据(字节的内容:从机地址7位+1位读写位)
读写位:0表示之后的时序主机要进行写入操作,1表示之后的时序主机要进行读出操作。
应答位RA(Receive ACK, RA):根据IIC协议的规定,在这个时刻,主机要释放SDA
SCL低电平期间,SDA可以变换数据
SCL高电平期间,SDA保持不变,从机读取数据
- 当前地址读
- 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

- 指定地址读
- 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

三、SPI协议
3.1 SPI协议简介
- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)从机选择线,有几个从机,需要几根从机线,一人一根
- 同步,全双工(两根数据线,一根发送,一根接收,设备双方可以同时进行数据通信)
- 支持总线挂载多设备(一主多从)
SPI通信的基础是交换一个字节:有了交换一个字节,就可以实现发送一个字节、接收一个字节,和发送同时接收一个字节,这三种功能。
硬件电路:
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

从机SS引脚,输入低电平代表被选中进行数据通信,如果只有一个从机设备,SS引脚可以直接接地。
- 从机设备的DI:相当于MOSI引脚
- 从机设备的DO:相当于MISO引脚
- CS片选:其实就是SS
移位示意图:高位先行,每来一个时钟,移位寄存器都会向左进行移动一位。

原理:在波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出的位放到引脚上。波特率发生器的下降沿,引脚上的位,采样输入到移位寄存器的最低位。
在波特率发生器的上升沿:移出一位放到引脚上:

在波特率发生器的下降沿:主机和从机都会进行数据采样输入:

8个时钟后,完成一个字节的交换:一般在接收的时候,主机会统一发送0x00或0xFF,去跟从机换数据。

3.2 SPI时序基本单元
- 起始条件:SS从高电平切换到低电平
- 终止条件:SS从低电平切换到高电平
- 在通信期间:SS始终保持在低电平,在从机SS未被选中时,从机的MISO引脚必须关断输出,也就是设置为高阻态。

CPOL::Clock Polarity,时钟极性
CPHA:Clock Phase,时钟相位
每一位可以配置为1或0,总共组合起来,共有4种模式。在实际使用中,只需要其中的一种即可。
注意:CHPA表示的是时钟相位,决定第一个时钟采样移入还是第二个时钟采样移入。并不能单独决定上升沿采样还是下降沿采样。
3.3 交换一个字节的时序图
- 交换一个字节(模式0)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

- 交换一个字节(模式1),常用
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

通讯原理:
- SS高电平时,从机未被选中,MISO用一条中间的线表示高阻态。
- SS下降沿之后,从机的MISO被允许开启输出,SS上升沿之后,从机的MISO必须置回高阻态。
- 移位传输的操作:因为CPHA = 1,所以SCK第一个边沿移出数据(所以在SCK第一个上升沿,主机和从机同时移出数据)。主机通过MOSI移出最高位B7,从机通过MISO移出最高位B7。
- 时钟运行,产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样。主机移出的B7进入从机移位寄存器的最低位B0。从机移出的B7进入主机移位寄存器的最低位。这样一个时钟脉冲产生完毕,一个数据位传输完毕。
通过上述步骤可以完成一个字节的交换。在SS的上升沿,MOSI还可以再变化一次,将MOSI置到一个默认的高电平或低电平,当然也可以不管他。MISO从机必须得置回高阻态,此时如果主机的MISO为上拉输入,那MISO引脚的电平为高电平。如果主机MISO为浮空输入,此时MISO引脚的电平不确定。
- 交换一个字节(模式2)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

- 交换一个字节(模式3)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

3.4 模式1完整时序图
向SS指定从机设备,发送指令0x06:

四、CAN协议
相关文章:
硬件串口通信协议学习(UART、IIC、SPI、CAN)
0.前言 学习资料:江协科技的个人空间-江协科技个人主页-哔哩哔哩视频 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 全双工:通信…...
第一章-JavaScript基础进阶part2:事件
文章目录 概念一、注册事件(绑定事件)1.1 addEventListener事件监听 二、删除事件(解绑)三、DOM事件流四、事件对象event4.1 e.target与this与e.currentTarget的区别4.2 事件对象的常见属性 五、阻止事件默认行为及冒泡六、事件委…...
如何优雅的使用后端接口
优雅的后端接口 一个后端接口大致分为四个部分:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响 应数据(response)。 一、URL & Method Rest 设计风格 》 Restful API 简单理解: URI 是用来唯一标志一个互联网资源;Me…...
QEMU源码全解析25 —— QOM介绍(14)
接前一篇文章:QEMU源码全解析24 —— QOM介绍(13) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 本文开始对于…...
TopK问题
topK问题: N个数找最大或者最小的前k个。 例子: 优质筛选(店面的排名) 10000个数,找出最大的前10个数 解决思路:建立大堆,然后pop9次 但是有些场景,上面的思路…...
接口自动化测试-Postman+Newman+Git+Jenkins实战集成(详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Postman 创建…...
CMake 学习笔记 (Generator Expressions)
CMake 学习笔记 (Generator Expressions) Generator Expressions 可以认为是一种特殊的变量,它会在编译阶段求值。通常用在 target_link_libraries(), target_include_directories(), target_compile_definitions() 上。 用 Generator Expr…...
提高测试用例质量的6大注意事项
在软件测试中,经常会遇到测试用例设计不完整,用例没有完全覆盖需求等问题,这样往往容易造成测试工作效率低下,不能及时发现项目问题,无形中增加了项目风险。 因此提高测试用例质量,就显得尤为重要。一般来说…...
2023牛客暑期多校训练营6 A-Tree (kruskal重构树))
文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai≤1),(1≤costi≤109) 题解 提供一种新的算法,kruskal重构树。 该算法重新构树,按边权排序每一条边…...
软件测试—支付功能测试
有人问过我这样一个问题:作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 回答:对支付平台而言&#…...
自动化测试的统筹规划
背景 回顾以前自动化测试编写的经历,主要是以开发者自驱动的方式进行,测试的编写随心而动,没有规划,也没有章法,这样就面临如下的一些问题: 测试用例设计不到位,覆盖不全,或者不够…...
外键字段的增删改查、多表查询(子查询和连表查询、正反向、聚合查询、 分组查询、 F与Q查询)、django中如何开启事务
一、 外键字段的增删改查 1.多对多的外键增删改查图书和作者是多对多,借助于第三张表实现的,如果想绑定图书和作者的关系,本质上就是在操作第三方表2.如何操作第三张表问题:让你给图书添加一个作者,他俩的关系可是多对…...
【学习笔记】生成式AI(ChatGPT原理,大型语言模型)
ChatGPT原理剖析 语言模型 文字接龙 ChatGPT在测试阶段是不联网的。 ChatGPT背后的关键技术:预训练(Pre-train) 又叫自监督式学习(Self-supervised Learning),得到的模型叫做基石模型(Founda…...
【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作
文章目录 1.腐蚀操作2.膨胀操作3.开运算和闭运算4.礼帽与黑帽5.梯度运算 1.腐蚀操作 腐蚀操作是图像处理中常用的一种形态学操作,我们通常用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。腐蚀操作的原理是,在给定的结构元素下,…...
Autosar诊断系列介绍20 - UDS应用层P2Server/P2Client等时间参数解析
本文框架 1. 前言2.几个时间参数含义2.1 P2Client与P2Server2.2 P2*Client与P2*Server2.3 P3Client_Phys与P3Client_Func2.4 S3Client与S3Server 1. 前言 本系列Autosar 诊断入门介绍,会详细介绍诊断相关基础知识,如您对诊断实战有更高需求,…...
【iOS】json数据解析以及简单的网络数据请求
文章目录 前言一、json数据解析二、简单的网络数据请求三、实现访问API得到网络数据总结 前言 近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结 一、json数据解析 JSON是一种轻量级的数据…...
Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证
1、概述 在 Kubernetes 官方手册中给出了 “用户” 的概念,Kubernetes 集群中存在的用户包括 “普通用户” 与 “ServiceAccount”, 但是 Kubernetes 没有普通用户的管理方式,通常只是将使用集群根证书签署的有效证书的用户都被视为合法用户。…...
45.ubuntu Linux系统安装教程
目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习,Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然 后再安装 Linux 系统。 所需安装文件:…...
Jmeter函数助手(一)随机字符串(RandomString)
一、目标 实现一个请求单次调用,请求体里多个集合中的相同参数(zxqs)值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段,单次执行请求,请求体里多个集合中的相同参数&a…...
SpringCloud之微服务API网关Gateway介绍
文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
