文章目录
前言
在嵌入式领域,开发人员经常需要跟外设打交道,外设种类繁多,有各种各样的传感器、ERPROM、LCD屏幕等等,要对它们进行IO操作,就要彼此遵循一个约定,这个约定就是协议。
协议的种类繁多,有UART、I2C、SPI、USB等等,这篇文章主要讲下三个在嵌入式领域比较听到看到而外界不太熟悉的串口通信协议,UART、I2C和SPI,这三者因为它们的优缺点而适用的场景都各不相同。
UART
UART,全称为通用异步收发器(Universal Asynchronous Receiver/Transmitter),是一种用于异步串行通信的硬件模块或芯片。UART广泛应用于微控制器、计算机和外围设备之间的数据通信。
异步通信
与同步通信不同,UART采用异步通信方式,这意味着通信双方不需要共享时钟信号。数据传输依赖于约定的波特率(Baud Rate),即每秒钟传输的比特数。
UART的工作原理
数据帧结构
UART通信中的数据以帧为单位传输,每一帧包含以下几个部分:
-
起始位(Start Bit):
起始位用于标识数据帧的开始,表现为一位低电平信号。 -
数据位(Data Bits):
紧随起始位的数据位数量通常为5到9位(常用8位),表示实际传输的数据。 -
校验位(Parity Bit,非必需):
校验位用于错误检测,可以是偶校验、奇校验或无校验。 -
停止位(Stop Bit):
停止位用于标识数据帧的结束,可以是1位或2位高电平信号。
数据传输过程
发送数据
发送端将要传输的数据加载到UART的发送寄存器中。传输过程如下:
- 发送起始位:
- 发送端将Tx线拉低,发送起始位。
- 发送数据位:
- 按照预定波特率,逐位发送数据。
- 每发送一位数据,Tx线电平变化一次。
- 发送校验位(如配置):
- 根据数据位的奇偶性,发送校验位。
- 发送停止位:
- 发送端将Tx线拉高,发送停止位。
接收数据
接收端通过UART的接收引脚(Rx)接收数据。接收过程如下:
- 检测起始位:
- 接收端检测到Rx线变为低电平,识别为起始位。
- 采样数据位:
- 根据设定的波特率,接收端在每个比特周期内对数据位进行采样。
- 采样完成后,将数据存储到接收寄存器中。
- 校验数据位(如配置):
- 如果配置了校验位,接收端计算数据位的奇偶性,并与校验位进行比较,验证数据的正确性。
- 检测停止位:
- 接收端检测到高电平的停止位,确认一帧数据传输完毕。
- 接收端将整帧数据传递给处理器进行处理。
举例说明
假设发送端要发送一个字节的数据0x55(即二进制的01010101),波特率为9600,数据帧结构为8N1(8个数据位,无校验位,1个停止位),整个传输过程如下:
- 起始位:发送端将数据线拉低(0)。
- 数据位:依次发送01010101,每个位占据1/9600秒的时间。
- 停止位:发送端将数据线拉高(1)。
接收端在检测到起始位后,按照波特率的时钟间隔依次读取数据线的电平状态,重构出01010101这个字节。通过这种方式,UART实现了可靠的数据传输。
UART的特点
双线通信
UART只需要两条信号线:发送线(Tx)和接收线(Rx)。这种简单的连接方式使其易于在设备之间进行通信。
异步通信
UART采用异步通信方式,不需要共享时钟信号。双方需预先约定波特率,以确保数据同步传输。
灵活的数据格式
UART支持灵活的数据格式,可以配置数据位、校验位和停止位,适应不同应用需求。
波特率选择
UART支持多种波特率,常见的有9600、19200、38400、115200等。波特率越高,数据传输速率越快,但对信号质量要求也越高。
UART的应用场景
UART因其简单和可靠,被广泛应用于各种嵌入式系统中,例如:
- 调试和开发:UART常用于微控制器的调试和开发,方便工程师查看系统输出和进行故障排除。
- 传感器接口:用于连接和读取传感器数据,如温度传感器、压力传感器等。
- 模块通信:用于不同模块之间的数据传输,如GPS模块、蓝牙模块、Wi-Fi模块等。
- 计算机通信:用于计算机与外设(如鼠标、键盘、打印机)之间的数据通信。
UART的优缺点
优点
- 硬件实现简单:只需两条信号线,硬件实现和电路设计相对简单。
- 广泛应用:支持多种设备和模块,应用范围广泛。
- 异步通信:无需时钟信号,适应性强。
缺点
- 传输速率有限:相较于其他高速通信协议(如SPI、I2C),UART的传输速率较低。
- 误码率:长距离传输或高波特率下,易受噪声干扰导致误码。
- 单一设备通信:单对Tx/Rx信号线只能进行点对点通信,不适合多设备通信。
I2C
I2C协议是飞利浦半导体(现为恩智浦半导体)于1982年发明。大家可能会把I2C读成"I-two-C",其实这是一种错误的读法,正确的读法是“I平方C”(常读为“I方C”)。
它一种用于短距离通信的串行总线协议。它只需要两条信号线:数据线(SDA,Serial Data Line)和时钟线(SCL,Serial Clock Line),即可在多个设备之间传输数据。其典型应用包括传感器数据读取、存储器访问以及显示控制等。
I2C的工作原理
总线架构
I2C总线采用了多主多从架构。这意味着同一条总线上可以有多个主设备和多个从设备,但在同一时刻只能有一个主设备控制总线进行通信。
数据传输过程
I2C通信过程中,数据以帧为单位传输,每一帧包括以下几个步骤:
-
起始条件(Start Condition):
通信开始时,主设备在时钟线(SCL)高电平期间将数据线(SDA)从高电平拉低,通知所有从设备准备接收数据。 -
从设备地址(Slave Address):
主设备发送从设备的地址,这是一个7位或10位的二进制数,紧接着是读/写位(0表示写,1表示读)。总线上所有设备接收地址并与自身地址匹配,匹配成功的设备将响应通信。 -
确认信号(ACK/NACK):
每传输一个字节数据后,接收方需发送一个确认信号(ACK,低电平)或非确认信号(NACK,高电平)表示是否成功接收数据。 -
数据字节:
数据按字节传输,每个字节传输后,接收方都会发送ACK或NACK信号。 -
停止条件(Stop Condition):
通信结束时,主设备在SCL高电平期间将SDA从低电平拉高,表示数据传输结束。
总线仲裁
当多个主设备尝试同时发送数据时,I2C总线会进行仲裁。仲裁基于SDA线的状态,在SCL高电平期间,检测SDA线上的电平变化。具有较高优先级的设备可以继续传输,而其他设备将退回到空闲状态。
举例说明
上面两张图是我从AP3216C的芯片手册截取的关于I2C的读写传输过程,可以看到,在操作之前,需要先提供从设备地址,然后是一个读写位,之后就是寄存器的相关操作。
I2C的特点
-
双线通信:
I2C只需两条信号线即可实现多设备通信,简化了电路设计。 -
多主多从:
支持多主设备和多从设备,在同一总线上实现复杂的通信拓扑。 -
多速率支持:
I2C支持多种速度模式,如标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s)等,适用于不同的应用需求。 -
可靠的传输机制:
使用确认信号(ACK/NACK)确保数据传输的可靠性。
I2C的应用场景
I2C协议因其简单和高效,被广泛应用于各类嵌入式系统中。例如:
- 传感器接口:用于连接温度传感器、湿度传感器、加速度计等,读取环境参数或物理状态。
- 存储器访问:用于访问EEPROM、FRAM等非易失性存储器,进行数据存储和读取。
- 显示控制:用于控制LCD、OLED显示屏,传输图像和文本信息。
- 实时时钟(RTC):用于与RTC芯片通信,设置和读取时间信息。
I2C的优缺点
优点
- 硬件连接简单:只需两条线,减少了布线复杂度。
- 多设备支持:允许多个设备共享总线,提高系统灵活性。
- 多速率选择:适应不同的应用场景和数据传输需求。
缺点
- 通信速率较低:相比于SPI等高速通信协议,I2C的传输速率较低。
- 总线长度有限:适用于短距离通信,长距离通信可能需要额外的缓冲器或驱动器。
- 需要处理总线仲裁:多主设备情况下,需实现总线仲裁机制,增加了软件复杂性。
SMBus
SMBus,即系统管理总线,是一种用于低速、低功耗设备之间的通信协议。它是基于I2C(Inter-Integrated Circuit)总线协议的一个子集,由英特尔和德州仪器在1995年共同开发。
与I2C的关系
SMBus是I2C协议的一个变种,它在电压、电流和超时机制等方面有一些特定的限制和扩展,以确保更高的兼容性和可靠性。
与I2C的对比
特性 | I2C | SMBus |
---|---|---|
定义 | I2C(Inter-Integrated Circuit)是飞利浦公司(现恩智浦半导体)在20世纪80年代开发的串行总线协议,用于短距离设备通信。 | SMBus(System Management Bus)是英特尔和德州仪器在1995年开发的基于I2C的子集协议,专为系统管理和监控设计。 |
电压范围 | 典型工作电压为3.3V或5V,可扩展到其他电压范围。 | 标准电压为3.3V或5V,规定了更严格的电压范围和电流限制。 |
通信速度 | 标准模式为100 kHz,快速模式为400 kHz,高速模式为3.4 MHz。 | 典型速度为10 kHz至100 kHz,更适合低速设备。 |
超时机制 | 无内置超时机制,需要通过软件实现。 | 内置35 ms超时机制,防止总线被长时间占用。 |
命令和数据 | 传输数据时,不区分命令和数据,可根据协议自由定义。 | 定义了标准命令码,用于设备间的统一通信协议。 |
错误检测 | 通过ACK/NACK信号进行基本的错误检测。 | 通过ACK/NACK信号和超时机制进行更严格的错误检测。 |
兼容性 | 硬件实现相对简单,广泛应用于各种设备和系统。 | 兼容I2C协议,但规定了更严格的电压、电流和时序要求。 |
应用场景 | 广泛应用于传感器、存储器、显示器等设备的短距离通信。 | 主要应用于系统管理和监控,如电源管理、温度监控、风扇控制等。 |
硬件实现 | 只需要两条信号线(SDA和SCL),硬件实现简单。 | 同样只需要两条信号线(SDA和SCL),但对电气参数有更严格的规定。 |
SPI
SPI,全称为串行外设接口(Serial Peripheral Interface),是一种同步串行通信协议,由Motorola(现NXP)公司在20世纪80年代开发。SPI主要用于微控制器与外围设备之间的高速数据传输,如传感器、显示器、存储器等。
同步通信
与异步通信不同,SPI采用同步通信方式,这意味着通信双方共享一个时钟信号(SCLK,Serial Clock),从而保证数据传输的同步性。
SPI的工作原理
总线架构
SPI总线通常由四条信号线组成:
- SCLK(Serial Clock):时钟信号,由主设备生成,控制数据传输速率。
- MOSI(Master Out Slave In):主设备输出数据,从设备输入数据。
- MISO(Master In Slave Out):从设备输出数据,主设备输入数据。
- SS(Slave Select):从设备选择信号,由主设备控制,用于选择特定的从设备。
数据传输过程
- 主设备生成时钟信号(SCLK): 主设备通过SCLK线生成同步时钟信号,控制数据传输的时序。
- 数据传输:
- 主设备通过MOSI线发送数据,从设备通过MISO线返回数据。
- 数据在每个时钟周期的上升沿或下降沿采样,具体时序由设备配置决定。
- 从设备选择: 主设备通过SS线选择要通信的从设备。低电平(Active Low)表示选择设备,高电平(Inactive High)表示取消选择。
数据帧格式
SPI的数据帧格式相对简单,没有固定的帧头和帧尾。每个时钟周期传输一位数据,数据位数通常为8位或16位,但也可以根据需要配置。
SPI的特点
全双工通信
SPI支持全双工通信,这意味着数据可以同时在MOSI和MISO线上双向传输,提高了通信效率。
高速通信
SPI的通信速率通常比I2C和UART高,可以达到几兆赫兹(MHz),适用于需要快速数据传输的应用场景。
灵活的主从结构
SPI支持一个主设备与多个从设备通信,通过SS线选择不同的从设备,实现多设备管理。
硬件实现简单
SPI的硬件实现相对简单,不需要复杂的协议处理,非常适合在硬件资源有限的嵌入式系统中使用。
SPI的应用场景
SPI协议因其高速和可靠性,被广泛应用于各种嵌入式系统中,例如:
- 传感器接口:用于连接高速传感器,如加速度计、陀螺仪等,实时读取数据。
- 显示器控制:用于控制LCD、OLED显示屏,传输图像和视频数据。
- 存储器访问:用于访问高速存储器,如闪存(Flash)、SRAM等,实现快速数据读写。
- 音频传输:用于音频编码解码芯片之间的高速数据传输,保证音质和同步性。
SPI的优缺点
优点
- 高速通信:支持高达几十兆赫兹的通信速率,适用于需要快速数据传输的场景。
- 全双工:支持全双工通信,提高数据传输效率。
- 硬件实现简单:不需要复杂的协议处理,硬件实现和电路设计相对简单。
- 多设备支持:通过SS线可以轻松管理多个从设备,扩展性强。
缺点
- 点对点通信:尽管支持多从设备,但每次通信只能选择一个从设备,不适合多主设备通信。
- 线缆需求:需要四条信号线,相比于I2C和UART,占用更多的引脚资源。
- 短距离通信:适用于短距离通信,长距离通信可能需要额外的信号驱动和缓冲。
三者对比
特性 | I2C | SPI | UART |
---|---|---|---|
速度 | 中等(最高可达几Mbit/s) | 高(几Mbit/s到几十Mbit/s) | 适中(低于SPI) |
复杂性 | 中等(2根线,管理多个从设备) | 中到高(4根线,全双工) | 中等(2根线,全双工) |
使用场景 | 适用于与多个设备的短距离通信 | 适用于快速数据传输 | 适用于简单和长距离的串行通信 |
双工 | 半双工(双向通信,但不能同时进行) | 全双工(同时双向通信) | 全双工(同时双向通信) |
通信速度
- SPI:适用于需要高速度的场合。
- UART:灵活性强,适用于多种速度要求。
- I2C:适用于速度要求不高的配置。
电路设计
- I2C:适合多个设备高效管理,占用引脚少。
- SPI:在空间不是主要问题时,提供高性能。
- UART:设计简单,适用于各种应用场景。
距离和通信环境
- UART:适用于长距离通信,稳定可靠。
- I2C:适用于短距离通信。
双工要求
- SPI和UART:提供全双工能力,可以同时进行双向通信。
- I2C:仅支持半双工通信。
总结
UART:其多功能性和稳健性使其在长距离通信和速度要求不高的配置中表现优异。
I2C:以其简单性和少量引脚管理多个从设备的能力,适合短距离通信配置。
SPI:高速和全双工模式使其适合需要快速高效数据传输的系统,在空间不是主要问题时表现尤为出色。
标签:UART,通信,SPI,数据传输,I2C,设备 From: https://blog.csdn.net/Leon_Chenl/article/details/139348061