你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32CubeMX-HAL库的SPI接口使用

[复制链接]
STMCU小助手 发布时间:2022-6-26 11:57
   本文主要介绍STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。
STM32之SPI简介:SPI协议【Serial Peripheral Interface】
    串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASH\ADC\LCD等模块之间的通信。
SPI信号线
    SPI 共包含 4 条总线。
  • SS(Slave Select):片选信号线,当有多个SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。
  • SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。
  • MOSI (Master Output Slave Input):主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。
  • MISO(Master Input Slave Output):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。

    " s' I- f' P) O  p& R

    0 |1 ]- n  L7 ^( O+ d$ w) g$ L  _
    其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应。下图是主器件与多个从器件通信图。

- `6 r: s4 M  m8 E# J" k
微信图片_20220626115724.png

# M! ?0 E! p# Z# W' X; |SPI特性
    单次传输可选择为 8 或 16 位。波特率预分频系数(最大为 fPCLK/2) 。时钟极性(CPOL)和相位(CPHA)可编程设置。数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。
    注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。
    可触发中断的专用发送和接收标志。可以使用 DMA 进行数据传输操作。下图是STM32的SPI框架图。

/ ]9 A6 ~/ C0 X. X: h
微信图片_20220626115722.png
' g( E0 v1 i/ q: z( y. [1 b
    如上图,MISO数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI数据线。SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。
    控制寄存器 CR1掌管着主控制电路,STM32的 SPI模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2则用于设置各种中断使能。
    最后为 NSS引脚,这个引脚扮演着 SPI协议中的SS片选信号线的角色,如果我们把 NSS引脚配置为硬件自动控制,SPI模块能够自动判别它能否成为 SPI的主机,或自动进入 SPI从机模式。但实际上我们用得更多的是由软件控制某些 GPIO引脚单独作为SS信号,这个 GPIO引脚可以随便选择。
# P/ u7 f, b; @2 G8 t
SPI时钟时序
    根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。
    时钟极性(CPOL)定义了时钟空闲状态电平:
  • CPOL=0为时钟空闲时为低电平
  • CPOL=1为时钟空闲时为高电平
    0 Z& W8 ]+ }3 t: o; ]

    7 t1 O, |9 O, {
    时钟相位(CPHA)定义数据的采集时间。
  • CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。
  • CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。

    . V: I5 b2 |) a! }  h

    ; }1 `1 h* P% r- n
微信图片_20220626115715.png
2 c, I5 `+ C4 s3 N, |0 `1 o/ P7 K
CubeMX软件配置SPI:
    下面继续介绍cubeMX软件配置STM32L152的SPI接口方法。
(1)打开软件,选择对应芯片后,配置好时钟源;
(2)勾选SPI1为全双工,硬件NSS关闭,如下图:
# U8 }. K) B; |( p9 c4 j$ R
微信图片_20220626115712.png

6 `7 O$ e) X  t6 L
(3)勾选好后,PA5、PA6、PA7如下图,在配置PA4为普通io口,gpio_output
8 e$ p1 Y, c+ U7 a/ M0 [0 i
微信图片_20220626115709.png
* c9 a2 r+ b" j' L, y' W
(4)SPI1的参数配置选择默认,如下图所示

" F  ~/ F3 k) M" L) w( x
微信图片_20220626115706.png
+ d4 \* W3 o7 O( l' A
(5)生成代码,保存即可。
    HAL库的SPI函数分析:    下面具体分析下生成的SPI函数和函数调用。
  1. SPI_HandleTypeDef hspi1; //SPI结构体类定义,下面看其结构体内部的声明。
复制代码

5 ]8 S8 x1 Q# {+ @' W+ d
微信图片_20220626115701.png
" A" _% i6 p$ a
微信图片_20220626115659.png
  ~" c, J* L7 G! Z3 D" d
( {3 F) u* X' C' g. Y
微信图片_20220626115656.png

; P( t- C  @3 z) X5 o3 T
    下面分析SPI的初始化函数:
  1. void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)1 w2 |  H( u  ^+ w4 I# f" G% ^
  2. {8 x( _( v0 Z* ]
  3. GPIO_InitTypeDef GPIO_InitStruct;) ]0 v$ S4 W0 o! @- w3 @2 \" A
  4. if(hspi->Instance==SPI1)5 @6 |& h" q6 {. ]: u) ~
  5. {1 D! h: j. l2 l. j# y) P$ R
  6. /* USER CODE BEGIN SPI1_MspInit 0 */
    8 K3 D% I1 n: I) }  c
  7. /* USER CODE END SPI1_MspInit 0 */
    3 D3 Z  S8 Q4 z) o8 |' _; e
  8. /* Peripheral clock enable */% v$ w! u8 N- T! R; \# x3 j9 l3 e
  9. __HAL_RCC_SPI1_CLK_ENABLE();//使能SPI1时钟
      P6 Z% }& `$ a* H
  10. /**SPI1 GPIO Configuration
    " A& ]# J4 ]  v5 H' C/ l) A" U" X! f
  11. PA5     ------> SPI1_SCK& T( E# X$ C  n& O
  12. PA6     ------> SPI1_MISO: a0 t! Q/ w  p
  13. PA7     ------> SPI1_MOSI9 g* ?9 R* M  Y' u8 c% d
  14. */
    0 ^0 R# x5 G( B. W, o! z3 Y, K
  15. GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    6 x7 S$ V9 a1 n3 i$ ^
  16. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    % x, b* S$ O0 V. _" B
  17. GPIO_InitStruct.Pull = GPIO_NOPULL;5 P/ k0 T7 q4 u! T3 o& c. `) p. V6 J
  18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;# t5 L2 P: c. \* T- Z2 c
  19. GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    4 y6 F5 k1 Y6 n% D( N2 I/ `% a# j
  20. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//配置SPI的数据线和时钟线
    : ~: m1 J% o5 t3 y5 i- Y! ]
  21. /* USER CODE BEGIN SPI1_MspInit 1 */
    0 q0 q# V! N0 J( G: k6 v# S: V
  22. /* USER CODE END SPI1_MspInit 1 */
    3 M+ R) [$ I4 W8 v) N* P
  23. }' z. J' `1 x) g8 q5 E4 ]# F

  24. / ~- e8 M6 y3 i, k9 g1 F
  25. static void MX_SPI1_Init(void)4 Y8 {  n, F4 R/ F  k5 n" f2 M
  26. {
    - e* T/ u( ]/ r  ^
  27. hspi1.Instance = SPI1;
    5 Q! y7 S) Q6 j5 {' H! j
  28. hspi1.Init.Mode = SPI_MODE_MASTER;//主模式& ?, B+ N% z$ p. B$ _4 m# |; A
  29. hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工
    . ?; o/ I/ C7 p& ]
  30. hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为8位) e- D% J$ ~; h4 h$ h) Z8 ^
  31. hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0,low+ q) X! S* r! {+ m3 d; H
  32. hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿
    1 X; H' l: @9 x  j4 N
  33. hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSS
    ! }" W; t' y0 L3 D# o1 o6 M  G! q
  34. hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz
    - O9 r' v! R0 \  s
  35. hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送. P0 A2 Y5 v0 z! Q4 Q$ Z: Q
  36. hspi1.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭
    5 c+ p  h' A2 S  p8 O, t3 t; l
  37. hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
    9 m) G& a6 z8 ?! b3 L  }2 o8 a
  38. hspi1.Init.CRCPolynomial = 10;//默认值,无效
    2 R) }  X; U+ t7 ^1 M1 P
  39. if (HAL_SPI_Init(&hspi1) != HAL_OK)//初始化. _, H0 l% j$ v( ~0 q2 Y
  40. {
    7 i  ~1 l" z  i" e' ^/ k* l
  41. _Error_Handler(__FILE__, __LINE__);
    " M% Q" q+ R. T0 \! D
  42. }
    - e8 }7 M: m8 T$ V
  43. }
复制代码

, ^: g8 E7 w5 q
    利用SPI接口发送和接收数据主要调用以下两个函数:
  1. # \$ w8 s* k& ]+ n
  2. HAL_StatusTypeDef  HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据' D' ?$ @+ J9 d$ F6 f/ J# t
  3. HAL_StatusTypeDef  HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据
复制代码

6 J; @2 F; {8 E# h" |9 m2 i
微信图片_20220626115719.png
赞 收藏 评论1 发布时间:2022-6-26 11:57

举报

1个回答
海鸥的泪眸 回答时间:2022-7-1 10:45:04
虽然没看完, 但我大受震撼

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版