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参考手册

 

 

posted @ 2018-06-13 20:03  sovagxa&静默  阅读(2815)  评论(0编辑  收藏  举报