STMCU小助手
发布时间:2022-6-26 11:57
|
本文主要介绍STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。 STM32之SPI简介:SPI协议【Serial Peripheral Interface】 串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASH\ADC\LCD等模块之间的通信。 SPI信号线 SPI 共包含 4 条总线。
其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应。下图是主器件与多个从器件通信图。
SPI特性 单次传输可选择为 8 或 16 位。波特率预分频系数(最大为 fPCLK/2) 。时钟极性(CPOL)和相位(CPHA)可编程设置。数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。 注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。 可触发中断的专用发送和接收标志。可以使用 DMA 进行数据传输操作。下图是STM32的SPI框架图。
如上图,MISO数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI数据线。SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。 控制寄存器 CR1掌管着主控制电路,STM32的 SPI模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2则用于设置各种中断使能。 最后为 NSS引脚,这个引脚扮演着 SPI协议中的SS片选信号线的角色,如果我们把 NSS引脚配置为硬件自动控制,SPI模块能够自动判别它能否成为 SPI的主机,或自动进入 SPI从机模式。但实际上我们用得更多的是由软件控制某些 GPIO引脚单独作为SS信号,这个 GPIO引脚可以随便选择。 SPI时钟时序 根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。 时钟极性(CPOL)定义了时钟空闲状态电平:
时钟相位(CPHA)定义数据的采集时间。
CubeMX软件配置SPI: 下面继续介绍cubeMX软件配置STM32L152的SPI接口方法。 (1)打开软件,选择对应芯片后,配置好时钟源; (2)勾选SPI1为全双工,硬件NSS关闭,如下图:
(3)勾选好后,PA5、PA6、PA7如下图,在配置PA4为普通io口,gpio_output
(4)SPI1的参数配置选择默认,如下图所示
(5)生成代码,保存即可。 HAL库的SPI函数分析: 下面具体分析下生成的SPI函数和函数调用。
下面分析SPI的初始化函数:
利用SPI接口发送和接收数据主要调用以下两个函数:
|
| 虽然没看完, 但我大受震撼 |
SPI 32位宽DMA方式收发失败问题
SPI 高温读错最后一位?STM32F42xx 官方根治方案
经验分享 | LAT1470 SPI传输长度超过1024时出现异常的问题分析
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
【STM32C0评测】4、驱动Lorasx126x,实现透传
经验分享 | STM32 SPI半工单线通信示例
经验分享 | 多个SPI的DMA传输为何仅1个有效?
经验分享 | STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析
经验分享 | SPI传输时为何丢失2个数据?
微信公众号
手机版