常见的硬件数据通信协议

通信协议介绍

在做各种课题设计时候,经常会用到的就是使用“**通信”进行传输。最开始一直是处于一脸懵的状态。编写程序时候百思不得其解,怎么编写这个通信协议?
后来花了很长时间去弄清楚了这些概念,结果在做设计时候一问组员都是一脸懵,根本不清楚通信协议是用来干什么的。所以自己整理了一遍思路,也方便自己加深理解。

在硬件上,我们经常需要多个设备之间相互进行通信。这些设备之间的相互通讯,一定都是按照一个统一规定的协议进行传输的。换句话说,也就是规定了两个设备之间的传输是怎么开始的,怎么结束的,哪些是通信的内容,怎么检验通信过程是否出错等等问题。
具体的通信协议都是通过对应的编程语言写入对应的硬件设备中,就像往两个设备中放了两个守门员,对于传输的数据进行把关,从而建立通信进行传输。
这里介绍几个硬件上常用的通信协议:

  • IIC通信
  • 串口通信
  • SPI通信

1、串口通信

串口是计算机设备,多种仪器设备等上常用的协议。

在并行通信中,一个字节(8位)数据是在8条并行传输线上同时由源传到目的地。因此这样的传输方式传输速度更快,传输效率高,但是占用资源也多。
而在串行通信方式中,数据是在单条1位宽的传输线上一位接一位地顺序传送。这样一个字节的数据要分8次由低位到高位按顺序一位位地传送。这样的传输方式虽然成本低但是传输速度慢。

(从其他地方down的图)

在串行通信中,又分为几种不同的传输方式:
单工、半双工、全双工
单工意味着信息只能单向传递,而半双工则是信息可以双向传输但是不能同时双向传输,全双工指的是信息可以同时双向传输。
在时序上,串行通信又分为两种方式:同步通讯异步通讯

下面介绍具体的通信过程:(以单工为例)
在两个设备进行相互通信时,以一帧数据为单位进行传输。而一帧数据中包含起始位、数据位、校检位、停止位组成。
其中,校检位分为奇校检和偶校检:

  • 奇校验
    将最高位作为数据的奇偶校验位,所谓奇校验,就是保证一个字节的数据中1的个数必须是奇数,若不为奇数,则在最高位添1.,保证1的总是为奇数
  • 偶校验
    若一个字节中的1不为偶数,则在最高位添1,保证1的总数为偶数

校检位不是必须有的,可以根据具体情况进行设定。

开始传输时,传输线拉低作为起始位,拉低一个单位时间后就开始传输数据。一般的数据位为八位,待数据发送完成后,进行校检位传输并进行验证。接着接收高电平停止位(停止位都是1),根据设定的停止位持续时长进行判定,比如设定停止位为保持高电平1.5个时间单位。
每帧数据之间相隔若干个不定时间长度,空闲时间传输线一直保持高电平状态。
在这里插入图片描述

2、IIC通信

IIC通信一般用于主从通信,即由主控制器发起,从设备进行响应的通信过程。该通信方式可以通过总线连接多个分立设备,通过唯一的地址与主机进行通信。
IIC通信共用到了两根线,一根是SDA数据线,另一根是SCL时钟线。在SDA数据线上,只负责传输来往的数据信息,至于对传输过程的控制,由SCL时钟线进行控制。

在这里插入图片描述
具体的通信过程:
时钟线SCL在空闲时间为高电平,SDA数据线为高电平。
开始通信:
需要开始通信时,在SCL为高电平期间,若SDA从高电平跳变到了低电平,则意味着通信开始,此时时钟线SCL开始进行传输控制,数据线上的数据传输依据SCL时钟进行传输。
结束通信:
结束通信时,将SCL时钟线再次拉高,在SCL保持高电平的状态下,若SDA从低电平跳变为高电平,则通信结束。此时SCL恢复为低电平状态。
在这里插入图片描述
前面说了IIC通信主要用于主从通信,即开始通信和结束通信都是由主控制器发起,从设备接收到信息后进行应答。
IIC通信中由于是单个总线进行通信,连接总线的可能有多个从设备,所以通信内容必须包含唯一明确的通信地址才可以保证通信的顺利进行。
因此,在起始信号发起后,接着就是七位的从设备地址,第八位则规定了通信方向。即“1”代表主机接收数据,从设备发送数据,而“0”代表主机发送数据,从设备接收数据。
每次传输数据位完成后,从设备需要产生应答信息,即从设备的SDA线产生一个单位时间的低电平表示应答,而高电平则表示非应答。

3、SPI通信

SPI通信也分为主从模式,不同的是SPI一共有四根线。其中两根数据线MOSI以及MISO,一根时钟线SCK,一根片选CS线。
两个数据线分别为主机接收(MISO)、主机发送(MOSI)两路数据。
SPI通信也存在着一个主机,多个从设备相互通信的情况,所以在主机与指定的从设备进行通信时,需要对从设备进行选定。片选CS即是为了选定某一个从设备,从而让主机单独的与该从设备进行通信。
时钟线SCK依然像其他的时钟一样,做传输控制。

当开始进行通信时,先选定与主机进行通信的从设备,拉低该设备的CS线,表示该设备与主机通信。
在这里插入图片描述
有一点需要注意的是,在SPI通信中,没有特定的读写操作。主从设备进行的是数据交换,主机发送出数据就必然会接收到数据,主机想要接受到数据就必须向从机发送数据。

主机与从机中都有一个移位寄存器,主机向它的寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 数据线将信号传送给从机,从机也将自己寄存器中的内容通过 MISO 信号线返回给主机。这样,两个主从设备间就完成了一次信息传输,读写操作是同步完成的。
SPI有四种传输模式,通过CPOL(时钟极性)和CPHA(时钟相位)来控制。
CPOL时钟极性:用来设定SCLK的电平状态为有效
CPHA时钟相位:用来设定数据采样在SCL哪个跳变
则根据两个控制信息产生出四种传输模式:

  • Mode0:CPOL=0,CPHA=0
  • Mode1:CPOL=0,CPHA=1
  • Mode2:CPOL=1,CPHA=0
  • Mode3:CPOL=1,CPHA=1

Mode0:SCK处于低电平为空闲态,数据采样在上升沿,数据发送在下降沿。
Mode1:SCK处于低电平为空闲态,数据采样在下降沿,数据发送在上升沿。
Mode2:SCK处于高电平为空闲态,数据采样在上升沿,数据发送在下降沿。
Mode3:SCK处于高电平为空闲态,数据采样在下降沿,数据发送在上升沿。
在通信过程中,通信双方必须工作在同一种模式下,而且SPI通信没有了IIC通信中从机应答的环节,比IIC通信要简单。

总结

上面写的三种通信协议都是大体介绍了概念,能弄清楚各种通信协议的具体方式和过程就好,至于具体通信时的各种细节,就需要在编写程序时认真的思考每一个变量,每一个时钟的作用,认真分析时序。
本文中引用的图也是从其他帖子上down下来的,这里我分别找了三种通信协议的具体详细说明:
1、SPI通信
2、IIC通信
3、串口通信

【注】个人学习笔记,请不吝赐教!

猜你喜欢

转载自blog.csdn.net/zsisinterested/article/details/119283387