STM32通信相关介绍
串行/并行通信
全双工/半双工/单工传输
同步/异步通信
通信速率
串口电平标准
串口传输协议
常见通信协议
串行/并行通信
按照数据传输的方式,通信可以分为串行通信和并行通信。串行通信简单的说就是数据依次传输,比如要传输0x11111111,一位一位的发送,需要发送8次。并行通信则是几个数据一起传输,同样是0x11111111,如果8位一起发送,只需要发送1次,如图15.1.1所示。
由此可见,串行传输占用的通信线更少,成本低,通信速度相对较慢;并行传输占用的通信线多,成本高,通信速度相对更快。但随着对传输速度要求越来越高,并行传输开始出现信号之间的干扰,串行通信受干扰影响较小,之后又发展出差分传输等技术,极大的提高了串行传输速率,使得串行通信速度可能比并行通信速度更快。
串行通信就像单车道,行驶的车辆需要依次行驶。并行通信就像多车道,同时多辆汽车并排行驶。但当车速很快的时候,多车道上并列行驶的汽车之间会形成“气流”相互干扰,单车道则受影响较小,速度能够进一步提升。
全双工/半双工/单工传输
按照数据传输的方向,通信可以分为全双工、半双工和单工。全双工指双方都可以同时收发信息;半双工双方都可以收发信息,但同一时刻只能一方发送信息;单工指只能一方发信息,一方接受信息,通信是单向的。
全双工就像电话通信,双方任意时刻都可以同时收发信息;半双工就像对讲机通信,双向都可得到信息,但是同一时刻只能是一方发射另一方接收,发射和接收不能同时进行;单工就像收音机,只能由广播站发送给收音机,单向不可逆的,如图15.2.1所示。
同步/异步通信
按数据同步的方式,通信可以分为同步通信和异步通信。数据在双方之间传输时,需要制定规则保证数据传输的准确。同步通信的做法是加一个时钟信号,发送方和接收方在这个时钟的节拍下传输数据,比如常见的SPI、I2C。而异步通信的做法是对数据进行封装,在数据开头加上起始信号,在数据结尾加上终止信号,双方就按这个规则传输数据,比如UART、1-Wire。
因此,可以通过是否有时钟信号,初步判断是何种数据同步方式。
通信速率
对于同步通信,通信速率由时钟信号决定,时钟信号越快,传输速度就越快。
对于异步通信,需要收发双方提前统一通信速率,这也就是我们串口调试时,波特率不对显示乱码的原因。
时钟对通信的重要性,这里再举个例子:假设发送端时钟频率为1Mhz,对应时钟周期则为1us,接收端时钟频率为10Mhz,对应时钟周期则为0.1us。现在发送端发送一个数据0x1,就会产生一个持续时间为1us高电平,接收端接收到这个1us的高电平时,会当作是10个0.1us的高电平,认为收到了10个0x1。这时双方数据就乱套了,因此需要一个统一的时钟标准。
通常使用比特率来描述通信速率的快慢,与之容易混淆的是波特率。
比特率(Bitrate):系统在单位时间内传输的比特位(二进制0或1)个数,通常用Rb表示,单位是比特/秒(bit/s),缩写为bps;
波特率(Baudrate):系统在单位时间内传输的码元个数,通常用RB表示,单位是波特(Bd);
100bit/s即是一秒钟传输100个0或1,100Bd即是一秒钟传输100个码元。
码元就是“承载信息量的基本信号单位”,以一条电线上传输的信号为例,码元就是电线上的电平值。
如果电线上电平只有0和3.3V两种选择,传输的信号是这2种电平之一,码元的状态只有2种。接收方可以把0V认为是二进制的0,把3.3V认为是二进制1。即:传输1个码元时,能用来表示1位数据。
如果电线上电平有0V、3.3V、5V、12V四种选择,传输的信号是这4种电平之一,码元的状态有4种。接收方可以把这4个电平认为是二级制的4个值:00、01、10、11。即:传输1个码元时,能用来表示2位数据。
因此码元状态为2时,比特率等于波特率,码元状态越多,每次传输的码元能携带的信息越多,自然速率也越高。
码元有N个状态时,比特率与波特率的关系式:
串口电平标准
说到串口,经常提到TTL、RS232、RS422、RS485,简单的说,就是为了适应不同的环境条件,使用了不同的电平标准。假如微处理器和板载的蓝牙透传模块通信时,一般就使用TTL电平,引脚直接连接即可。假如微处理器在工业现场,需要连接一个几十米外的装置,则应该考虑将TTL电平转为RS232、RS422、RS485。
如下表15.5.1是几个通信接口标准总结。可以发现为了加大传输距离,人们依次尝试了增加电压、差分传输等方式。
串口传输协议
以TTL电平的接口为例讲解串口怎么传输数据,对于RS232/RS422/RS485等接口,仅仅是把TTL电平转换为不同的电平值,或者转换为差分信号。
TTL接口的串口,硬件连接如图15.6.1所示。
串口传输中的一些概念如下:
波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit);
起始位:先发出一个逻辑”0”的信号,表示传输数据的开始;
数据位:可以是5~8位逻辑”0”或”1”,先传输bit0,在传输bit1,依次类推;
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位是可选的,可以不传输;
停止位:它是一个字符数据的结束标志,数据线变回逻辑”1”;
怎么发送一字节数据,比如“A”?“A”的ASCII值是0x41,二进制就是01000001,怎样把这8位数据发送给对方呢?
双方约定好波特率、数据格式(数据位个数、停止位个数、是否使用校验位、奇校验还是偶校验),假设数据位是8,停止位是1,校验位是1;
初始电平为逻辑1;
发送方输出逻辑0,并保持1位的时间;接收方检测到逻辑0,就知道对方准备发送数据了;
发送方根据数据的bit0设置引脚电平,并保持1位的时间;接收方读取引脚电平,得到bit0;
发送方根据数据的bit1设置引脚电平,并保持1位的时间;接收方读取引脚电平,得到bit1;
以此类推,发出8位数据;
发送方计算出校验值,设置引脚,并保持1位的时间;接收方读取引脚电平,得到校验值;注意,这步可以省略;
发送方输出逻辑1,并保持1位的时间;接收方读取引脚电平,知道数据传输结束;
信号的波形图如图15.6.2所示。
常见通信协议
在嵌入式中,有众多通信协议,往往从性能、成本、稳定性、易用性等角度考虑选择合适的协议。常见的通信协议如表15.7.1所示。