各类通信协议归纳整理偏硬件
各类通信协议归纳整理(偏硬件)
本文主要用于学习,资料及图片多来源于网络,若存在侵权请联系作者删除,若存在错误,请批评指正。
1 通信基本概念
通信一般有三个步骤:编码、传输和解码。
可分为同步通信和异步通信:
同步 :需要时钟信号
异步 :一般有起始和终止信号。
可分为电平信号和差分信号:
电平 :信号逻辑值由信号线电平和参考电平决定(一般为地)
差分 :没有参考电平。信号逻辑值有两根差分线的电压差决定。
可分为单工、半双工,全双工
单工 :信号方向只能单向
半双工 :方向能双向,即可发送和接收,但是不能同时发送和接收。
全双工 :可以同时发送和接收。
2 串口通信
2.1 基本概念
串口 :在嵌入式里指的是UART口,在台式机一般是COM口,用RS232 RS422 RS485
UART :, Universal Asynchronous Receiver-Transmitter, 通用异步收发器 ,常用TTL电平即3.3V或者5.0V。
COM口 :在台式机上常用的口,DB9口,接口协议:RS232和RS485,RS422;
UART口(四针:RXD TXD GND VCC,三针,两针)、COM口(9针)指的是物理接口形式;TTL、RS232和RS485指的是电平逻辑标准。RS422 RS485也有16针的接口。
2.2 UART 硬件接口
2.2.1 波特率、起始位、数据位、奇偶校验位、停止位
波特率 :bit/s,指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。常见的有 9600 115200
一个通信单元由:起始位+数据位+奇偶校验位+停止位组成的。
空闲位 :UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。
起始位 :开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。依靠检测起始位来实现发送与接收方的时间自同步的。
数据位 :可以是4、5、6、7、8位,一般是8位,协议规定是LSB。
奇偶校验位 :数据位加上这一位后,使得“1”的位数为偶数(偶校验)或奇数(奇校验)以此来校验数据传送的正确性;
停止位 :一个字符数据的结束标志,可以是1位、1.5位、2位的高电平。
串口通信时因为是异步通信,所以通信双方必须事先约定好通信参数,这些通信参数包括:波特率、数据位、校验位、停止位(串口通信中起始位定义是唯一的,所以一般不用选择)。
通信线 :RXD TXD GND ,也可能会有VCC,还有一些流控线。
2.2.2 UASRT
USART(通用同步/异步串行接收/发送器),相比UART,USART多了一个时钟信号。在STM32使用中,我一般把时钟禁用,当做UART使用。
2.3 电平
2.3.1 TTL电平
主要看中间两种,关注5个参数。
输入高电平(Vih)输入低电平(Vil)输出高电平(Voh)输出低电平(Vol) ,这四个就顾名思义了。
阀值电平(Vt) :数字电路芯片都存在一个阈值电平,就是电路刚刚勉强能翻转动作时的电平。
一般情况下,在嵌入式中使用,只需要设置寄存器后,就能完成对UART的初始化。
2.3 RS232 通信协议
物理接口,硬件接口:DB9
2.3.1 RS232电平
在TxD和RxD 上:逻辑1(MARK)=-3V~-15V ,逻辑0(SPACE)=+3~+15V 反逻辑
在RTS、CTS、DSR、DTR和DCD等控制线上 上:
信号有效(接通,ON状态,正电压)=+3V~+15V
信号无效(断开,OFF状态,负电压)=-3V~-15V
RS232和UART的区别和联系:UART就是车站,RS232 RS485 RS422 TTL的串口都是每一辆公交车,有不同的规则。
2.3.2 RS232与TTL的转换
从TTL转为RS2323电平,由于二极管与电容的作用使得在二极管D1与电容C7交接处的电压保持在-3V~-15V.
当TXD为"1"(TTL)时,Q3截止,PCRXD上的电压与PCTXD电压相等,也是-3~-15V,为"1"(RS232)
当TXD为"0"(TTL)时, Q3导通,则PCRXD电压约为+5V,这个电压在+3~+15V之间,根据RS232电平,它是"0"…也就是说TTL的"1"经过这个电平转换电路后,RS2323可以识别出它是"1",是"0"也能识别为0.这就实现了从TTL到RS232的电平转换.
从RS232转换为TTL电平那就简单了,当PCTXD为"1",即-3~-15V时,Q4截止,RXD电压约为5V,为"1",当PCTXD为"0"时,Q4导通,电压为0,电平为"0".那么从RS232到TTL的电平转换也实现了.
备注:D2是为了防止Q4的BE反向击穿,TXD的最低电压时15V,Q4的BE耐压是6V左右。?
简略大概的说:
当TXD=1时,Q3截止,导致PCRXD=1;
当TXD=0时,Q3导通,导致PCRXD=0;
当PCTXD=1时,Q4导通,导致RXD=1;
当PCTXD=0时,Q4截止,导致RXD=0;
2.3.3 RS232 DB9接口
针号 | 功能 | 缩写 |
---|---|---|
1 | 数据载波检测 | DCD |
2 | 接收数据 | RXD |
3 | 发射数据 | TXD |
4 | 数据终端准备 | DTR |
5 | 信号地 | GND |
6 | 数据设备准备好 | DSR |
7 | 请求发送 | RTS |
8 | 清除发送 | CTS |
9 | 振铃提示 | DELL |
2.3.4 RS232 直连和交叉
两个设备如果要通信,应该要交叉连即A的TXD连B的RXD,才能实现通信。如果仅是设备的延长,可用直连线。本质还是要看设备如何连接,确保能够通信。
2.4 RS485
2.4.1 为什么会出现RS485
为了解决RS232出现的一些问题。
1:RS232接口电平比较高
2:采用共模传输,抗噪声能力差
3:数率低,20kb/s
4:传输距离有限
这些一部分是共模传输导致,一部分是电平导致,RS485解决了一部分问题
2.4.2 RS485的DB9接口
针号 | 功能 | 缩写 |
---|---|---|
1 | 485的A | RS485(A+) |
2 | 485的B | RS485[B-] |
3 | 空 | N/C |
4 | 空 | N/C |
5 | 信号地 | GND |
6 | 空 | N/C |
7 | 空 | N/C |
8 | 空 | N/C |
9 | 空 | N/C |
由线序可知,RS485是一种差分的信号传输。RS485的物理接口不仅是这种,还有凤凰头。使用双绞线传输
2.4.3 RS485的电平
RS485电平 由于两者均采用 差分传输(平衡传输)的方式,所以他们的电平方式,一般有两个引脚 A,B
发送端 AB间的电压差。
+2 ~ +6v 表示1
-2 ~ -6v 表示0
接收端 AB间的电压差
大于 +200mv表示1
小于 -200mv表示0
定义逻辑0为A<B的状态
定义逻辑1为A>B的状态
AB之间的电压差不小于200mv
且可以看出,他的工作方式只有两根数据线,说明是一种半双工的工作方式
2.4.4 RS485可以进行点多对的传输
要求一个主机,多个从机。如图:
在同一总线上最多可以挂接32个节点。要求有地址码。主机可以一直发送,从机只能有一个发送,且从机不能互相通信。
2.5 RS422
RS422其实是RS485的前身,很多地方都与RS485一致。不同在于RS422是四线,用一对差分来发,一对差分来收,RS485是只有一对差分,收发都用这两根线。
2.5.1 RS422的DB9接口
针号 | 功能 | 缩写 |
---|---|---|
1 | 发送数据差分正端 | TXD+ |
2 | 发送数据差分负端 | TXD- |
3 | 接收数据差分正端 | RXD+ |
4 | 接收数据差分负端 | RXD- |
5 | 信号地 | GND |
6 | 数据设备准备好 | DSR |
7 | 请求发送 | RTS |
8 | 清除发送 | CTS |
9 | 振铃提示 | DELL |
可以看出,RS422是一种全双工模式。
问题:查阅的资料中,有些DB9的RS485和RS422中端口定义不太一样,有些是1脚为-端,有些是1脚为+端。因为这个DB9不是RS232那种标准接口协议,会有一定争议。还会有其他的物理形式接口,如凤凰头,网口等,但是差分两根线都是要用屏蔽的双绞线。
2.5.2 RS422的电平
与RS485一致,不再赘述。
2.6 RS232 RS485 RS422的对比
串口协议 | RS232 | RS485 | RS422 |
---|---|---|---|
双工模式 | 全双工 | 半双工 | 全双工 |
工作方式 | 单端(电平,共模) | 差分 | 差分 |
速率 | 20kb/s | 10Mb/s | 10Mb/s |
接口 | 不固定,DB9主要有3根线TXD RXD GND | 不固定,DB9主要有3根线DATA+ DATA- GND | 不固定,DB9主要有5根线TXD+ TXD- RXD+ RXD- GND |
连接方式 | 点对点 | 点对多 | 点对多 |
电平 | 逻辑0:+3V~+15V | 逻辑0:两线电压差-2V~-6V | 逻辑0:两线电压差-2V~-6V |
电平 | 逻辑1:-3V~-15V | 逻辑1:两线电压差+2V~+6V | 逻辑1:两线电压差+2V~+6V |
2.7 未完成项
端接匹配
串联并联
3 IIC通信 总线
I²C(Inter-Integrated Circuit),中文应该叫集成电路总线。iic也是串行通信,但是与串口的区别在于,一个是同步,就是有时钟信号,一个是总线型,与RS232那种异步的接口型有一定区别。
3.1 硬件结构
I²C协议仅需要一个SDA和SCL引脚。SDA是串行数据线的缩写,而SCL是串行时钟线的缩写。这两条数据线需要接上拉电阻。值得一提的是多数通信默认都是高电平。
从上面可以看出,它是一个同步的通信模式,所以没有固定的波特率,波特率由SCL决定。
传输速度;
标准模式:Standard Mode = 100 Kbps
快速模式:Fast Mode = 400 Kbps
高速模式: High speed mode = 3.4 Mbps
超快速模式: Ultra fast mode = 5 Mbps
它是一个总线,就是他可以实现多主设备通信,即多对多通信。使用I²C,可以将多个从机(Slave)连接到单个主设备(Master),并且还可以有多个主设备(Master)控制一个或多个从机(Slave)。
I²C总线(SDA,SCL)内部都使用 漏极开路驱动器(开漏驱动) ,因此SDA和SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平;
3.2 数据传输协议
主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输0和1的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件,具体如下所示;
开始条件 :SDA 由高电平向低电平跳变,时钟为高
地址位 :一般为7位,也有8位、10位的。理论上讲可以有127个从机。 但是iic协议规定了总线电容不能超过400pF,管脚和PCB都是有寄生电容的,所以是有限制的,经验上是最多8个 。
R/W位 :读写位
为0低电平表示,主设备将数据发送到从设备
为1高电平表示,主设备接收从设备数据
应答位 :开始信号后第9个时钟位时,从设备发送应答信号,即SDA被拉低一个时钟位。如果没有这个应答,SDA输出高电平,主设备重启或者停止。
数据位 :一般为8位,注意:时钟信号为高时,SDA不允许变化,时钟为低时,SDA才能发生跳变。
应答位 :数据发送了会紧跟一个应答信号。
停止条件:SDA 由低电平向高电平跳变,时钟为高。
3.3 漏极开路输出 集电极开路输出 推挽输出
3.3.1 推挽输出
当Vin是V+时,Q3导通,输出的是高电平,叫推
当Vin是V-时,Q4导通,输出的是低电平,叫挽
3.3.1 集电极开路输出
Vin为高,Q5导通,输出为低。Vin为高,Q5截止,LED灯亮。
3.3.3 漏极开路输出 OD门
将上面电路换成NMOS管。就和上面电路稍微有点区别了。
只要对栅极施加电压,DS就会导通。MOS管的 输入阻抗 非常大,这意味着:没有电流从控制电路流出,也没有电流进入控制电路。没有电流流入或流出,就不会烧坏控制电路。而双极型晶体管不同,是电流控制性元器件,如果使用开集电路,可能会烧坏控制电路。这大概就是我们总是听到开漏电路而很少听到开集电路的原因吧?因为开集电路被淘汰了。
总结:
1:推挽输出能够输出高或者低,而开漏输出只能输出低,或者关闭输出,因此开漏输出总是要配一个上拉电阻使用。
2:开漏输出的上拉电阻不能太小,太小的话,当开漏输出的下管导通时,电源到地的电压在电阻上会造成很大的功耗,因此这个电阻阻值通常在10k以上,这样开漏输出在从输出低电平切换到高电平时,速度是很慢的。典型值为4.7k或者10k(有计算公式)
3:推挽输出任意时刻的输出要么是高,要么是低,所以不能将多个输出短接,而开漏输出可以将多个输出短接,共用一个上拉,此时这些开漏输出的驱动其实是与非的关系。
3.4 IIC的连接和总线仲裁
当多主机会产生总线裁决问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线
仲裁:每个主设备都需要在发送消息之前检测SDA线是低电平还是高电平;
如果SDA线为低电平,则意味着另一个主设备可以控制总线,并且主设备应等待发送消息。
如果SDA线为高电平,则可以安全地发送消息。
遗留:
接收消息如何操作?
4 SPI通信
SPI是同步通信,全双工。
4.1 SPI的硬件结构
由四根线完成通信
MISO :master input slave output 主收从发
MOSI :主发从收
CLK :时钟
SS :片选
一般在嵌入式中,都是通过移位寄存器完成通信、还是发送缓存寄存器和接收缓存寄存器。
值得注意的是,SPI只要通信成功,都是会全双工工作,就是既会发送也会接收,主机从机皆如此,但是如果只是单端的发送,那忽略到接收的数据就行了。
4.2 SPI的工作模式
SPI有四种工作模式,由时钟极性CPOA和时钟相位CPHA共同决定。
时钟极性 CKP/Clock Polarity :
CKP = 0:时钟空闲IDLE为低电平 0;
CKP = 1:时钟空闲IDLE为高电平1;
时钟相位 CKE /Clock Phase (Edge)
CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样;
模式编号:
SPI mode | CKP | CKE |
---|---|---|
1 | 0 | 0 |
2 | 0 | 1 |
3 | 1 | 0 |
4 | 1 | 1 |
最常用的是模式0和模式3
举例:SPI模式0:
空闲时,时钟为低电平,在第一个时钟沿,即上升沿,主机采样=主机接收数据=从机发出数据。第二个时钟沿,即下降沿,主机发送=从机采样=从机接收数据
4.3 SPI的总线
4.3.1 多片选信号
从机由片选信号选中。时钟都是由主机产生。
4.3.2 菊花链
菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。
距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了
应用比较少,了解一下。
5 RS232转TTL
6 防雷击 电泳 保护
RS232电压较高,经常带电插拔。接口会受过电压,过电流冲击。加上限流电阻和双向瞬态抑制二极管作为保护