STM32的SPI外设

news/2024/11/15 7:03:31/

文章目录

    • 1. STM32 的 SPI 外设简介
    • 2. STM32 的 SPI 架构剖析
      • 2.1 通讯引脚
      • 2.2 时钟控制逻辑
      • 2.3 数据控制逻辑
      • 2.4 整体控制逻辑
    • 3. 通讯过程
    • 4. SPI 初始化结构体详解

1. STM32 的 SPI 外设简介

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F407 型号的芯片默认 fpclk142MHz, fpclk2 为 84MHz),完全支持 SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行

2. STM32 的 SPI 架构剖析

请添加图片描述

2.1 通讯引脚

SPI 的所有硬件架构都从图 SPI 架构图 中左侧 MOSI、 MISO、 SCK 及 NSS 线展开的。 STM32 芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,见表 STM32F4xx 的 SPI 引脚。关于 GPIO 引脚的复用功能,可查阅《STM32F4xx 规格书》,以它为准。

STM32F4xx 的 SPI 引脚

引脚SPI 编号
SPI1SPI2SPI3SPI4SPI5SPI6
MOSIPA7/PB5PB15/PC3/PI3PB5/PC12/PD6PE6/PE14PF9/PF11PG14
MISOPA6/PB4PB14/PC2/PI2PB4/PC11PE5/PE13PF8/PH7PG12
SCKPA5/PB3PB10/PB13/PD3PB3/PC10PE2/PE12PF7/PH6PG13
NSSPA4/PA15PB9/PB12/PI0PA4/PA15PE4/PE11PF6/PH5PG8

其中 SPI1、 SPI4、 SPI5、 SPI6 是 APB2 上的设备,最高通信速率达 42Mbtis/s, SPI2、 SPI3 是 APB1上的设备,最高通信速率为 21Mbits/s。

2.2 时钟控制逻辑

SCK 线的时钟信号,由波特率发生器根据“控制寄存器 CR1”中的 BR[0:2] 位控制,该位是对 fpclk时钟的分频因子,对 fpclk 的分频结果就是 SCK 引脚的输出时钟频率,计算方法见表 BR 位对 fpclk的分频 。

请添加图片描述

其中的 fpclk 频率是指 SPI 所在的 APB 总线频率, APB1 为 fpclk1, APB2 为 fpckl2。
通过配置“控制寄存器 CR”的“CPOL 位”及“CPHA”位可以把 SPI 设置成前面分析的 4 种 SPI模式。

2.3 数据控制逻辑

SPI 的 MOSI 及 MISO 都连接到数据移位寄存器上,数据移位寄存器的内容来源于接收缓冲区及发送缓冲区以及 MISO、 MOSI 线。

  • 当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;

  • 当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。

通过写 SPI 的“数据寄存器 DR”把数据填充到发送缓冲区中,通过“数据寄存器 DR”,可以获取接收缓冲区中的内容。

2.4 整体控制逻辑

整体控制逻辑负责协调整个 SPI 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的 SPI 模式、波特率、 LSB 先行、主从模式、单双向模式等等。

在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,只要读取状态寄存器相关的寄存器位,就可以了解 SPI 的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生 SPI 中断信号、 DMA 请求及控制 NSS 信号线

实际应用中,一般不使用 STM32 SPI 外设的标准 NSS 信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

3. 通讯过程

STM32 使用 SPI 外设通讯时,在通讯的不同阶段它会对“状态寄存器 SR”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态
图主发送器通讯过程 中的是“主模式”流程,即 STM32 作为 SPI 通讯的主机端时的数据收发过程

请添加图片描述

主模式收发流程及事件说明如下

(1) 控制 NSS 信号线,产生起始信号
(2) 把要发送的数据写入到“数据寄存器 DR”中,该数据会被存储到发送缓冲区;
(3) 通讯开始, SCK 时钟开始运行。 MOSI 把发送缓冲区中的数据一位一位地传输出去; MISO 则把数据一位一位地存储进接收缓冲区中;
(4) 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE 标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
(5) 等待到“TXE 标志位”为 1 时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的内容。

假如使能了 TXE 或 RXNE 中断, TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数,到 SPI 中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA 方式来收发“数据寄存器 DR”中的数据。

4. SPI 初始化结构体详解

STM32 标准库提供了 SPI 初始化结构体及初始化函数来配置 SPI 外设。初始化结构体及函数定义在库文件“stm32f4xx_spi.h”及“stm32f4xx_spi.c”中

typedef struct
{uint16_t SPI_Direction; 	/* 设置 SPI 的单双向模式 */uint16_t SPI_Mode; 			/* 设置 SPI 的主/从机端模式 */uint16_t SPI_DataSize; 		/* 设置 SPI 的数据帧长度,可选 8/16 位 */uint16_t SPI_CPOL; 			/* 设置时钟极性 CPOL,可选高/低电平 */uint16_t SPI_CPHA; 			/* 设置时钟相位,可选奇/偶数边沿采样 */uint16_t SPI_NSS; 			/* 设置 NSS 引脚由 SPI 硬件控制还是软件控制*/uint16_t SPI_BaudRatePrescaler; 	/* 设置时钟分频因子, fpclk/分频数 =fSCK */uint16_t SPI_FirstBit; 				/* 设置 MSB/LSB 先行 */uint16_t SPI_CRCPolynomial; 		/* 设置 CRC 校验的表达式 */
}SPI_InitTypeDef;

http://www.ppmy.cn/news/93215.html

相关文章

Centos安装Vtiger CRM

1.下载centos7,好像2024维护就过期了 http://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/ 2.下载Vtiger CRM 安装包,看一下里面的安装说明 https://www.vtiger.com/open-source-crm/download-open-source/#download Installation Vtiger CRM is web-applicati…

目标检测YOLO实战应用案例100讲-基于FPGA的目标检测硬件加速技术及其应用研究

目录 基于FPGA的目标检测加速器设计 目标检测算法与加速方法 2.1 YOLO v2算法

分布式消息中间件RocketMQ的应用

RocketMQ 应用 所有代码同步至GitCode:https://gitcode.net/ruozhuliufeng/test-rocketmq.git 普通消息 消息发送分类 ​ Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果。 同步发送消息 ​ 同步发送消息是指,P…

java版深圳 工程管理系统软件 自主研发,工程行业适用 软件源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

初学Qt(Day04)

今日目标 创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在qt开发界面输出坐标,每当松开鼠标,手柄自动复位。 目标是实现类似下面这种 先说结论(免得我又忘记了):没写完,是一…

Systrace系列5 —— SurfaceFlinger 解读

本文主要是对 SurfaceFlinger 进行简单介绍,介绍了 SurfaceFlinger 中几个比较重要的线程,包括 Vsync 信号的解读、应用的 Buffer 展示、卡顿判定等,由于 Vsync 这一块在Systrace 基础知识 - Vsync 解读 和 Android 基于 Choreographer 的渲染机制详解 这两篇文章里面已经介…

提示msvcr120.dll丢失怎么办?由于找不到msvcr120.dll如何修复?

msvcr120.dll 是 Microsoft Visual C 文件中的一个重要组件。它是一种动态链接库,包含了很多函数,提供了许多基础的 C 运行时支持。这个库文件的主要功能是提供 C 应用程序的运行时环境,它是一些常用的 C 运行时库文件的集合。这些库包括了 m…

python+vue高校体育比赛赛事信息系统

本公共体育赛事管理系统是一个公共体育赛事管理信息的平台,采用vue,MYSQL的开发环境,后台使用python开发架构,并使用django简化对数据库方面的操作,基于B/S结构进行开发。本系统主要实现用户在线进行密码管理&#xff…