STM32学习笔记----UART、IIC、SPI的区别
在STM32微控制器中,UART(通用异步收发传输器)、I2C(串行外设接口)和SPI(串行外设接口)是三种常见的通信协议。它们各自有不同的用途、特性和工作方式。它们的基本区别在于通信协议、数据传输方式以及硬件连接方式。下面我会详细介绍它们之间的区别,以及在使STM32标准库时如何进行配置和使用。
1. UART(Universal Asynchronous Receiver Transmitter)
UART是串行通信协议中的一种,用于点对点的全双工通信。它的特点是采用异步传输模式,即数据的发送和接收不需要同步时钟信号,通信双方约定好波特率、数据位、停止位等参数后即可进行数据交换。
特点:
- 异步通信:数据不需要同步时钟线,而是通过约定的波特率来控制传输速率。
- 全双工:同时可以进行发送和接收。
- 简单:硬件连接简单,常用于短距离的低速通信。
- 波特率配置:在标准库中,通过
USART_InitTypeDef
结构体来设置波特率、数据位、停止位等参数。
代码:
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置USART
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
// 使能USART
USART_Cmd(USART1, ENABLE);
2. I2C(Inter-Integrated Circuit)
I2C是一种双线串行通信协议,用于连接多个设备。I2C使用两根信号线:一根是数据线(SDA),另一根是时钟线(SCL)。它是半双工通信,即一次只能进行发送或接收。
特点:
- 双线通信:需要两根信号线,分别是SDA(数据线)和SCL(时钟线)。
- 多主多从:一个I2C总线上可以有多个主设备和多个从设备。
- 速率较低:通常适用于短距离的低速通信。
- 地址模式:每个I2C设备有一个唯一的地址,通过这个地址来识别不同设备。
- 支持多设备:可以在同一总线上连接多个设备,通过地址区分。
代码:
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 配置I2C的GPIO引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SDA, SCL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置I2C
I2C_InitStructure.I2C_ClockSpeed = 100000; // 100kHz
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x30; // 设备地址
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C1, &I2C_InitStructure);
// 使能I2C
I2C_Cmd(I2C1, ENABLE);
3. SPI(Serial Peripheral Interface)
SPI是一种同步串行通信协议,常用于高速数据传输。它通过四根信号线进行通信:MISO(主设备输入从设备输出),MOSI(主设备输出从设备输入),SCK(时钟信号),以及SS(从设备选择信号)。
特点:
- 同步通信:使用时钟信号来同步数据传输,确保数据在特定的时刻被接收或发送。
- 全双工:可以同时发送和接收数据。
- 速度较高:通常比I2C具有更高的传输速率。
- 连接方式:需要四根信号线,适用于高速数据交换。
- 点对点或主从模式:可以通过设置SS引脚来决定主从关系。
代码:
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 配置SPI的GPIO引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // SCK, MISO, MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置SPI
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
// 使能SPI
SPI_Cmd(SPI1, ENABLE);
比较总结
特性 | UART | I2C | SPI |
---|---|---|---|
通信方式 | 异步通信 | 同步通信 | 同步通信 |
总线结构 | 点对点 | 多主多从 | 主从结构 |
信号线数 | 2根(TX、RX) | 2根(SDA、SCL) | 4根(MISO、MOSI、SCK、SS) |
速度 | 低速到中速 | 较慢(100kHz-400kHz) | 较快(可达数MHz) |
数据传输 | 全双工 | 半双工 | 全双工 |
典型应用 | 串口通信(GPS、蓝牙、串口调试) | 传感器、EEPROM、显示器等 | 闪存、SD卡、LCD显示、传感器等 |
总结
- UART适用于低速、点对点通信的场景,配置简单。
- I2C适用于低速但需要多个设备连接的场景,尤其适用于传感器和EEPROM。
- SPI适用于高速、全双工的应用,常用于数据存储和传感器接口。
在实际使用中,根据设备间的距离、数据速率要求、通信协议的复杂度等因素来选择最合适的通信接口。