【初入电子坑之通信入门篇(一)】通信基础概念

491 阅读8分钟

本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力

前言

通信是嵌入式的重要组成部分,本人简单试水过后发现此坑略深,以目前应用为主的策略来看,不宜陷得太深。所以这系列笔记文章主要围绕“这是什么?”“它的大致原理是什么?”展开讨论。基本上会忽略绝大多数诸如“为什么需要它?/它是怎么顺理成章的推出来的?”的这类问题。(因本人才疏学浅,若有叙述不当之处,恳请各位大佬指正。)

目录

image-20210427232632309

一、通信本质

通信通信,说白的就是信息互通。人跟人间的信息互通、机器跟机器间的信息互通、机器跟人间的信息互通。

而想要做到互通,主要有两个问题需要解决,“信息该如何表示?”和“信息该如何传输?”两个核心问题。

我们知道信息交互中,最原始、朴素的表示是0和1。其中,信息传输主要指01串在传输介质上传输的过程。这个过程具体上跟诸如无线电、光纤、电缆如何操作实现有关,不在本文讨论范围。所以本文主要讨论的是“信息该如何表示?”这一问题。

那么:

  • 在电子世界中如何表示0和1?
  • 信息的发送方和接收方如何解析?
  • 如何用0和1的组合表示我们所要传达的信息?

就是值得讨论的问题了。

二、信息表示

2.1、01信号表示

首先,在电子世界中0和1的表示,目前大致有两种方式:

  • 电平信号
  • 差分信号

2.1.1、电平信号

电平信号,简单来说就是根据一根线上的不同电压区间划分成高电平和低电平(如:大于3.3v为高电平,低1.5v为低电平等),通过人为定义高电平为0或1来传输信息。

而又因为几乎不可能做到不同设备间电压完全一致,所以为了保证收发双方电压的一致性,电平信号传输通常需要再加一根GND线作共地用。(下中两个矩形为通信的两个设备)

电平信号示意图

2.1.2、差分信号

差分信号这哥们可以说是电平信号的弟弟。前人发现,在长距离信息传输时,传输线会变成不可忽略的等效电阻,从而造成明显的压差,致使信息丢失、失真等现象。而且电平信号只有一根数据线,容易受到电磁干扰等等。

因以上原因,差分信号线就粉嫩登场。

img

既然你一根信号线容易受电磁干扰、长距离传输有明显压差,那么我用两根信号线表示,根据两根信号线同一时刻的压差区间定义0和1不就可以增强抗干扰性和增长了传输距离嘛。这就是差分信号的思想。

但差分信号也不是没有缺点的。

它的问题在于线材的花销是电平信号的两倍。当我们同时传输n路信号时,电平信号只需要n+1根线(n根信号线,1根共线线),而差分需要2n根线。所以电平信号和差分信号本身并无优劣之分,主要看使用场景进行选择。

2.2、信号解析

信号解析的操作过程而言,其实就是信号解码的过程。发送方通过对01串进行编码发送给接收方,而接收方通过之前约定的编码规则逆向解析。

这个发送和接收的过程中会产生两个问题:

  • 接收方怎么知道发送方什么时候发送了信息?
  • 如果发送了信息,又发送了多少信息?

由以上两个问题可以引申出两种不同的通信方式:

  • 同步通信
  • 异步通信

2.2.1、同步通信

同步通信,在表现形式上就是在收发双方之间加了一条时钟线。通过结合时钟线SCL的电平状态和信号线SDA的电平状态组合出诸如:起始信号、终止信号、实际想要发送的0/1信号等。

如单片机中最常用的I2C协议,它的起始和终止信号就是通过判断时钟线SCL在高电平时,信号线SDA的边沿跳变情况决定的。(关于I2C的具体内容,不了解的朋友可以自行搜索学习。)下图为同步通信示例,I2C协议的拓扑连接图。

I2C常用连接方式

2.2.2、异步通信

异步通信跟同步通信的最大区别在于——异步通信没有时钟线,只有信号线和地线。

既然没有的时钟线作为辅助,那么信号线SDA就需要传输包含更多的信息,以替代时钟线的作用。诸如:

  • 我们接收方需要知道收到怎样的信号时表示一个数据的开始。
  • 怎样的信号表示一个信号的结束。
  • 怎样的信号表示需要传递的数据本身。

因此,异步通信传输的01串里,必然需要包含起始位、停止位,以及真正需要传输的数据的数据长度。

不仅如此,我们还需要统一一下收发双方的传输速率,以便接收方能及时且准确的处理发送方发来的数据。

这个传输速率,我们一般称为波特率。波特率指的是每秒钟传送的码元的个数。至于码元是啥。。。由于本人太菜,这个概念的实际内涵还没理解透彻。但在通信过程中,常常一个码元等于一个比特,所以在通信过程中,波特率在大多数情况下,可以理解为比特率。即每秒钟传送得到比特个数。

2.2.3、小结

同步通信:

优点: ​ 1、可以根据不同时钟线边沿的不同,判断信息的采集与否。 ​ 2、不用添加额外的状态位,增加了信息传输密度。

缺点: ​ 1、需要时钟线协调。 ​ 2、占用发送端和接收端双方的资源(收发双方都需要,时刻关注时钟线的)。

异步通信:

优点: ​ 1、不需要额外的信号线,所占用线较少。 ​ 2、只占用接收端的资源(需要时刻关注数据线的电平变化情况,但发送方不用)。 ​ 缺点: ​ 1、需要状态位表示收发状态。 ​ 2、需要协定信息传输速率协同双方的信息处理。

比较结论:
  • 同步通信比异步传输效率更高,适合信息交互频繁的场合。
  • 异步通信,相对整体占用资源较少,适用信息交互相对较少的场合。

2.3、通信协议

知道了0/1如何表示,也知道了收发双方对信号解析应该注意的事项。那么就还剩最后一个重要的问题了,即:如何用0和1的组合表示我们所要传达的信息?

换句话说,对于一大串01序列应该如何解读?

这个问题就属于编码的范畴了,如何编码是通信协议规定的。不同的协议有不同的编码方式,这个在学习具体通信协议时会感受到。但它们无外乎遵从以下几点:

  • 0/1表示
  • 信号解析
  • 编码方式
  • 传输方向

传输方向前面没有提到,这里简单的介绍下。

2.3.1、传输方向

通信的传输方向可以分为以下三种:

  • 单工通信:任何时刻都只能单向传输信息。
  • 半双工通信:同一时刻只能单向传输信息,即在通信过程中可以改变传输方向。
  • 全双工通信:任何时刻都可以双向传输信息。

由以上定义其实可以看出,一般单工和半双工都是通过一根信号线实现的,而想要实现全双工,则需要两根信号线用两个端口接收。

2.3.2、常见通信协议

有关通信协议的主要问题,个人觉得有上面的理解差不多够了。下面是简单介绍下载单片机中常用到的通信协议:

  • 串口协议:皆为异步协议。
    • RS-232:电平信号
    • RS-485:差分信号
  • I2C总线协议:同步半双工协议(电平信号)
  • SPI总线协议:同步全双工协议(电平信号)
  • 。。。。。。

三、缓存方式

在通信过程中,缓存机制是很有必要,至于为什么,请看下图:

缓存的必要性

接收端其实也是同样的道理,由此看出缓存机制的必要性。

而常见的缓存机制有两种:

  • FIFO
  • DMA

学过数据结构的朋友对FIFO应该都不陌生,first in first out,先进先出的队列结构。

还是发送端为例,应用到上述过程中的话,就是cpu把要传的数据先丢给寄存器,由该寄存器一个bit一个bit的丢给发送端口,CPU就去干其他的活了。

但寄存器的存储空间很有限,很多情况下还是要把需要发送数据拆分成多个段落分次传输,所以引申了一个原理类似,但比寄存器存储空间要大的缓存机制——DMA。

更多关于DMA的讨论,我们后面再聊~