HAL库SPI通信

1初始化配置

1.1初始化SPI外设代码(CUBEMX配置好的)

#include "spi.h"

SPI_HandleTypeDef hspi1;

/* SPI1 init function 配置SPI参数*/
void MX_SPI1_Init(void)
{
  hspi1.Instance = SPI1;
//主从模式
  hspi1.Init.Mode = SPI_MODE_MASTER;
//通信模式
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工
// SPI_DIRECTION_2LINES_RXONLY;//半双工SPI_DIRECTION_1LINES;单工
//数据大小
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//SPI_DATASIZE_16BIT
//工作模式,主机要和从机的工作模式一致
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//极性,SPI_POLARITY_HIGH
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//相位,SPI_PHASE_2EDGE
//NSS引脚
  hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制
//SPI_NSS_HART_INPUT;SPI_NSS_HART_OUTPUT;硬件输入,硬件输出
//波特率,SPI分频后不要大于手册规定的SPI的最大时钟
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
//数据发送
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//高位先发;SPI_FIRSTBIT_LSB;//低位先发
//TI模式
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
//CRC校验
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;

  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1)!= HAL_OK)
  {
    Error_Handler();
  }

回调函数(CUBEMX配置好的)

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
  /配置SPI引脚为复用功能*/
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(spiHandle->Instance==SPI1)
  {
    /* SPI1 clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();

    /配置SPI引脚为复用功能*/
    GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;//上电默认调试引脚(须看手册引脚),所以需要Alternate才能有波形
    HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
  }
}

1.2使用cubeMX配置SPI

选择Disable软件控制

HAL库SPI通信_第1张图片

HAL库SPI通信_第2张图片

HAL库SPI通信_第3张图片

软件片选需要另外分一个单片机引脚给CS信号,GPIO输出功能,最好配置为上拉。

先在spi.c封装SPI_ReadWriteByte函数。

uint8_t SPI_ReadWriteByte(uint8_t TxData)
{
  uint8_t Rxdata;
  HAL_SPI_TransmitReceive(&hspi1,&TxData,&Rxdata,1, 1000);      
  return Rxdata;                                           
}

2常用函数使用说明

2.1发送数据


/**
  *@brief  Transmit an amount of data in blocking mode.
  *@param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module./句柄指针
  *@param  pData pointer to data buffer/发送数据数组名
  *@param  Size amount of data to be sent/发送数组长度
  *@param  Timeout Timeout duration /timeout,超出这个时间就报错,单位是ms
  *@retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

2.2接收数据

/**
  * @brief  Receive an amount of data in blocking mode.
  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module.
  * @param  pData pointer to data buffer
  * @param  Size amount of data to be received
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

2.3发送和接收

一般采用这个函数

/**
  *@brief  Transmit and Receive an amount of data in blocking mode.
  *@param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module.
  *@param  pTxData pointer to transmission data buffer//数组
  *@param  pRxData pointer to reception data buffer//数组
  *@param  Size amount of data to be sent and received
  *@param  Timeout Timeout duration
  *@retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

你可能感兴趣的:(单片机,stm32)