通信协议概述
电平标准:
Uart使用TTL电平标准,即3.3V/5V表示1,0表示0
补充一下另一种常见的电平标准 RS485
两线压差+2~+6V表示1,-2~-6V表示0(差分信号)
硬件电路:
从硬件电路可以得到的信息是,uart是一种全双工,异步的协议
即:
全双工--发送的同时可以接收
异步 --没有时钟线,依赖其他约定来进行同步
同时,可以看到TX和RX是不需要上拉/下拉的,这是因为:
UART的输出使用的是推挽输出,TX由自身的推挽输出保证电平;RX由对端的推挽输出保证电平
时序
任何一种协议在电路上的表现就是高低电平两种状态,而UART由于没有时钟线,因此必须解决通信双方的时许问题;
同时也没有SPI那种单独的使能信号,因此也需要有一种状态来表明通信开始和结束
基于以上两个问题,引出UART的重要参数
波特率:用于两个设备间同步信息的速率
起始位:一个bit的时间,必须为低电平
停止位:可配置的bit时间,必须为高电平,也必须要有
校验位:可配置奇偶检验,可以不配置
数据位:1表示1,0表示0,低位先行
波特率
含义:
波特率是通信双方同步的基准,他的意义是单位时间内传输的符号数
对于UART来说,如果波特率为115200,也就意味着1秒传输115200个bit的数据,如果设置none校验,1停止位,那么一秒就能传输11520帧数据,也就是11520byte有效数据
时钟来源:
波特率对于UART的时钟来说,都是一个非常低的速率,因此,都是通过对UART的时钟进行分频DIV来生成的。分配后的时钟也并不会对电平进行直接采样,这里还涉及一个超采样OSC的概念
超采样:
为了尽可能地保证信号的可靠,防止采样时因为毛刺对通信的影响,会对接收到的电平进行超采样,假设以实际波特率8倍的速率对接收信号进行采样,一般而言,有两种超采样方式:
- 取中间3次超采样的值,如果中间三个值是101,则认为该次信号为高
- 简单得选取最中间的值
由于UART总是用在短途通信,尤其是调试上,因此这两种方式都没啥问题
起始/停止/校验位
UART没有像SPI的EN信号,单独控制通信的开始与结束,因此他必须有方式来告之对方接收端通信开始,通信结束
这里就涉及几个概念:
-idle电平,在UART中,空闲时为高电平
-起始条件,既然空闲是高电平,那么起始条件就理所当然的是一个下降沿,这也就是UART中的起始位,固定为1个bit长度
-终止条件,从通信状态回到空闲状态,也就是停止位,一个上升沿,高电平的时间可配置,支持1/1.5/2个bit
由于uart是没有时钟的,因此除了超采样之外,还提供了可选的校验位,他在数据位和停止位之间,所谓偶校验,就是让数据位中的高电平+校验位中高电平的数量保持偶数,奇校验同理
数据位
数据位的长度也是可配的,一般常用的有8位和9位
8位数据长度是最常用的,有效的数据就是一个byte,非常适合用于端对端的通信
唯一可以聊的就是他是低位先行的
如果发送0X55,即01010101
在时序上,是按照 10101010来发送的
PS:这里再补充一下内存中的大端序,小端序,要记住这个顺序是字节序,也就是一个字节内的数据是始终不变的,大端序小端序决定的是相邻字节的排序
再补充一下MSB和LSB
MSB指的是Most Significant Bit,这里就是P前面那个0
LSB 指的是 Least Significant Bit,这里就是S后面那个1
另一种较为常见的是9bit数据位
在多机通信(multi-drop 或 multi-processor communication)中,通常有一个主机(Master)和多个从机(Slaves)。在这种场景下:
- 9-bit 作为地址位:主机发送数据时,使用 9-bit 模式,其中第 9 位(MSB)用于区分数据帧和地址帧。
- 从机的行为:
- 当接收到地址帧(第 9 位 = 1)时,从机检查是否匹配自己的地址,如果匹配,就继续接收数据。
- 当接收到数据帧(第 9 位 = 0)时,仅被选中的从机会处理数据,而其他从机则忽略它。
这种方式减少了从机不必要的处理,提高了系统效率。