STM32 HAL库 STM32CubeMX -- SPI

这篇具有很好参考价值的文章主要介绍了STM32 HAL库 STM32CubeMX -- SPI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、SPI 协议简介

SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。

它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。

SPI 物理层

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

SPI 通讯使用3 条总线及片选线,3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS),它们的作用介绍如下:

(1) SS( Slave Select): 从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下用NSS 表示。低电平表示选中

当有多个SPI 从设备与SPI 主机相连时,设备的其它信号线SCK、MOSI 及MIS O 同时并联到相同的SPI 总线上,即无论有多少个从设备,都共同只使用这3 条总线;
而每个从设备都有独立的这一条NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。

I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI 协议中没有设备地址,它使用NSS 信号线来寻址,当主机要选择从设备时,把该从设备的NSS 信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI 通讯。所以SPI 通讯以NSS 线置低电平为开始信号,以NSS 线被拉高作为结束信号。

(2) SCK (Serial Clock): 时钟信号线,用于通讯数据同步。

它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32 的SPI 时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

(3) MOSI (Master Output,Slave Input): 主设备输出/从设备输入引脚。

主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

(4) MISO(Master Input,,Slave Output): 主设备输入/从设备输出引脚。

主机从这条信线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

SPI 协议层

SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

SPI 基本通讯过程

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

这是一个主机的通讯时序。

NSS、SCK、MOSI 信号都由主机控制产生,而MISO 的信号由从机产生,主机通过该信号线读取从机的数据。MOSI 与MISO 的信号只在NSS 为低电平的时候才有效,在SCK 的每个时钟周期MOSI 和MISO 传输一位数据。
以上通讯流程中包含的各个信号分解如下:

通讯的起始和停止信号 :

标号(1)处,NSS 信号线由高变低,是SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
标号(6)处,NSS 信号由低变高,是SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

数据有效性:

SPI 使用MOSI 及MISO 信号线来传输数据,使用SCK 信号线进行数据同步。
MOSI 及MISO 数据线在SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或LSB 先行并没有作硬性规定,但要保证两个SPI 通讯设备之间使用同样的协定,一般都会采用上图中的MSB 先行模式。

标号(3)处,MOSI 及MISO 的数据在SCK 的上升沿期间变化输出,在SCK 的下降沿时被采样。即在SCK 的下降沿时刻,MOSI 及MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及MISO 为下一次表示数据做准备。

SPI 每次数据传输可以8 位或16 位为单位,每次传输的单位数不受限制。

CPOL/CPHA 及通讯模式:

上面讲述的时序只是SPI 中的其中一种通讯模式,SPI 一共有四种通讯模式,它们的主要区别是总线空闲时SCK 的时钟状态以及数据采样时刻。

为方便说明,在此引入“时钟极性CPOL”和“时钟相位CPHA”的概念。
时钟极性CPOL 是指SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即SPI 通讯开始前、NSS 线为高电平时SCK 的状态)。

CPOL=0 时,SCK 在空闲状态时为低电平,CPOL=1 时,则相反。时钟相位CPHA 是指数据的采样的时刻,当CPHA=0 时,MOSI 或MISO 数据线上的信号将会在SCK 时钟线的“奇数边沿”被采样。

当CPHA=1 时,数据线在SCK 的“偶数边沿”采样。就是下图

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

由CPOL 及CPHA 的不同状态,SPI 分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,实际中采用较多的是 “模式0”与“模式3”

SPI 模式CPOL CPHA 空闲时SCK 时钟 采样时刻
0 0 0 低电平 奇数边沿
1 0 1 低电平 偶数边沿
2 1 0 高电平 奇数边沿
3 1 1 高电平 偶数边沿

二、SPI 的架构

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

它还支持双线全双工、双线单向以及单线模式。其中双线单向模式可以同时使用MOSI 及MISO 数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

通讯引脚

SPI 的所有硬件架构都从上图中左侧MOSI、MISO、SCK 及NSS 线展开的。

STM32 芯片有多个SPI 外设,它们的SPI 通讯信号引出到不同的GPIO 引脚上,使用时必须配置到这些指定的引脚。

引脚 SPI 编号
SPI1 SPI2 SPI3
NSS PA4 PB12 PA15 下载口的TDI
CLK PA5 PB13 PB3 下载口的TDO
MISO PA6 PB14 PB4下载口的NTRST
MOSI PA7 PB15 PB5

其中SPI1 是APB2 上的设备,最高通信速率达36Mbtis/s,SPI2、SPI3 是APB1 上的设备,最高通信速率为18Mbits/s。

除了通讯速率,在其它功能上没有差异。其中SPI3 用到了下载接口的引脚,这几个引脚默认功能是下载,第二功能才是IO 口,如果想使用SPI3 接口,则程序上必须先禁用掉这几个IO 口的下载功能。一般在资源不是十分紧张的情况下,这几个IO 口是专门用于下载和调试程序,不会复用为SPI3。

时钟控制逻辑

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

BR[0:2] 分频结果(SCK 频率) BR[0:2] 分频结果(SCK 频率)
000 f pclk/2 100 f pclk/32
001 f pclk/4 101 f pclk/64
010 f pclk/8 110 f pclk/128
011 f pclk/16 111 f pclk/256

其中的fpclk 频率是指SPI 所在的APB 总线频率,APB1 为fpclk1,APB2 为fpckl2。

数据控制逻辑

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

当向外发送数据的时候,数据移位寄存器以“发送缓冲区”为数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到“接收缓冲区”中。通过写SPI 的“数据寄存器DR”把数据填充到发送缓冲区中,通讯读“数据寄存器DR”,可以获取接收缓冲区中的内容。

其中数据帧长度可以通过“控制寄存器CR1”的“DFF 位”配置成8 位及16 位模式;配置“LSBFIRST 位”可选择MSB 先行还是LSB 先行。

整体控制逻辑

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

在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,我们只要读取状态寄存器相关的寄存器位,就可以了解SPI 的工作状态了。

除此之外,控制逻辑还根据要求,负责控制产生SPI 中断信号、DMA 请求及控制NSS 信号线。

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

三、通讯过程

STM32 使用SPI 外设通讯时,在通讯的不同阶段它会对“状态寄存器SR”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

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

(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”中的数据。

四、STM32Cube MX配置

stm32cubemx配置spi,stm32,单片机,嵌入式硬件

Mode: 模式
Full-Duplex Master 主机全双工模式
Full-Duplex Slave 从机全双工模式
Half-Duplex Master 主机半双工模式
Half-Duplex Slave 从机半双工模式
Receive Only Master 只接收主机模式
Receive Only Slave 只接收从机模式
Transmit Only Master 只发送从机模式

Hardware NSS Signal : 硬件NSS信号

可以选择这里的固定引脚使能,也可以使用其他IO口接到外设的NSS上进行代替;

其中SIP1的片选NSS : SPI1_NSS(PA4)
其中SIP2的片选NSS : SPI2_NSS(PB12)

如果片选引脚没有连接硬件NSS信号,则需要选择软件片选

NSS管脚就是片选信号,作为主设备NSS管脚为高电平,从设备NSS管脚为低电平。

当NSS管脚为低电平时,该SPI设备被选中,可以和主设备进行通信。

在STM32中,每个SPI控制器的NSS信号引脚都具有两种功能,即输入和输出。输入就是NSS管脚接收外界的信号。输出就是将NSS的信号发给外界。

对于NSS的输入,分为软件输入和硬件输入
软件输入:
NSS分为内部管脚和外部管脚,通过设置spi_cr1寄存器的ssm位和ssi位都为1可以设置NSS管脚为软件输入模式且内部管脚提供的电平为高电平,其中SSM位为使能软件输入位。SSI位为设置内部管脚电平位。同理通过设置SSM和SSI位1和0则此时的NSS管脚为软件输入模式但内部管脚提供的电平为0。若从设备是一个其他的带有spi接口的芯片,并不能选择NSS管脚的方式,则可以有两种办法,一种是将NSS管脚直接接低电平。另一种就是通过主设备的任何一个gpio口去输出低电平选中从设备。
硬件输入:
主机接高电平,从机接低电平。文章来源地址https://www.toymoban.com/news/detail-544085.html

五、SPI HAL库函数

HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据
功能:HAL库 SPI发送数据函数
参数:
*hspi: 选择SPI1/2,比如&hspi1,&hspi2
*pData : 需要发送的数据,可以为数组
Size: 发送数据的字节数,1 就是发送一个字节数据
Timeout: 超时时间,就是执行发送函数最长的时间,超过该时间自动退出发送函数
HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据
功能:SPI接收数据函数
参数:
*hspi: 选择SPI1/2,比如&hspi1,&hspi2
*pData : 接收发送过来的数据的数组
Size: 接收数据的字节数,1 就是接收一个字节数据
Timeout: 超时时间,就是执行接收函数最长的时间,超过该时间自动退出接收函数
HAL_SPI_TransmitReceive_IT(&hspi1, TXbuf,RXbuf,CommSize);
当SPI上接收出现了 CommSize个字节的数据后,中断函数会调用SPI回调函数:

HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
用户可以重新定义回调函数,编写预定功能即可,在接收完成之后便会进入回调函数

到了这里,关于STM32 HAL库 STM32CubeMX -- SPI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32控制矩阵按键,HAL库,cubeMX配置

    我使用的是STM32F103RCT6这款单片机,HAL库,使用cubeMX配置。 使用矩阵按键实现功能的方法为轮询法 1.首先矩阵键盘原理图如下: 2.实物图 按照矩阵键盘接法,16个按键需要8个io口,我选择了PC口的0~7号引脚,前四个依次接矩阵键盘的行,后四个依次接矩阵键盘的列;矩阵键盘的

    2023年04月17日
    浏览(36)
  • STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

    时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向一定要勾选Use Micro LIB  获取ADC通道值 主函数   串口输出

    2024年02月15日
    浏览(24)
  • 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

    (1)编程平台:Keil5 (2)CubeMX (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link 下载器 (4)杜邦线若干         舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度

    2023年04月09日
    浏览(15)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(19)
  • STM32CubeMx配置ADC(多通道采集+DMA读取数据)(HAL库开发)

    目录 1、函数配置过程(这是标准库配置过程): 2、STM32CubeMx配置过程  3、main函数源文件 采集5路ADC数据,并用串口printf()函数打印出来。 实验现象:  ADC转换的初始条件: 1、使能 2、触发源条件完成(这个需要自己配置)利用:HAL_ADC_Start_DMA()函数; ADC中HAL开发优势就是,

    2023年04月08日
    浏览(32)
  • HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备

    编码电机测速 HAL库版 0.96\\\'OLED的使用 HAL库版STM32双轮自平衡车(一) ———代码思路和PID的简单介绍 HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备 HAL库版STM32双轮自平衡车(三) ———代码精讲 HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

    2024年02月05日
    浏览(34)
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

      STM32CubeMX是ST开发的一款图形配置工具,可通过配置自动生成 初始化代码 (并不包括逻辑代码)。以下是STM32CubeMX官方宣传图片,适用于Windows和macOS系统,用于生成初始化代码,一个图形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片,初始化代码

    2024年02月17日
    浏览(31)
  • 【STM32】cubeMX配置HAL库驱动L298N控制直流有刷电机

    目录 1.电机为什么需要驱动板呢?为什么不能用控制器直接控制电机呢? 2.H桥电路介绍 3.L298N原理介绍 4.实物接线图 5.CUBEMX配置 6.代码 7. 演示视频 L298N是常用来驱动小型直流有刷电机(两个)和步进电机(一个)的电机驱动板,其电路原理就是两个H桥电路,控制原理是使用

    2024年02月16日
    浏览(24)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(19)
  • STM32 HAL库 STM32CubeMX -- ADC

    ADC(Analog-to-Digital Converter)指模/数转换器或者模拟/数字转换器。 是指将连续变量的模拟信号转换为离散的数字信号的器件。 也就是将 模拟信号 转化为 数字信号 。 STM32f103 系列有3 个ADC,精度为12 位,每个ADC 最多有16 个外部通道和2个内部信号源。其中ADC1 和ADC2 都有16 个外部

    2024年02月15日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包