赞
踩
在嵌入式领域,开发人员经常需要跟外设打交道,外设种类繁多,有各种各样的传感器、ERPROM、LCD屏幕等等,要对它们进行IO操作,就要彼此遵循一个约定,这个约定就是协议。
协议的种类繁多,有UART、I2C、SPI、USB等等,这篇文章主要讲下三个在嵌入式领域比较听到看到而外界不太熟悉的串口通信协议,UART、I2C和SPI,这三者因为它们的优缺点而适用的场景都各不相同。
UART,全称为通用异步收发器(Universal Asynchronous Receiver/Transmitter),是一种用于异步串行通信的硬件模块或芯片。UART广泛应用于微控制器、计算机和外围设备之间的数据通信。
异步通信
与同步通信不同,UART采用异步通信方式,这意味着通信双方不需要共享时钟信号。数据传输依赖于约定的波特率(Baud Rate),即每秒钟传输的比特数。
UART通信中的数据以帧为单位传输,每一帧包含以下几个部分:
起始位(Start Bit):
起始位用于标识数据帧的开始,表现为一位低电平信号。
数据位(Data Bits):
紧随起始位的数据位数量通常为5到9位(常用8位),表示实际传输的数据。
校验位(Parity Bit,非必需):
校验位用于错误检测,可以是偶校验、奇校验或无校验。
停止位(Stop Bit):
停止位用于标识数据帧的结束,可以是1位或2位高电平信号。
发送端将要传输的数据加载到UART的发送寄存器中。传输过程如下:
接收端通过UART的接收引脚(Rx)接收数据。接收过程如下:
假设发送端要发送一个字节的数据0x55(即二进制的01010101),波特率为9600,数据帧结构为8N1(8个数据位,无校验位,1个停止位),整个传输过程如下:
接收端在检测到起始位后,按照波特率的时钟间隔依次读取数据线的电平状态,重构出01010101这个字节。通过这种方式,UART实现了可靠的数据传输。
UART只需要两条信号线:发送线(Tx)和接收线(Rx)。这种简单的连接方式使其易于在设备之间进行通信。
UART采用异步通信方式,不需要共享时钟信号。双方需预先约定波特率,以确保数据同步传输。
UART支持灵活的数据格式,可以配置数据位、校验位和停止位,适应不同应用需求。
UART支持多种波特率,常见的有9600、19200、38400、115200等。波特率越高,数据传输速率越快,但对信号质量要求也越高。
UART因其简单和可靠,被广泛应用于各种嵌入式系统中,例如:
I2C协议是飞利浦半导体(现为恩智浦半导体)于1982年发明。大家可能会把I2C读成"I-two-C",其实这是一种错误的读法,正确的读法是“I平方C”(常读为“I方C”)。
它一种用于短距离通信的串行总线协议。它只需要两条信号线:数据线(SDA,Serial Data Line)和时钟线(SCL,Serial Clock Line),即可在多个设备之间传输数据。其典型应用包括传感器数据读取、存储器访问以及显示控制等。
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支持多种速度模式,如标准模式(100 kbit/s)、快速模式(400 kbit/s)、高速模式(3.4 Mbit/s)等,适用于不同的应用需求。
可靠的传输机制:
使用确认信号(ACK/NACK)确保数据传输的可靠性。
I2C协议因其简单和高效,被广泛应用于各类嵌入式系统中。例如:
SMBus,即系统管理总线,是一种用于低速、低功耗设备之间的通信协议。它是基于I2C(Inter-Integrated Circuit)总线协议的一个子集,由英特尔和德州仪器在1995年共同开发。
SMBus是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,全称为串行外设接口(Serial Peripheral Interface),是一种同步串行通信协议,由Motorola(现NXP)公司在20世纪80年代开发。SPI主要用于微控制器与外围设备之间的高速数据传输,如传感器、显示器、存储器等。
同步通信
与异步通信不同,SPI采用同步通信方式,这意味着通信双方共享一个时钟信号(SCLK,Serial Clock),从而保证数据传输的同步性。
SPI总线通常由四条信号线组成:
SPI的数据帧格式相对简单,没有固定的帧头和帧尾。每个时钟周期传输一位数据,数据位数通常为8位或16位,但也可以根据需要配置。
SPI支持全双工通信,这意味着数据可以同时在MOSI和MISO线上双向传输,提高了通信效率。
SPI的通信速率通常比I2C和UART高,可以达到几兆赫兹(MHz),适用于需要快速数据传输的应用场景。
SPI支持一个主设备与多个从设备通信,通过SS线选择不同的从设备,实现多设备管理。
SPI的硬件实现相对简单,不需要复杂的协议处理,非常适合在硬件资源有限的嵌入式系统中使用。
SPI协议因其高速和可靠性,被广泛应用于各种嵌入式系统中,例如:
特性 | I2C | SPI | UART |
---|---|---|---|
速度 | 中等(最高可达几Mbit/s) | 高(几Mbit/s到几十Mbit/s) | 适中(低于SPI) |
复杂性 | 中等(2根线,管理多个从设备) | 中到高(4根线,全双工) | 中等(2根线,全双工) |
使用场景 | 适用于与多个设备的短距离通信 | 适用于快速数据传输 | 适用于简单和长距离的串行通信 |
双工 | 半双工(双向通信,但不能同时进行) | 全双工(同时双向通信) | 全双工(同时双向通信) |
UART:其多功能性和稳健性使其在长距离通信和速度要求不高的配置中表现优异。
I2C:以其简单性和少量引脚管理多个从设备的能力,适合短距离通信配置。
SPI:高速和全双工模式使其适合需要快速高效数据传输的系统,在空间不是主要问题时表现尤为出色。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。