这些不同的通讯手段之间其实有着许多隐藏的共性。
物理层到数据链路层扒一扒这些通讯手段的底层原理。
物理层与数据链路层这两个概念:
ISO国际标准化组织在上世纪70年代末, 把计算机网络通信的整个框架描述成了一个七层的模型,并称之为OSI开放系统互联模型
我们最直观地
能感受到的通信方式的区别
诸如通讯的速率,电平的范围,用几根线,同轴还是双绞线,这些都体现在最下面的物理层,而如何把物理线路上的比特流正确的切分并识别出一帧数据内部的结构,则被我们成为数据链路层。
物理及链路的演变逻辑:
我们先从最简单的形式出发:
只用1根线通信,这根线我们通常理解为最多只能实现半双工通信,同一时刻不是你发我收,就是你收我发。但这就存在几个问题,一方面是难以实现两者的同时通信;进一步的收发节奏上要么得分个主从由某一方来控制;要么做个约定,错开时间来发送,不然两边同时想发的话就僵住了;而且,速率上只能是提前约定好,接收方以一个什么样的时钟频率去采样线上的电平才是对的。先解决同时通信的需求,很好办,
我再加一根线,你发你的我发我的,这样就互不干涉了,也不存在同时发送的冲突了,(暂不考虑共地的话)这就已经是我们常见的uart串口了,但这种情况下,速率还是得提前约定,不然盲目解析的结果就是乱码,
有了两根线之后,双方都获得了自由,收发的节奏也不受约束了,假设速率也约定好了,但问题是怎么正确提取一帧有效的数据?
毕竟一根线只有0和1两种状态(NRZ情况下),空闲与非空闲本身也不好识别,这时候就需要在数据链路层增加一些额外信息,来标记一帧有效数据,也就是帧头和帧尾,
以uart为例,在一帧8bit的数据的基础上,加上起始位与结束位,并且规定空闲时为高电平,用额外的两个bit来保证数据正确接收,这个代价是可以接收的。
但正是因为帧头和帧尾过于简单,所以数据帧还得规定好固定的长度,接收方根据这个长度来提取,不然也没法判断某个电平是真实数据还是头尾的标识符。
这样一来相对又不那么灵活了,那我们在回过头来看,用一根线来实现半双根通讯的也不是没有,当然暂不考虑共地的问题,LIN就是这样的。作为一种支持多个节点通讯的总线,LIN制定了固定的主机节点,并且参考uart的链路层,
在10bit划分一个字节的基础上,定义了ID段,检验段,时钟同步段和间隔段,
前半部分为帧头,由主机发送到总线,从机接收;
后半部分应答则有相应测从机发送,主机接收;
所以但双工的LIN通过链路层上较为复杂的处理+提前预设好的调度顺序,也能保证较低速率下多设备通信的节奏。另外,从数据链路层的共性也能看出能支持uart的芯片一般也能支持LIN,只需要配合上相应的物理层芯片即可。
补充:前面所说的一根线都是理论上的,省略了通信双方共同的参考地线。因为它并不一定以物理线路的形式实现,通讯方向,和节奏到目前为止都可以解决了,但是速率目前尚且还是不能灵活改变。
按照刚刚的思路还能通过加线来解决?
回到一根线数据线的基础上,再加一根方波形式的时钟线,
那接收方的采样就根据我的时钟来
没有时钟了自然也就代表停止发送了,这样不仅速率有了依据,数据传输的节奏也很明确,比方我约定时钟上升沿发送对面就下降沿采样。这样总是能够确保一个时钟周期内双方能够正确传输一个bit,这就是同步传输。
进一步的,因为现在我们有两根不同作用的线了,我们还可以用这两根线的电平组合,来切分bit流的依据。
规定时钟高电平的时候数据线不允许变化,低电平在变换;
如果时钟高电平时数据线发生了跳变,就正好当做是开始和结束的标志
用两根线的组合判断,而不是只看数据线的特殊电平,这样一来,接收端也不用数固定bit来确定采样的终点了。理论上帧长度也不需要提前约定死而变得灵活了。如果在加上应答与流控机制,就能够很好地实现半双工总线通讯了,比如使用两个双向开漏线,引入线与特性,从机在正确接收后就能通过在数据线上主动拉ack来通知主机,如果没做好接收数据的准备,从机还能通过拉低CLK来影响主设备的发送节奏,如果在多主机场景下,同时发送数据时所需要的仲裁机制也能够通过线与特性来实现,到此,其实就是i2c总线的雏形了。
接下来再解决半双工到全双工的问题:
老思路,再加一根反方向的数据线。
对方发过来的数据也由刚刚那根时钟线的时钟来驱动。
这样的形成的全双工,双方的发送节奏其实都由一方控制,也就形成了天然的主从关系,虽然少了各自发送的自由,但确定性也大大增强。
如果满足与多个从设备的通信,那就在带上一根用于选中从设备的片选信号。
用来使能不同的通讯对象。与此同时,还能进一步解放数据线,寻址、ID什么的都省了,就只传输纯粹的有效信息,利用率也提高了一些,这其实就形成了标准的四线SPI。到SPI为止,我们对通讯的基本要求都满足的差不多了。
但直到现在,我们似乎一直是在做加法。那么进一步我们想提高通信的距离、稳定性、和速度呢?
距离与稳定性
前面提到的I2C、UART、SPI都常常用在板级器件之间的通讯,实现共地也比较简单,但他们很少用在大于一米的长距离通信上。另外这些信号线基本每一根都有各自的作用,而独立的一根线不仅容易受到外界干扰,它本身电流的高频变化还会对外产生电磁干扰
(EMI & crosstalk)。影响到周围的器件说到电磁干扰
,直接的解决思路肯定是屏蔽干扰。同轴电缆就是这样一个解决思路。通过加屏蔽层来实现抗干扰性,但相对应的,线缆体积、重量、成本和抗扭抗弯的属性就有点拉胯了,在很多领域已经渐渐淘汰不再使用,哎,那非直接的解决思路呢?就有聪明的工程师想到,就再加一根线,传输极性完全相反的差模信号,用两根线的差分电平来表示一个信号,这样外界的干扰能够被差分电平所消除。
如果因为两根线的线距导致干扰产生的相位不同呢?
我们只需要把这两根线绞起来
干扰就基本会均匀地影响两条线
这样就方便后端通过共模扼流圈等结构来抑制噪声
通讯线在受到外部干扰的同时,本身的交变电流也会对外产生磁场,而双绞线的另一好处就是螺旋缠绕的两根线因为极性相反,也会产生相反的磁场,相互抵消,会大大减弱对外可能产生的串扰,这让双绞线在很多场景下有巨大的优势。网线里面就是有一股一股的双绞线缠绕而成的。常见的百兆100BASETX用到2对4根,千兆的1000BASE-TX用的是4对8根,车载以太网的100BASE-T1则只用一对。
现在这种情况下,时钟线如果还要带上,那就要多出一对双绞线,毕竟不是PCB走线了,成本考虑,我们现在要开始做减法,把时钟线也得去掉,回归异步通信。
再次以很多汽车行业小伙伴所熟悉的CAN举例,它也是一个经典的使用双绞线作为物理线缆的通讯方式,某种程度上来说,CAN和I2C有些相像,同样是单数据线(差分vs单端)实现的半双工,同样的线与机制,总线拓扑形式也类似,也有寻地和应答,然而因为没有时钟线,CAN在数据链路层的顿格式和更上层的协议方面都要复杂很多;物理层上的区别看上去主要在于数据线由单端信号变差分信号,相比前面提到的几种通讯方式而言,需要额外的IC加持,也就是Transceiver或者称之为phy芯片也可以。且去除了时钟线,只能通讯双方以约定的速率采样,所以对于can而言,计算链路的延时,确定采样点就显得尤为重要,当然这其中还涉及硬同步、重同步等多个步骤以确保数据的正确
采样,这里暂时按下不表。但是因为有双绞线特性的加持,相比之前的这几种通讯,CAN的通讯距离和抗干扰能力上升了一个台阶,良好的EMI特性使得它成为汽车工业上最主流的通讯方式之一。
玩过CAN的同学可能多少都会对一个东西很熟悉,那就是终端电阻,如何去理解终端电阻的作用呢?我们都知道,光线的传播,在通过不同的介质时,会同时发生折射与反射,而信号在导线上传输的时候,也会在不同阻抗介质的交界处,一般是终端,产生反射波,从而对正常的信号产生干扰,而终端电阻的作用:就是为了消除总线阻抗不匹配时产生的反射。
当然使用双绞线也不可能摆脱线缆固有的电阻电容的影响,所以传输距离的增强也是有限的,再想提高,就涉及到光纤和无线电磁波传输了,等于是切换了介质。