UART, I2C, SPI
协议 | 线数 | 通信类型 | 多主 | 数据率 | 总线上期间的数量 | 线缆长度(米) | 工作模式 | 使用距离 |
---|---|---|---|---|---|---|---|---|
$$UART$$ | 2 | 异步 | 不支持 | 3Kbps 到 4Mbps | 2 | 1.5 | 全双工 | 远距离 |
$$SPI$$ | 3 | 同步 | 不支持 | 1Mbps | < 10 | <3 | 全双工 | 近距离低速 |
$$I^2C$$ | 2 | 同步 | 支持 | <3.4Mbps | < 10 | <3 | 半双工 | 近距离低速 |
举例说明:
I2C的使用场景:连接传感器、存储器、显示器等设备。例如,连接温度传感器、EEPROM存储器、OLED显示器等。
UART的使用场景:连接串口设备,如调试器、GPS接收器等。例如,连接串口调试器进行程序调试。
SPI的使用场景:连接存储器、显示器、传感器等设备。例如,连接Flash存储器、LCD显示器、加速度传感器等。
选择使用这三者的场景取决于具体的应用需求。
- 如果需要连接多个设备,可以选择使用I2C或SPI协议;
- 如果只需要连接单个设备,可以选择使用UART协议。
- 如果需要高速传输数据,可以选择使用SPI协议。
- 如果需要低功耗和简单的通信方式,可以选择使用I2C协议。
- 如果需要长距离传输数据,可以选择使用UART协议。
UART
UART(Universal Asynchronous Receiver/Transmitter):UART是一种异步串行通信协议,用于在计算机和外部设备之间传输数据。它使用两根线(TX和RX)进行通信,其中TX是发送线,RX是接收线。UART协议只支持单主机和单从机的通信,不能连接多个设备。UART通常用于连接串口设备,如调试器、GPS接收器等。
流控制
流控制的方式分别有软件和硬件两种。
- 软件的流控制方式,在UART通信中,只需RxD、TxD、GND三根即可,数据在传输过程中,依靠代码的判断处理,并通过收发双方进行的数据交互完成控制,在现有通信物理信号线基础上,使用控制字符(ASCII表中的0x00~0x0x1F、0x7F)完成控制指令的交互。一般在私有协议下也会定义一些特殊字符设为控制指令。
- 硬件的流控制方式,即在原有的RxD、TxD、GND三根信号线的基础上,再增加RTS/CTS和DTR/DSR这两组信号线。第一组线是RTS(Request toSend)和CTS(Clear toSend)。当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。第二组线是DTR(DataTerminal Ready)和DSR(Data SetReady)。这些线主要用于Modem通信。使得串口和Modem通信他们的状态。例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。读取DSR线置高,PC机开始发送数据。一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。
优点
- 只使用两根电线,不需要时钟信号
- 有一个奇偶校验位,只要双方设置后,就可以改变数据包的结构
缺点
- 数据帧的大小限制为最多9位,不支持多个从属或多个主系统
- 每个UART的波特率必须在10%之内
SPI
SPI(Serial Peripheral Interface):SPI是一种串行通信协议,用于在芯片之间传输数据。它使用四根线(MOSI、MISO、SCK和SS)进行通信,其中MOSI是主设备输出从设备输入的数据线,MISO是主设备输入从设备输出的数据线,SCK是时钟线,SS是片选线。SPI协议支持多主机和多从机的通信,可以连接多个设备。SPI通常用于连接存储器、显示器、传感器等设备。
SPI使用的四根信号线
- SCLK: Serial Clock (output from master):串行时钟,用来同步数据传输,由主机输出;
- MOSI \ SIMO: Master Output, Slave Input(output from master):主机输出从机输入数据线,通常先传输MSB;
- MISO \ SOMI: Master Input, Slave Output(output from slave):主机输入从机输出数据线,通常先传输LSB;
- SS: Slave Select (active low, output from master):片选线,低电平有效,由主机输出。
SS\CS:控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(一般默认为低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。也就是说:当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低。
SPI的四种操作模式
SPI的四种操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还低)。
对于STM32等MCU自带的硬件SPI外设来说,可能没有那么重要,只需要配置一下模式就行了,但是对于使用使用GPIO模拟或者FPGA来实现SPI的时序,这一点是非常非常重要的。
Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal) ,每种模式由时钟信号中的时钟极性(clock polarity)CPOL与时钟周期(clock phase)CPHA来定义。
不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的,但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,从而实现主从通讯。
时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态;时钟相位CPHA是用来配置数据采样是在第几个边沿。
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时; CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时; CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿; CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。 在高电平有效状态时,第一边沿为上升沿,第二边沿为下降沿;在低电平有效状态时,第一边沿为下降沿,第二边沿为上升沿
具体四种模式如下:
CPOL = 0,CPHA = 0:时钟高电平时为有效状态,时钟上升沿(第一个边沿)采样。 CPOL = 0,CPHA = 1:时钟高电平时为有效状态,时钟下降沿(第二个边沿)采样。 CPOL = 1,CPHA = 0:时钟低电平时为有效状态,时钟下降沿(第一个边沿)采样。 CPOL = 1,CPHA = 1:时钟低电平时为有效状态,时钟上升沿(第二个边沿)采样。
I2C
I2C(Inter-Integrated Circuit):I2C是一种串行通信协议,用于在芯片之间传输数据。它使用两根线(SDA和SCL)进行通信,其中SDA是数据线,SCL是时钟线。I2C协议支持多主机和多从机的通信,可以连接多个设备。I2C通常用于连接传感器、存储器、显示器等设备。 IIC 是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用serial data (SDA)数据线 和 serial clock(SCL)时钟线两条信号线,数据线用来传输数据,时钟线用来同步数据收发。两根信号线都是双向传输的,这两条线都是漏极开路或者集电极开路结构,使用时需要外加上拉电阻,可以挂载多个设备。