STM32-SPI基础

在之前的笔记中我们已经介绍了SPI通信方式了,详见以下链接:http://t.csdn.cn/zc3P9

首先我们先介绍一些SPI相关的HAL库函数:

1、__HAL_RCC_SSPIx_CLK_ENABLE():使能SPI时钟;

2、HAL_SPI_Init():用SPI句柄初始化SPI;

3、HAL_SPI_MspInit():初始化SPI回调;

4、HAL_SPI_Transmit():SPI发送消息;

5、HAL_SPI_Receive():SPI接受消息;

6、HAL_SPI_TransmitReceive():SPI收发消息;

7、__HAL_SPI_ENABLE():使能SPI外设;

8、__HAL_SPI_DISABLE():失能SPI外设;

接下来介绍SPI初始化句柄 SPI_HandleTypeDef 的一些比较重要的成员参数:g_spi_handle

1、g_spi_handle.Instance:选用SPI的基地址;

2、g_spi_handle.Init.Mode:SPI模式(主机/从机);

3、g_spi_handle.Init.Direction:工作方式(全双工);

4、g_spi_handle.Init.DataSize:帧格式(8/16位);

5、g_spi_handle.Init.CLKPolarity:时钟极性(0代表高电平有效,1代表低电平有效);

6、g_spi_handle.Init.CLKPhase:时钟相位(0代表上升沿触发,1代表下降沿触发);

7、g_spi_handle.Init.NSS:SS片选控制方式(软件控制);

8、g_spi_handle.Init.BaudRatePrescaler:SPI波特率预分频器;

9、g_spi_handle.Init.FirstBit:数据传输顺序(MSB);

10、g_spi_handle.Init.TIMode:帧格式motorola;

11、g_spi_handle.Init.CRCCalculation:设置硬件CRC校验;

12、g_spi_handle.Init.CRCPolynomial:设置CRC校验多项式;、

接下来我们编写SPI实验的库:

首先我们编写函数文件spi.c:

#include "./BSP/SPI/spi.h"

SPI_HandleTypeDef g_spi2_handle;

void spi2_init(void){

    g_spi2_handle.Instance = SPI2_SPI;
    g_spi2_handle.Init.Mode = SPI_MODE_MASTER;
    g_spi2_handle.Init.Direction = SPI_DIRECTION_2LINE;
    g_spi2_handle.Init.DataSize = SPI_DATASIZE_8BIT;
    g_spi2_handle.Init.CLKPolarity = SPI_POLARITY_HIGH;
    g_spi2_handle.Init.CLKPhase = SPI_PHASE_2EDGE;
    g_spi2_handle.Init.NSS = SPI_NSS_SOFT;
    g_spi2_handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    g_spi2_handle.Init.FirstBit = SPI_FIRSTBIT_MSB;
    g_spi2_handle.Init.TIMode = SPI_TIMODE_DISABLE;
    g_spi2_handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    g_spi2_handle.Init.CRCPolynomial = 7;

    HAL_SPI_Init(&g_spi2_handle);
    
}

void _HAL_SPI_MspInit(SPI_HandleTypeDef *hspi){
    GPIO_InitTypeDef gpio_init_struct;

    if(g_spi2_handle.Instance == SPI2_SPI){
        SPI2_SPI_CLK_ENABLE();
        SPI2_MISO_GPIO_CLK_ENABLE();
        SPI2_MOSI_GPIO_CLK_ENABLE();

        gpio_init_struct.Pin = SPI2_SCK_GPIO_PIN;
        gpio_init_struct.Mode = GPIO_MODE_AF_PP;
        gpio_init_struct.Pull = GPIO_PULLUP;
        gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(SPI2_SCK_GPIO_PORT, &gpio_init_struct);

        gpio_init_struct.Pin = SPI2_MISO_GPIO_PIN;
        HAL_GPIO_Init(SPI2_MISO_GPIO_PORT, &gpio_init_struct);

        gpio_init_struct.Pin = SPI2_MOSI_GPIO_PIN;
        HAL_GPIO_Init(SPI2_MOSI_GPIO_PORT, &gpio_init_struct);
    }
}

uint8_t spi2_read_write_byte(uint8_t data){
    uint8_t rec_data = 0;
    HAL_SPI_TransmitReceive(&g_spi2_handle, data, rec_data, 1, 1000);
    return rec_data;
}

你可能感兴趣的:(stm32,stm32,单片机,嵌入式硬件)