SPI学习(HAL库版)
一、概述
SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线可直接与各个厂家生产的多种标准外围器件相连,包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线NSS。(摘自百度百科)
二、SPI驱动(参考正点原子例程)
1、SPI初始化
SPI_HandleTypeDef SPI2_Handler; //SPI1句柄 //以下是SPI模块的初始化代码,配置成主机模式 //SPI口初始化 //这里针是对SPI1的初始化 void SPI2_Init(void) { SPI2_Handler.Instance=SPI2; //SPI2 SPI2_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式 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_Init(&SPI2_Handler); SPI2_ReadWriteByte(0Xff); //启动传输 } //SPI5底层驱动,时钟使能,引脚配置 //此函数会被HAL_SPI_Init()调用 //hspi:SPI句柄 void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟 __HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2时钟 //PB13,14,15 GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //快速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); }
- 第一个函数SPI2_Init()用于被调用以初始化SPI,第二个函数,本例中使用芯片上的SPI2。
-
SPI2_Init(void) 函数中使用SPI2句柄初始化了SPI2:Instance 选择使用哪个SPI设备;Init.Mode 设置本设备为主设备还是从设备;Init.Direction 设置双线模式(全双工)、单线模式(单工)或其他模式,一般设置为全双工;Init.DataSize 设置8为数据传输还是16位数据传输;Init.CLKPolarity 设置时钟空闲状态为高电平还是低电平,若是高电平数据在下降沿时被采样,若是低电平数据在上升沿时被采样;Init.CLKPhase 设置在第一或第二个跳变沿采样;Init.NSS设置NSS位由软件还是硬件控制,这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为片选引脚,让主设备单独的与特定设备通讯,避免数据冲突,软件控制时NSS=0为选中;Init.BaudRatePrescaler设置分频值可设置传输速率,一般小数据量不用特别重视;Init.FirstBit设置是高数据位(MBS)先传输还是低数据位(LSB)先传输;Init.TIMode设置是否使用TI模式,默认使用,但一般不使用,这个TI的使用和不使用只是在片选时有些不同,其余都一样;Init.CRCCalculation和Init.CRCPolynomial为是否使用CRC校验和CRC多项式,一般不使用校验,多项式写7(暂时不知道为什么)。最后HAL_SPI_Init(&SPI2_Handler)初始化SPI2。
-
HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)内初始化啊SPI2使用的PB13、PB15、PB14引脚为复用推挽输出,并使能引脚和SPI2时钟,在HAL_SPI_Init(&SPI2_Handler)初始化的时候内部调用。
2、SPI数据的传输与接收
HAL库提供了一个原始的发送接收函数HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)。
参数:
在阻塞模式下发送和接收大量数据
@param hspi:指向一个spihandletypedef结构的指针SPI模块的配置信息。
@param pTxData:指向传输数据缓冲区的指针
@param pRxData:指向接收数据缓冲区的指针
@param大小:要发送的数据量
@param超时:超时时间
* @return SPI状态
三、结语
未尽事宜请查看正点原子HAL库版教程和STM32参考手册