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

STM32CubeMX-HAL库的SPI接口使用

[复制链接]
STMCU 发布时间:2020-10-19 13:37
STM32CubeMX-HAL库的SPI接口使用


本文主要介绍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):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。
    其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应。下图是主器件与多个从器件通信图。
11.png
SPI特性
    单次传输可选择为 8 或 16 位。波特率预分频系数(最大为 fPCLK/2) 。时钟极性(CPOL)和相位(CPHA)可编程设置。数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。

    注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。
    可触发中断的专用发送和接收标志。可以使用 DMA 进行数据传输操作。下图是STM32的SPI框架图。
12.png
    如上图,MISO数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI数据线。SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。
    控制寄存器 CR1掌管着主控制电路,STM32的 SPI模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2则用于设置各种中断使能。
    最后为 NSS引脚,这个引脚扮演着 SPI协议中的SS片选信号线的角色,如果我们把 NSS引脚配置为硬件自动控制,SPI模块能够自动判别它能否成为 SPI的主机,或自动进入 SPI从机模式。但实际上我们用得更多的是由软件控制某些 GPIO引脚单独作为SS信号,这个 GPIO引脚可以随便选择。
SPI时钟时序
    根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。
    时钟极性(CPOL)定义了时钟空闲状态电平:
CPOL=0为时钟空闲时为低电平
CPOL=1为时钟空闲时为高电平
    时钟相位(CPHA)定义数据的采集时间。
CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。
CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。
13.png
CubeMX软件配置SPI:
    下面继续介绍cubeMX软件配置STM32L152的SPI接口方法。

(1)打开软件,选择对应芯片后,配置好时钟源;
(2)勾选SPI1为全双工,硬件NSS关闭,如下图:
14.png
(3)勾选好后,PA5、PA6、PA7如下图,在配置PA4为普通io口,gpio_output
15.png
(4)SPI1的参数配置选择默认,如下图所示
16.png
(5)生成代码,保存即可。
    HAL库的SPI函数分析:
    下面具体分析下生成的SPI函数和函数调用。

SPI_HandleTypeDef hspi1; //SPI结构体类定义,下面看其结构体内部的声明。
17.png
18.png

下面分析SPI的初始化函数:


  1. void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. if(hspi->Instance==SPI1)
  5. {
  6. /* USER CODE BEGIN SPI1_MspInit 0 */
  7. /* USER CODE END SPI1_MspInit 0 */
  8. /* Peripheral clock enable */
  9. __HAL_RCC_SPI1_CLK_ENABLE();//使能SPI1时钟
  10. /**SPI1 GPIO Configuration
  11. PA5     ------> SPI1_SCK
  12. PA6     ------> SPI1_MISO
  13. PA7     ------> SPI1_MOSI
  14. */
  15. GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
  16. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  17. GPIO_InitStruct.Pull = GPIO_NOPULL;
  18. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  19. GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  20. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//配置SPI的数据线和时钟线
  21. /* USER CODE BEGIN SPI1_MspInit 1 */
  22. /* USER CODE END SPI1_MspInit 1 */
  23. }

  24. static void MX_SPI1_Init(void)
  25. {
  26. hspi1.Instance = SPI1;
  27. hspi1.Init.Mode = SPI_MODE_MASTER;//主模式
  28. hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工
  29. hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为8位
  30. hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0,low
  31. hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿
  32. hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSS
  33. hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz
  34. hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送
  35. hspi1.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭
  36. hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭
  37. hspi1.Init.CRCPolynomial = 10;//默认值,无效
  38. if (HAL_SPI_Init(&hspi1) != HAL_OK)//初始化
  39. {
  40. _Error_Handler(__FILE__, __LINE__);
  41. }
  42. }
复制代码


利用SPI接口发送和接收数据主要调用以下两个函数:


  1. HAL_StatusTypeDef  HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据
  2. HAL_StatusTypeDef  HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据
复制代码







收藏 1 评论0 发布时间:2020-10-19 13:37

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版