STM32软件SPI库详解:从原理到实战
创作时间:
作者:
@小白创作中心
STM32软件SPI库详解:从原理到实战
引用
1
来源
1.
https://docs.keysking.com/docs/stm32/example/SPI_Soft/
SPI(串行外设接口)是一种广泛应用于嵌入式系统中的同步串行通信协议,主要用于集成电路之间的短距离有线通信。它通过四根线(SCLK、MOSI、MISO、CS)实现全双工通信,并支持CPOL(时钟极性)和CPHA(时钟相位)的灵活配置。本文将详细介绍STM32的软件SPI库,包括其基本概念、工作原理和具体使用方法。
SPI 简介
SPI(Serial Peripheral Interface)是一种同步串行通信协议,主要用于嵌入式系统中,用于集成电路之间的短距离有线通信。
典型应用场景有:
- W25QXX 系列 Flash
- MPU6050 陀螺仪
- NRF24L01 无线模块等。
一般情况下,SPI 通信有四根线:
- SCLK:时钟线,由主机产生
- MOSI:主机输出从机输入,主机向从机发送数据
- MISO:主机输入从机输出,从机向主机发送数据
- CS:片选线,用于选择从机
时钟相位和极性(CPOL、CPHA):
- CPOL:时钟极性,决定时钟信号在空闲时是高电平还是低电平
- CPOL = 0 时,SCLK 空闲时为低电平
- CPOL = 1 时,SCLK 空闲时为高电平
- CPHA:时钟相位,决定数据采样时机
- CPHA = 0 时,数据在第一个时钟沿采样
- CPHA = 1 时,数据在第二个时钟沿采样
- 例如:
- CPOL = 0,CPHA = 0 时,SCLK 空闲时为低电平,数据在第一个时钟沿采样(上升沿采样)
- CPOL = 1,CPHA = 0 时,SCLK 空闲时为高电平,数据在第一个时钟沿采样(下降沿采样)
- CPOL = 0,CPHA = 1 时,SCLK 空闲时为低电平,数据在第二个时钟沿采样(下降沿采样)
- CPOL = 1,CPHA = 1 时,SCLK 空闲时为高电平,数据在第二个时钟沿采样(上升沿采样)
时钟极性和相位的配置于目标芯片有关,需要根据目标芯片的 SPI 时序要求进行配置
SPI 通信流程实例:
- 这是一个典型的 SPI 通信流程,主机通过 SCLK 产生时钟信号,通过 MOSI 向从机发送数据,通过 MISO 从从机接收数据
配置 CPOL = 0,CPHA = 0 ,可见 SCLK 空闲时为低电平,数据在第一个时钟沿采样(上升沿采样)
通信波形文件包含在例程zip包中,可以使用【Saleae Logic 2】软件打开查看
例程讲解
下面介绍了如何使用软件SPI库
1、工程配置
- 开启外部晶振:在Pinout&Configuration -> System Core -> RCC 页面,将 High Speed Clock (HSE) 配置为 Crystal/Ceramic Resonator
- 配置时钟频率:在Clock Configuration 页面,将PLL Source 选择为 HSE,将System Clock Mux 选择为 PLLCLK,然后在HCLK (MHz) 输入72并回车,将HCLK频率配置为 72 MHz
- 分配引脚:将 PA12、PA15、PB3、PB1 分别设置为 GPIO_Output,并分别设置 User label 为 SPI_SCLK、SPI_MOSI、SPI_MISO、SPI_CS
这几个是学习板左下角的自定义引脚,如果需要使用其他引脚,可以自行修改,任意引脚都可以使用 - 配置GPIO:在 System Core -> GPIO
- 将 PA12、PA15、PB1 的 Maximum output speed 配置为 High
- 将 PB3 的 GPIO Pull-up/Pull-down 配置为 Pull-up
即 SPI_SCLK、SPI_MOSI、SPI_CS 配置为高速输出,SPI_MISO 配置为上拉输入
2、代码
(1) 初始化过程
- 拷贝库文件:将 softSPI.c、dwt_stm32_delay.c 文件拷贝到 Core -> Src 目录下,将 softSPI.h、dwt_stm32_delay.h 文件拷贝到 Core -> Inc 目录下。
- 添加头文件:在 main.c 中引用头文件
#include "softSPI.h"
- 初始化 SPI 实例结构体: 在 main 函数中初始化 SPI 实例结构体
// 分配 SCLK 引脚
SoftSPI1.SCLK_GPIO = SPI_SCLK_GPIO_Port;
SoftSPI1.SCLK_Pin = SPI_SCLK_Pin;
// 分配 MOSI 引脚
SoftSPI1.MOSI_GPIO = SPI_MOSI_GPIO_Port;
SoftSPI1.MOSI_Pin = SPI_MOSI_Pin;
// 分配 MISO 引脚
SoftSPI1.MISO_GPIO = SPI_MISO_GPIO_Port;
SoftSPI1.MISO_Pin = SPI_MISO_Pin;
// 分配 CS 引脚
SoftSPI1.CS_GPIO = SPI_CS_GPIO_Port;
SoftSPI1.CS_Pin = SPI_CS_Pin;
// 设置 SPI 时钟频率
SoftSPI1.Delay_Time = SPI_FREQ_10KHZ;
// 设置 SPI 时钟极性和相位
- 初始化 SPI 实例: 在 main 函数中初始化 SPI 实例
// 初始化 SPI 实例
SoftSPI_Init(&SoftSPI1);
(2) 进行 SPI 通信
- 使能片选:使用
SoftSPI_CS_Low
函数使能片选
// 使能片选
SoftSPI_CS_Low(&SoftSPI1);
- 收发数据: 使用
SoftSPI_WriteReadBuff
函数发送和接收数据
// 读写数据
SoftSPI_WriteReadBuff(&SoftSPI1, tx_buffer, rx_buffer, 4);
- 关闭片选:使用
SoftSPI_CS_High
函数关闭片选
// 关闭片选
SoftSPI_CS_High(&SoftSPI1);
热门推荐
微纤维布+清水,电视屏幕清洁神器
白醋清洁电视屏幕,不留痕的秘密
吃货福音:这些美食让你轻松补充甲钴胺和B12
萌宠来袭,教你写出满分文
面向医学前沿,揭示生命奥秘——二〇二四年世界科技发展回顾·生物医学篇
肿瘤疫苗有望成对抗晚期癌症新利器,全球正在加紧布局
宜城旅游攻略:自然风光与人文景观的完美融合
逾期协商还款如何进行有效沟通
南北方小年有别,祭灶扫尘迎新春
腊月二十三VS二十四:揭秘南北方小年祭灶之别
乞巧节的节日习俗,传统“七夕祭”!记住4大习俗,2大禁忌,日子越过越顺
“古代女生节”化身“中国情人节”
荷叶叫花鸡,原汁原味
【读文献】中国古代冶铁史答问
从“天工开物”看中国古代冶金技术的发展及其对现代工业的启示
他,华为芯片之父,直到退休都鲜为人知
全球收入纳税申报要点解析:中国企业家和高净值人士如何应对个税申报?
1963年2分硬币:从普通“铜片”到5万天价
1963年2分硬币身价几何?教你如何正确评估收藏价值
医药产业并购趋势:探索行业整合与创新发展新路径
国米主场对阵恩波利:历史优势明显,分析师预测3-1
国际米兰主场迎战恩波利,历史优势与状态加持剑指三分
北京热门打卡地:奥塔、奥森、奥园要大变样!
看完《热浪滚烫》想减肥?中医药师的说法讲清了减重原理
4种实用方法,快速恢复Windows 10删除的桌面文件
深圳公园总数达1290个,5分钟可达绿色空间
揭秘气象武器:战争中的环境破坏神器
三省六部九卿制:古代官制你理解多少?
巴以冲突半年:加沙陷“灾难性饥饿”,地区局势外溢
12万客流汇聚西北角,天津特色街区迎新春