当前位置: 首页 > article >正文

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);

比较总结

特性UARTI2CSPI
通信方式异步通信同步通信同步通信
总线结构点对点多主多从主从结构
信号线数2根(TX、RX)2根(SDA、SCL)4根(MISO、MOSI、SCK、SS)
速度低速到中速较慢(100kHz-400kHz)较快(可达数MHz)
数据传输全双工半双工全双工
典型应用串口通信(GPS、蓝牙、串口调试)传感器、EEPROM、显示器等闪存、SD卡、LCD显示、传感器等

总结

  • UART适用于低速、点对点通信的场景,配置简单。
  • I2C适用于低速但需要多个设备连接的场景,尤其适用于传感器和EEPROM。
  • SPI适用于高速、全双工的应用,常用于数据存储和传感器接口。

在实际使用中,根据设备间的距离、数据速率要求、通信协议的复杂度等因素来选择最合适的通信接口。


http://www.kler.cn/a/402384.html

相关文章:

  • 【深度学习】利用Java DL4J构建金融欺诈检测系统
  • SpringBoot(9)-Dubbo+Zookeeper
  • 道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选
  • STM32端口模拟编码器输入
  • 数据库的联合查询
  • 设计模式之 模板方法模式
  • 鸿蒙NEXT开发-用户通知服务的封装和文件下载通知
  • Vue 3 中使用 `<script setup>` 语法糖实现模板插值表达式
  • TongRDS 可视化连接
  • 机器学习极简史
  • 大数据新视界 -- 大数据大厂之大数据与虚拟现实的深度融合之旅
  • mybatis-plus雪华算法
  • Git如何简单使用
  • Chainlit快速实现AI对话应用将聊天记录的持久化到MySql关系数据库中
  • D69【 python 接口自动化学习】- python 基础之数据库
  • Golang | Leetcode Golang题解之第564题寻找最近的回文数
  • 如何使用ChatGPT写推荐信?
  • 阿里巴巴工程师最新版 1180 道 Java 面试题及答案整理
  • 【单片机硬件基础】CPU结构和功能
  • 将容器测试托管到Jenkins
  • PGSQL记录
  • 每天10个vue面试题(九)
  • odoo使用SSE
  • 高效Django随机查询优化方案
  • SpringFrameWork基于配置类方式管理Bean
  • go-zero(二) api语法和goctl应用