在之前的笔记中我们已经介绍了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;
}