常用嵌入式通信协议总结

常用通信协议总结

基础概念

在开始学习前我们需要知道一些基础概念例如:
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

特性
  1. 从异步收发传输器中我们可以提取出关键字 “异步“,异步表示UART数据传输过程不需要时钟线,只需要信号线(RXD、TXD)。
  2. 再结合UART传输和接收不再同一根线上,所以UART可以同时发送接收,也就是UART支持全双工
  3. 由于UART采用异步、串行,这就意味这数据要一位一位的传输,且由于没有时钟线进行同步,所以波特率发生器要花更多的时间通过来进行数据同步。
  4. 再者由于UART采用TTL电平标准,所以传输距离最远为2米

总结:
速率不快、距离短、可全双工、依靠波特率发生器进行数据同步、硬件接线2~3根。在这里插入图片描述
#pic_center)

图1 全双工UART接线图

如果只需要MSP432向STM32发送信号,那么只需要接MSP432的TXD和STM32的RXD,如图2

在这里插入图片描述

图2 半双工UART接线(只能MSP432向STM32发送)

同理,STM32也可以主动发送消息给MSP432,如图3
在这里插入图片描述

图3 STM32向MSP432单向通信
数据格式(嵌入式面试重点)

了解完这些后,我们再看一看UART的数据格式,我们从常用的串口助手入手:
在这里插入图片描述

图4 VOFA+串口参数配置界面
  • 起始位 1bit
  • 数据位数(5、6、7、8)(默认为8bits)
  • 奇偶校验位(默认不进行校验)
  • 停止位数(1、1.5、2)(默认1bit)
  • 空闲位:数据线在没有传输数据的时候保持高电平,也就是空闲位
    在这里插入图片描述
图5 UART数据格式图
波特率

串口通信最重要的就是传输速率,UART传输速率由波特率决定(在应用时一般只要配这个就行,数据格式这些不会去管按串口通信默认的就行)。很多时候串口助手接收到的数据乱码就是因为波特率不匹配,当然也可能是数据格式不对。
这里重点介绍一下波特率的概念简单来说就是每秒传输的bit位数
bits/s
有些人可能要说了,你把比特率和波特率混淆了。是的,但因为我们大部分都是用二进制来传输数据,所以波特率==比特率,注意(因为是二进制,所以比特率=波特率)

2.IIC

IIC(Inter-Integrated Circuit)是一种内部整合电路的称呼,它是一种串行通讯总线,IIC总线具有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。

IIC总线上可以挂很多设备,包括多个主设备和多个从设备(外围设备)。在多主机应用中,当多个主机同时想占用总线时,会产生总线裁决问题。这时,IIC通过总线仲裁,以决定哪台主机控制总线。

连接到IIC总线上的器件都具有唯一的地址,主机与其它器件间的数据传输可以是由主机发送数据到其它器件,这时主机即为发送器,总线上收数据的器件则为接收器。起始信号和终止信号用于表示数据传输的开始和结束。

每个接到IIC总线上的器件都有唯一的地址。主机与其它器件间的数据传输可以是由主机发送数据到其它器件,这时主机即为发送器,总线上收数据的器件则为接收器。 在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。

另外,连接到IIC总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。上拉电阻一般在4.7k~10k之间。

特性
  1. 双向通信: I2C支持双向数据传输,即主设备既可以发送数据给从设备,也可以接收从设备发送的数据。注意双向通信和全双工的区别,全双工可以同时收发,这里的双向通信可以进行收发,但是不能同时
  2. 多主模式: I2C允许多个主设备连接到同一条总线上,通过仲裁机制来选择唯一的主设备进行通信,其余的主设备则成为从设备。
  3. 多从模式: I2C总线可连接多个从设备,每个从设备都有唯一的7位或10位地址,主设备通过地址来选择要与之通信的从设备。
  4. 速率灵活: I2C总线的速率可以根据应用需求进行灵活调整,常见的速率有100 kHz、400 kHz和1 MHz。
  5. 低成本: I2C总线只需要两根线来进行通信,降低了硬件成本和复杂性。
仲裁机制(选看)

在IIC通信协议中,仲裁机制是一种关键的特性,用于解决多个设备同时尝试访问总线时可能出现的冲突。以下是IIC仲裁机制的几个关键特点:

  • 线与机制:在多主机环境下,IIC总线具备“线与”的逻辑功能。这意味着,只要有一个节点发送低电平,总线上就会表现为低电平。这为仲裁过程提供了一种有效的机制。
  • SDA回读机制:当总线被启动后,每个主机在发送一个数据位时都要对自己的输出电平进行检测。如果检测到的电平与自己发出的电平一致,主机就会继续占用总线。这种方法确保了主机发送的数据位与从SDA线上读取到的数据位是一致的。
  • 低电平优先机制:当两个主控设备同时向总线发送数据时,会发生总线竞争。IIC总线具有多主控能力,可以对这种竞争进行仲裁。如果两个主控器发送的数据位不同,那么发送低电平的主控器将获胜,因为低电平是优先级最高的。如果两个主控器发送的数据位相同,那么会继续比较它们的数据位,直到有一个主控器发送的数据位发生变化。

IIC的一大特点在于他是多主多从的一种总线通信方式,一个IIC总线上可以有多个主机,同样的也可以有多个从机,这是其他很多总线都不会有的,同时IIC对数据要求很高,因为他每发送一个数据就要一个应答(要结束的时候发送非应答NACK)
起始信号: SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据。
结束信号: SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据。
在这里插入图片描述

图6 起始信号和结束信号

数据在SCL低电平的时候变化
在这里插入图片描述

图7 数据变化条件(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);   		// 接收字节

在这里插入图片描述

图8 IIC写流程
#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);      				// 终止信号
}

在这里插入图片描述

图9 IIC读流程
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优点包括:

  1. 支持全双工通信:SPI支持两个设备之间同时进行数据传输,提高了通信效率。
  2. 通信简单:SPI的通信协议相对简单,数据传输速率快,且数据传输可靠性较高。
  3. 数据传输速率快:SPI支持高速数据传输,其速率可以根据具体应用需求进行配置。
    SPI的缺点主要表现在:

没有指定的流控制和应答机制,因此数据传输的可靠性和稳定性受到一定影响。也就是说,如果数据在传输过程中出现丢失或错误,SPI没有提供相应的解决方案。
SPI的特点包括:

  1. 高速、同步、全双工、非差分、总线式:这些特点使得SPI在某些特定应用场景下,比如高速数据传输和实时性要求较高的场景,表现出色。
  2. 主从机通信模式:SPI支持主从机通信模式,即一个主机(Master)控制数据传输,多个从机(Slave)接收数据。这种模式下,主机会定时产生时钟信号,然后通过这个信号来同步数据的传输和接收。

总的来说,SPI是一种常见的通信协议,被广泛应用于各种需要高速、同步、全双工通信的场合。

通常SPI通过4个引脚与外部器件相连:
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK:串口时钟,作为主设备的输出,从设备的输入
● NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。
在这里插入图片描述

图10 SPI接线图

(图片源自b站UP主:爱上半导体)

四种工作模式

SPI拥有四种工作模式,由时钟极性CPOL和时钟相位CPHA控制。

SPI ModeCPOLCPHA
0(00)00
1(01)01
2(10)10
3(11)11

在这里插入图片描述

图11 SPI不同工作模式时序图

(图片源自b站UP主:爱上半导体)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值