常用通信协议总结
基础概念
在开始学习前我们需要知道一些基础概念例如:
1.什么是同步,什么是异步?
二者就是有没有时钟信号线的区别。
2.什么是串行,什么是并行?
就是在发送或者接收数据的时候用了几根线。比如常见的并行使用8根线,串行采用1根线。8根线传输一个byte(8bits)只需要一个时钟周期,而1根线传输一个byte至少需要8个时钟。
3.信号的电气协议是什么东西?
电气特性就是’0’,'1’分别用多大的电平表示。常见的电气协议有TTL、RS232、RS422、RS485
举例:
1.TTL中高电平对应3.3V或5V,低电平对应GND
2.RS232是负逻辑,所以高电平用-15~-5V,低电平用5~15V
这边提到正逻辑一般指正电压表示逻辑’1’(TTL),而负逻辑就是用负电压表示’0’(RS232)
常见的通信协议
在嵌入式开发中最常用的通信协议有:
1.UART异步收发传输器(Universal Asynchronous Receiver/Transmitter)
2.IIC集成电路总线(Inter-Integrated Circuit)
3.SPI串行外设接口(Serial Peripheral Interface)
1.UART
特性
- 从异步收发传输器中我们可以提取出关键字 “异步“,异步表示UART数据传输过程不需要时钟线,只需要信号线(RXD、TXD)。
- 再结合UART传输和接收不再同一根线上,所以UART可以同时发送接收,也就是UART支持全双工。
- 由于UART采用异步、串行,这就意味这数据要一位一位的传输,且由于没有时钟线进行同步,所以波特率发生器要花更多的时间通过来进行数据同步。
- 再者由于UART采用TTL电平标准,所以传输距离最远为2米
总结:
速率不快、距离短、可全双工、依靠波特率发生器进行数据同步、硬件接线2~3根。在这里插入图片描述
如果只需要MSP432向STM32发送信号,那么只需要接MSP432的TXD和STM32的RXD,如图2
同理,STM32也可以主动发送消息给MSP432,如图3
数据格式(嵌入式面试重点)
了解完这些后,我们再看一看UART的数据格式,我们从常用的串口助手入手:
- 起始位 1bit
- 数据位数(5、6、7、8)(默认为8bits)
- 奇偶校验位(默认不进行校验)
- 停止位数(1、1.5、2)(默认1bit)
- 空闲位:数据线在没有传输数据的时候保持高电平,也就是空闲位
波特率
串口通信最重要的就是传输速率,UART传输速率由波特率决定(在应用时一般只要配这个就行,数据格式这些不会去管按串口通信默认的就行)。很多时候串口助手接收到的数据乱码就是因为波特率不匹配,当然也可能是数据格式不对。
这里重点介绍一下波特率的概念简单来说就是每秒传输的bit位数
bits/s有些人可能要说了,你把比特率和波特率混淆了。是的,但因为我们大部分都是用二进制来传输数据,所以波特率==比特率,注意(因为是二进制,所以比特率=波特率)
2.IIC
IIC(Inter-Integrated Circuit)是一种内部整合电路的称呼,它是一种串行通讯总线,IIC总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。
IIC总线上可以挂很多设备,包括多个主设备和多个从设备(外围设备)。在多主机应用中,当多个主机同时想占用总线时,会产生总线裁决问题。这时,IIC通过总线仲裁,以决定哪台主机控制总线。
连接到IIC总线上的器件都具有唯一的地址,主机与其它器件间的数据传输可以是由主机发送数据到其它器件,这时主机即为发送器,总线上收数据的器件则为接收器。起始信号和终止信号用于表示数据传输的开始和结束。
每个接到IIC总线上的器件都有唯一的地址。主机与其它器件间的数据传输可以是由主机发送数据到其它器件,这时主机即为发送器,总线上收数据的器件则为接收器。 在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
另外,连接到IIC总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。上拉电阻一般在4.7k~10k之间。
特性
- 双向通信: I2C支持双向数据传输,即主设备既可以发送数据给从设备,也可以接收从设备发送的数据。注意双向通信和全双工的区别,全双工可以同时收发,这里的双向通信可以进行收发,但是不能同时。
- 多主模式: I2C允许多个主设备连接到同一条总线上,通过仲裁机制来选择唯一的主设备进行通信,其余的主设备则成为从设备。
- 多从模式: I2C总线可连接多个从设备,每个从设备都有唯一的7位或10位地址,主设备通过地址来选择要与之通信的从设备。
- 速率灵活: I2C总线的速率可以根据应用需求进行灵活调整,常见的速率有100 kHz、400 kHz和1 MHz。
- 低成本: I2C总线只需要两根线来进行通信,降低了硬件成本和复杂性。
仲裁机制(选看)
在IIC通信协议中,仲裁机制是一种关键的特性,用于解决多个设备同时尝试访问总线时可能出现的冲突。以下是IIC仲裁机制的几个关键特点:
- 线与机制:在多主机环境下,IIC总线具备“线与”的逻辑功能。这意味着,只要有一个节点发送低电平,总线上就会表现为低电平。这为仲裁过程提供了一种有效的机制。
- SDA回读机制:当总线被启动后,每个主机在发送一个数据位时都要对自己的输出电平进行检测。如果检测到的电平与自己发出的电平一致,主机就会继续占用总线。这种方法确保了主机发送的数据位与从SDA线上读取到的数据位是一致的。
- 低电平优先机制:当两个主控设备同时向总线发送数据时,会发生总线竞争。IIC总线具有多主控能力,可以对这种竞争进行仲裁。如果两个主控器发送的数据位不同,那么发送低电平的主控器将获胜,因为低电平是优先级最高的。如果两个主控器发送的数据位相同,那么会继续比较它们的数据位,直到有一个主控器发送的数据位发生变化。
IIC的一大特点在于他是多主多从的一种总线通信方式,一个IIC总线上可以有多个主机,同样的也可以有多个从机,这是其他很多总线都不会有的,同时IIC对数据要求很高,因为他每发送一个数据就要一个应答(要结束的时候发送非应答NACK)
起始信号: SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据。
结束信号: SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据。
数据在SCL低电平的时候变化
IIC通信实例
现在我们从AT24C02出发来看一下IIC具体是怎么通信?
在开始前,我们假设有这么几个IIC底层函数
void IIC_Start(void); // 起始信号
void IIC_Stop(void); // 终止信号
bit IIC_WaitAck(void); // 等待回应
void IIC_SendAck(bit ackbit); // 发送应答信号
void IIC_SendByte(unsigned char byt); // 发送字节
unsigned char IIC_RecByte(void); // 接收字节
#define AT24C02ADDR 0x50 //设备地址
#define ADDR 0x00 // 要写入数据的地址
void AT24C02_byte_write()
{
IIC_Start(); // 起始信号
IIC_SendByte(AT24C02ADDR << 1);
// 发送设备地址,设备地址7位,最低为为读写标志位,
// 又因为是写操作,所以最后一位置0
IIC_WaitAck(); // 等待回应
IIC_SendByte(ADDR); // 发送要操作的存储空间地址
IIC_WaitAck(); // 等待回应
IIC_SendByte(DATA); // 在DATAADDR地址中写入数据0x66
IIC_WaitAck(); // 等待回应
IIC_Stop(void); // 终止信号
}
char AT24C02_byte_read(char addr)
{
char recdata=0x00;
IIC_Start(); // 起始信号
IIC_SendByte(AT24C02ADDR << 1);
// 发送设备地址,设备地址7位,最低为为读写标志位,
// 又因为是写操作,所以最后一位置0
IIC_WaitAck(); // 等待回应
IIC_SendByte(addr); // 发送要操作的存储空间地址
IIC_WaitAck(); // 等待回应
IIC_Start(); // 起始信号
IIC_SendByte(AT24C02ADDR << 1 || 0x01);
// 发送设备地址,设备地址7位,最低为为读写标志位,
// 因为这次是读操作,所以最后一位置为1
IIC_WaitAck(); // 等待回应
recdata=IIC_RecByte();
IIC_SendAck(1); // 发送应答信号
IIC_Stop(void); // 终止信号
return recdata;
}
这就是IIC的读写流程,不同从设备可能会有点不同,但是都差不多。
3.SPI
串行外设接口(Serial Peripheral Interface,SPI)是一种高速的,全双工,同步的通信总线,由Motorola公司推出。它被广泛应用于微控制器、存储器和其他外围设备之间的通信,是一种常见的同步串行接口技术。
特性
SPI优点包括:
- 支持全双工通信:SPI支持两个设备之间同时进行数据传输,提高了通信效率。
- 通信简单:SPI的通信协议相对简单,数据传输速率快,且数据传输可靠性较高。
- 数据传输速率快:SPI支持高速数据传输,其速率可以根据具体应用需求进行配置。
SPI的缺点主要表现在:
没有指定的流控制和应答机制,因此数据传输的可靠性和稳定性受到一定影响。也就是说,如果数据在传输过程中出现丢失或错误,SPI没有提供相应的解决方案。
SPI的特点包括:
- 高速、同步、全双工、非差分、总线式:这些特点使得SPI在某些特定应用场景下,比如高速数据传输和实时性要求较高的场景,表现出色。
- 主从机通信模式:SPI支持主从机通信模式,即一个主机(Master)控制数据传输,多个从机(Slave)接收数据。这种模式下,主机会定时产生时钟信号,然后通过这个信号来同步数据的传输和接收。
总的来说,SPI是一种常见的通信协议,被广泛应用于各种需要高速、同步、全双工通信的场合。
通常SPI通过4个引脚与外部器件相连:
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK:串口时钟,作为主设备的输出,从设备的输入
● NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。
(图片源自b站UP主:爱上半导体)
四种工作模式
SPI拥有四种工作模式,由时钟极性CPOL和时钟相位CPHA控制。
SPI Mode | CPOL | CPHA |
---|---|---|
0(00) | 0 | 0 |
1(01) | 0 | 1 |
2(10) | 1 | 0 |
3(11) | 1 | 1 |
(图片源自b站UP主:爱上半导体)