硬件串口通信协议学习(UART、IIC、SPI、CAN)

news2024/9/30 17:27:11

0.前言

学习资料:江协科技的个人空间-江协科技个人主页-哔哩哔哩视频

  1. 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
  2. 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

  1. 全双工:通信双方能够同时进行双向通信,一般有两根数据线。比如TX和RX,MOSI和MISO,发送和接收互不影响。
  2. 半双工:只有一条数据线(IIC、CAN和USB),
  3. 时钟信号:高速接收方什么时候需要采集数据,分为同步和异步。IIC和SPI有单独的时钟线,所以他们是同步的,接收方可以在时钟信号的指引下进行采样。剩下的串口,CAN和USB没有时钟线,所以需要双方约定一个采样频率,为异步通信。

CAN协议使用两条差分信号线进行通信,其中一条线是CAN高线,另一条线是CAN低线。这两条线通过电压的差异来表示数据的0和1。CAN协议的物理层只有这两条差分线,因此在一个时刻只能表示一个信号,所以CAN通信是半双工的,即在同一时刻只能有一个节点发送信号,其他节点只能接收信号

USB协议,数据传输方向,D+只能接另外一个设备的D+,D-接D-,一根数据线为半双工。

USART中的“S”表示同步,只支持时钟输出,不支持时钟输入,是为了兼容别的协议或特殊用途而设计的,并不支持两个USART之间进行同步通信,所以这个功能几乎不会用到,一般更常使用的是UART异步收发器。

一、UART协议

1.1  UART协议简介

  1. UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,它是一种常见的串口通信接口。
  2. 使用差分信号可以抑制共模噪声,可以极大的提高信号的抗干扰特性,所以一般差分信号的传输速度和传输距离都非常高。

  1. TX与RX要交叉连接
  2. 当只需单向的数据传输时,可以只接一根通信线
  3. 当电平标准不一致时,需要加电平转换芯片

电平标准:

  1. TTL电平:+3.3V或+5V表示1,0V表示0
  2. RS232电平:-3~-15V表示1,+3~+15V表示0
  3. RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

串口参数及时序:

  1. 波特率:串口通信的速率(bit/s)
  2. 起始位:标志一个数据帧的开始,固定为低电平
  3. 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  4. 校验位(选填):用于数据验证,根据数据位计算得来
  5. 停止位:用于数据帧间隔,固定为高电平

无校验位:

 有校验位:

 1.2 串口通信时序图

串口时序:低位先行,先发送B0(先转换为二进制,然后先画低位波形)

发送一个字节的数据0x55(0101 0101):8位数据+1位停止位,无校验位

起始位低电平,停止位高电平

 偶校验位(低电平0):

 二、IIC协议

2.1 IIC协议简介

  1. I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  2. 两根通信线:SCL(Serial Clock)、SDA(Serial Data
  3. 同步,半双工
  4. 带数据应答
  5. 支持总线挂载多设备(一主多从、多主多从)

硬件电路:

  1. 所有I2C设备的SCL连在一起,SDA连在一起
  2. 设备的SCL和SDA均要配置成开漏输出模式
  3. SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

 

  1. 从机的权利比较小,对于SCL线,在任何时刻都只能被动的读取,从机不允许控制SCL线。
  2. 对于SDA数据线,从机不允许主动发起对SDA的控制。只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地获取SDA的控制权

主机的SDA引脚在发送的时候是输出模式,在接收的时候是输入模式。为了避免总线没协调好,导致电源短路的问题。IIC的设计是禁止所有设备输出强上拉的高电平

设计为弱上拉电阻(4.7K)加开漏输出的模式

这个模式具有“线与”的功能,只要总线上有一个输出低电平,总线就处于低电平。只有所有设备都输出高电平,总线才输出高电平。

2.2 IIC时序基本单元

起始和终止信号均由主机产生,从机不允许产生起始和终止信号,所以在总线空闲状态时,从机必须始终放手。

  1. 起始条件:SCL高电平期间,SDA从高电平切换到低电平。下降沿,触发起始条件。
  2. 终止条件:SCL高电平期间,SDA从低电平切换到高电平。上升沿,触发终止条件,回到最初的空闲状态(SDA和SCL均为高电平)
  3. 除了起始和终止条件,每个时序单元的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,即高电平

  1. 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据数据0表示应答,数据1表示非应答
  2. 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据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协议简介

  1. SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  2. 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)从机选择线,有几个从机,需要几根从机线,一人一根
  3. 同步,全双工(两根数据线,一根发送,一根接收,设备双方可以同时进行数据通信)
  4. 支持总线挂载多设备(一主多从)

SPI通信的基础是交换一个字节:有了交换一个字节,就可以实现发送一个字节接收一个字节,和发送同时接收一个字节,这三种功能。

硬件电路:

  1. 所有SPI设备的SCK、MOSI、MISO分别连在一起
  2. 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  3. 输出引脚配置为推挽输出输入引脚配置为浮空或上拉输入

从机SS引脚,输入低电平代表被选中进行数据通信,如果只有一个从机设备,SS引脚可以直接接地。

  1. 从机设备的DI:相当于MOSI引脚
  2. 从机设备的DO:相当于MISO引脚
  3. CS片选:其实就是SS

移位示意图:高位先行,每来一个时钟,移位寄存器都会向左进行移动一位。

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

在波特率发生器的上升沿:移出一位放到引脚上:

 

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

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

 3.2 SPI时序基本单元

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

CPOL::Clock Polarity,时钟极性

CPHA:Clock Phase,时钟相位

每一位可以配置为1或0,总共组合起来,共有4种模式。在实际使用中,只需要其中的一种即可。

注意:CHPA表示的是时钟相位,决定第一个时钟采样移入还是第二个时钟采样移入。并不能单独决定上升沿采样还是下降沿采样。

3.3 交换一个字节的时序图

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

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

通讯原理:

  1. SS高电平时,从机未被选中,MISO用一条中间的线表示高阻态。
  2. SS下降沿之后,从机的MISO被允许开启输出,SS上升沿之后,从机的MISO必须置回高阻态
  3. 移位传输的操作:因为CPHA = 1,所以SCK第一个边沿移出数据(所以在SCK第一个上升沿,主机和从机同时移出数据)。主机通过MOSI移出最高位B7,从机通过MISO移出最高位B7。
  4. 时钟运行,产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样。主机移出的B7进入从机移位寄存器的最低位B0。从机移出的B7进入主机移位寄存器的最低位。这样一个时钟脉冲产生完毕,一个数据位传输完毕。

通过上述步骤可以完成一个字节的交换。在SS的上升沿,MOSI还可以再变化一次,将MOSI置到一个默认的高电平或低电平,当然也可以不管他。MISO从机必须得置回高阻态,此时如果主机的MISO为上拉输入,那MISO引脚的电平为高电平。如果主机MISO为浮空输入,此时MISO引脚的电平不确定。

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

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

 3.4 模式1完整时序图

向SS指定从机设备,发送指令0x06

四、CAN协议 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/837029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

寄件管理系统设置教程

“企业寄件管理系统”或许是个小众词汇,但是“企业寄件”却是各家公司都不陌生的词汇。在经济和快递发展的双重影响之下,企业寄件早已成为企业运转的日常事项之一,企业寄件管理也越发被企业管理者所重视。我们对企业管理系统并不陌生&#xf…

go 基本语法(简单案例)

!注: go中 对变量申明很是严格,申明了,在没有使用的情况下,也会产生编译错误 1.行分隔符 一行就是代码,无;分割,如果需要在一行展示,需要以;分割,…

短信端口和端口短信的概念

什么是端口短信 端口短信是针对点到点短信来说的,点到点即手机直接发给手机的,端口就是使用软件发给手机的。软件是移动运营商合作的内容提供商开发的,遵守运营商的规范,有端口号。 短信端口是什么意思? 是针对点到点短信来说的,点对点即手机直接发给手机的,端口就是使用软…

C# PaddleDetection 版面分析

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using Sdcb.PaddleDetection; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

java:JUnit单元测试

背景 一般软件测试分为白盒测试和黑盒测试 黑盒测试:就是现在一般测试人员的工作点点点,只要功能正常就行白盒测试:需要关注代码的具体执行过程,是需要写代码的 JUnit 框架是进行白盒测试使用的。 不使用单元测试框架 没有单…

看一家头部实干派互娱公司如何玩转DataOps?

DataOps的概念自首次被提出至今已有8年,并在2018年被Gartner纳入数据管理技术成熟度曲线。从实施上看,当下DataOps仍处在发展初期,鲜少企业或团队能据此真正沉淀一套方法论或技术产品的体系。不过,随着越来越多的企业开启DataOps实…

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图: 弹框信息: Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…

行业追踪,2023-08-04

自动复盘 2023-08-04 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

idea使用protobuf

本文参考:https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf ? Protocal Buffers(简称protobuf)是谷歌的一项技术,用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的,所以用…

进程与线程、线程创建、线程周期、多线程安全和线程池(ThreadPoolExecutor)

目录 进程与线程线程和进程的区别是什么?线程分两种:用户线程和守护线程线程创建四种方式run()和start()方法区别:为什么调用 start() 方法时会执行 run() 方法,为什么不能直接调用 run() 方法?Runnable接口和Callable…

最强实战,接口自动化测试Python3+Requests+Unittest+ddt框架封装(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口自动化测试框…

RDP远程桌面服务的RD授权过期解决方法

RDP远程桌面服务的RD授权过期解决方法 一、打开远程桌面会话主机配置二、打开远程桌面授权模式属性三、选择远程桌面授权模式四、添加许可证服务器五、选择确定保存设置六、RD授权设置成功七、查看“授权诊断” 一、打开远程桌面会话主机配置 二、打开远程桌面授权模式属性 双…

35岁,不是体能衰老的分界线!

35岁,不是体能衰老的分界线 1. 35岁以上求职者同比增长14.9%,体能下滑成为35岁以上年龄群体的标签。 2. 35岁人群开始感觉经常失眠、腰背痛和肥胖,体力不济可能是常年累积的不规律作息和饮食习惯导致。 3. 35岁以后体能下滑,无法高…

视频添加字幕

1、依靠ffmpeg 命令 package zimu;import java.io.IOException;public class TestSrt {public static void main(String[] args) {String videoFile "/test/test1.mp4";String subtitleFile "/test/test1.SRT";String outputFile "/test/testout13…

openpnp - 吸嘴站(Nozzle Tip Changer)的选择

文章目录 openpnp - 吸嘴站(Nozzle Tip Changer)的选择概述磁铁吸嘴库带抱轴的吸嘴库我的吸嘴库选择我的吸嘴库实现 - 磁铁吸嘴库吸嘴座主体吸嘴座上盖我的吸嘴库实现 - 带抱轴的吸嘴库吸嘴座主体拔吸嘴时的受力挡板抱轴层上盖备注END openpnp - 吸嘴站(Nozzle Tip Changer)的选…

同城预约上门小程序开发:为用户带来便捷与个性化的服务体验“

上门服务小程序开发具有许多优势,下面我将介绍一些重要的优点。   方便快捷:上门服务小程序可以让用户随时随地通过手机进行预约和安排上门服务。无需等待电话回复或亲自前往实体店面,用户可以直接在小程序中选择时间、服务类型和地点&…

openGauss学习笔记-29 openGauss 高级数据管理-UNION子句

文章目录 openGauss学习笔记-29 openGauss 高级数据管理-UNION子句29.1 语法格式29.2 示例29.2.1 UNION29.2.2 UNION ALL openGauss学习笔记-29 openGauss 高级数据管理-UNION子句 UNION计算多个SELECT语句返回行集合的并集。UNION内部的SELECT语句必须拥有相同数量的列&#…

《剑指offer》(4)二叉树篇

二叉树深度有两种递归思路: (1)递归返回当前的深度,当root是空时,返回0 (2)将当前深度和节点一起传入递归,设置全局变量,每经过一个节点就更新全局变量的值。 方法一&a…

控制台窗口和powershell运行服务会卡住的解决办法

问题描述 在 windows 环境下开发的时候,使用 PowerShell 执行 python.exe test.py 等命令经常会出现程序会卡在不动的问题。这时候需要到控制台按一下回车程序才会继续往下执行。 解决办法 原因: 控制台开启了快速编辑模式的情况下,如果鼠标选中了文本…

弘扬“两弹一星”精神,勇攀科学技术高峰——道本科技商业大学党日活动圆满落幕

2023年8月2日,道本科技与商业大学携手举办了一场主题为“弘扬‘两弹一星’精神,勇攀科学技术高峰”的党日活动。本次活动旨在了解党领导下的中国核工业发展历程,传承和弘扬“两弹一星”精神,同时展示道本科技创新产品,…