STM32 HAL库函数学习SPI篇

发布于:2025-04-10 ⋅ 阅读:(33) ⋅ 点赞:(0)

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)