单片机
返回首页

STM32 HAL库SPI函数学习指南

2025-09-28 来源:cnblogs

1、HAL_StatusTypeDef HAL_SPI_Init (SPI_HandleTypeDef * hspi)


 配置SPI通信的所有参数,主要是区分SPI的四种工作模式。


最终使用此函数初始化SPI外设,注意还要使用__HAL_SPI_ENABLE();函数开启SPI外设。


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

void SPI2_Init(void)

{

    SPI2_Handler.Instance=SPI2;                      //SP2

    SPI2_Handler.Init.Mode=SPI_MODE_MASTER;          //设置为主机

    SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式

    SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    //设置SPI的数据大小:SPI发送接收8位帧结构

    SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平

    SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;      //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

    SPI2_Handler.Init.NSS=SPI_NSS_SOFT;              //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

    SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256

    SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;     //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

    SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE;     //关闭TI模式

    SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验

    SPI2_Handler.Init.CRCPolynomial=7;               //CRC值计算的多项式

    HAL_SPI_Init(&SPI2_Handler);

    

    __HAL_SPI_ENABLE(&SPI2_Handler);                 //使能SPI2

}


2、HAL_StatusTypeDef HAL_SPI_DeInit (SPI_HandleTypeDef * hspi)


复位SPI外设的参数配置。适用方法同上。


3、void HAL_SPI_MspInit (SPI_HandleTypeDef * hspi)


SPI硬件初始化回调函数,自动被函数1调用,注意SPI中的CS 管脚是需要单独配置的,不能和MSIO、SCK、MOSI配合到一起。


void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

{

    GPIO_InitTypeDef GPIO_Initure;

    

    __HAL_RCC_GPIOF_CLK_ENABLE();       //使能GPIOF时钟

    __HAL_RCC_SPI5_CLK_ENABLE();        //使能SPI5时钟

    __HAL_RCC_SPI2_CLK_ENABLE();        //使能SPI2时钟

    __HAL_RCC_GPIOH_CLK_ENABLE();       //使能GPIOH时钟

    //SPI5引脚初始化PF7,8,9

    GPIO_Initure.Pin=GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉

    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速            

    GPIO_Initure.Alternate=GPIO_AF5_SPI5;           //复用为SPI5

    HAL_GPIO_Init(GPIOF,&GPIO_Initure);

    

    //SPI2引脚初始化PB13,14,15

    GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;   

    GPIO_Initure.Alternate=GPIO_AF5_SPI2;           //复用为SPI2

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化

GPIO_Initure.Pin=GPIO_PIN_7;   

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;           //RST

    HAL_GPIO_Init(GPIOH,&GPIO_Initure);             //初始化

  GPIO_Initure.Pin=GPIO_PIN_12;   

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;           //SPI2 CS

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化

}


4、void HAL_SPI_MspDeInit (SPI_HandleTypeDef * hspi)


使用方法同上。


5、HAL_StatusTypeDef HAL_SPI_Transmit (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data[] = 'SPI Send Data'

HAL_SPI_Transmit (&SPI2_Handler, data, sizeof(data),100);

SPI发送数据的函数(只发送数据)。通过阻塞的形式向外发送数据。



6、HAL_StatusTypeDef HAL_SPI_Receive (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data = 0;

HAL_SPI_Receive (&SPI2_Handler, &data, 1,100);

//接收一个字节的数据到data变量中存储

SPI接收数据函数(只接收数据)。通过阻塞的形式接收数据。


7、HAL_StatusTypeDef HAL_SPI_TransmitReceive (SPI_HandleTypeDef * hspi, uint8_t * pTxData, uint8_t * pRxData, uint16_t Size, uint32_t Timeout)



SPI收发一体函数,重点函数,发送数据和接收数据都可以使用此函数。


u8 SPI2_ReadWriteByte(u8 TxData)

{

    u8 Rxdata;

    HAL_SPI_TransmitReceive(&SPI2_Handler,&TxData,&Rxdata,1, 1000);       

  return Rxdata;              //返回收到的数据

}

8、HAL_StatusTypeDef HAL_SPI_Transmit_IT (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data[] = 'SPI Send Data'

HAL_SPI_Transmit_IT (&SPI2_Handler, data, sizeof(data));



SPI发送数据的函数(只发送数据)。通过发送中断的形式向外发送数据。


9、HAL_StatusTypeDef HAL_SPI_Receive_IT (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size)


SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

uint8_t data = 0;

HAL_SPI_Receive_IT (&SPI2_Handler, &data, 1);

SPI接收数据函数(只接收数据)。通过接收中断的形式接收数据。


10、HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT (SPI_HandleTypeDef * hspi, uint8_t * pTxData, uint8_t * pRxData, uint16_t Size)


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章