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

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.mzph.cn/news/21795.shtml

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

相关文章

腾讯云COS+PicGO+截图工具+Obsidian+Typora+蚁小二:打造丝滑稳定的Markdown写作和分发环境

目录 背景 工具说明 腾讯云COS PicGO图片上传工具 截图工具 Obsidian Typora 蚁小二 首次配置完整演示步骤 腾讯云COS PicGO图片上传工具 截图工具 Obsidian Typora 蚁小二 使用总结(简单又丝滑的编辑步骤) 背景 很久很久以前&#xff…

【蓝图】p47下车减速功能

p47下车减速功能 p47下车减速功能加速功能下车减速功能 p47下车减速功能 加速功能 上图是ue自带的加速功能,检测到按w时输入轴会传1给设置油门输入,就会加速 所以,减速也可以通过蓝图反方向制作 下车减速功能 打开Sedan蓝图类的上下车图表…

Java网络编程

目录 1.网络编程 2.Echo模型(服务器与客户端实现通信) 3.BIO处理模型(实现多用户访问同个服务器) 4.UDP程序 1.网络编程 有两种通信模型 C/S(Client/Server)基于客户端和服务器端,实现代码时候需要实现客户端与服务器端 B/S(Browser/S…

QtWebApp开发https服务器,完成客户端与服务器基于ssl的双向认证

引言:所谓http协议,本质上也是基于TCP/IP上服务器与客户端请求和应答的标准,web开发中常用的http server有apache和nginx。Qt程序作为http client可以使用QNetworkAccessManager很方便的进行http相关的操作。Qt本身并没有http server相关的库…

使用Git在GitHub上部署静态页面

在GitHub中,我们可以将自己的静态页面部署到GitHub中,它会给我们提供一个地址使得我们的页面变成一个真正的网站,可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()?HashSet通过反序列化间接执行equals()方法如何使hash相等? 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值? 【java安全】…

WSL1升级为WSL2

首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包,…

HTML 是什么?它的全称是什么?

聚沙成塔每天进步一点点 专栏简介HTML是什么?HTML的全称是什么?写在最后 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对We…

ad+硬件每日学习十个知识点(16)23.7.27 (总线保持、lin报文、逻辑器件手册解读)

文章目录 1.总线保持是怎么实现的?有什么需要注意的(驱动电流和电阻)?2.LIN报文3.芯片datasheet的features、applications、description看完,应该能大致判断逻辑器件能否满足我们的要求。4.什么是逻辑器件的传输延时&a…

WiFi无线组网温湿度实时监测系统

近年来随着我国电子技术和无线通信技术的快速发展,远距离数据采集传输被应用到众多领域,由于事关环境安全和生命健康,受到了各行各界的关注。在温湿度监测中,目前采用的通信技术主要是4G、WiFi、以太网、LoRa等,今天&a…

docker删除容器(步骤详解)

要在Docker中删除容器,需要使用命令docker rm。 下面是详细步骤: 1. 首先,使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小,但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求,并且在Windows 10上有Aero效果。 先看一下效果&#xf…

zabbix监控mysql容器主从同步状态并告警钉钉/企业微信

前言:被监控的主机已经安装和配置mysql主从同步,和zabbix-agent插件。 mysql创建主从同步:http://t.csdn.cn/P4MYq centos安装zabbix-agent2:http://t.csdn.cn/fx74i mysql主从同步,主要监控这2个参数指标&#xf…

Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

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

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

ThinkPHP5使用phpqrcode生成二维码

生成指定跳转地址二维码图片: 首先将下载好的phpqrcode.php文件放到指定目录内(我这里用的放在public/phpqrcode目录下),准备调用 之后控制器中调用 public function qrcode(){require_once "./phpqrcode/phpqrcode.php&quo…

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术,用于去除图像中的噪声。它的原理是用一个滑动窗口(也称为卷积核)在图像上移动,对窗口中的像素值进行排序,然后用窗口中像素值的中值来替换中心像素的值。这样,中值滤…

SHELL——备份脚本

编写脚本,使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

游戏开发人员如何从 Splashtop 中受益

游戏开发时代在不断发展,远程办公、协作和高性能需求变得越来越普遍。因此,对复杂工具的需求不断增加,这些工具不仅可以满足这些需求,还可以为开发人员提供无缝体验。 其中一个工具是 Splashtop Business Access Performance&…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为R…