CuberMx的SPI配置信息

  • Mode: Full-Duplex Master(全双工主机)
  • Hardware NSS Signal: Disable(不使用)Hardware NSS Input Signal(输入)Hardware NSS Output Signal(输出**)**
  • Frame Format: SPI方式。主要有Motorola(摩托罗拉)TI
  • Data Size: 数据位的格式
  • First Bit: MSB First(高位先行)LSB First(低位先行)
  • Prescaler (for Baud …):分频。比特率
  • Clock Polarity(CPOL) : Low(低)High(高)
  • Clock Phase(CPHA) : 1Edge(奇数次跳变沿采用)2Edge(偶数次)
  • CRC Calculation: 校验选择。Disbale(不使用)、Enable(使用),会出现CRC Polynomial(默认给出X1+X3,2的3次方加2的一次方)一般讲多项式一般为奇数
  • NSS Signal Type : Sofeware(软件控制)
  • DMA Setting:主要的SPI配置
    • ADD:添加通道,可以选择收发俩路DMA; DMA通道和流是自动分配的
    • Mode: Normal(默认) circle模式
    • Data Width: 数据格式。 byte(8进制) 和 half word(十六进制)

HAL库函数配置信息

查询模式(阻塞方式)
  • HAL_SPI_Transmit(SPI_HandleTypeDef hspi,uint8_t pData, uint16_t Size, uint32_t Timeout);
  • HAL_SPI_Receive(SPI_HandleTypeDef hspi,uint8_t pData, uint16_t Size, uint32_t Timeout);
  • HAL_SPI_TransmitReceive(SPI_HandleTypeDef hspi,uint8_t pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

实际上三个函数的功能基本一致,为什么分为三个函数?

实际上是在函数内部,它会忽略一些数据。比如使用HAL_SPI_Transmit()(发送),如果发送的话,会主动忽略收到的数据

  • SPI_HandleTypeDef *hspi: 操作spi的指针
  • uint8_t *pData: 发送数据的首地址(数据包的首地址)
  • uint16_t Size: 发送的个数
  • uint32_t Timeout: 发送的超时时间

说明了HAL_SPI_Transmit只在意发送数据包的缓存首地址; HAL_SPI_Receive只在乎了接收时数据包的首地址;这俩个只在乎了单向的数据。HAL_SPI_TransmitReceive()就是双向的了。

中断模式
  • HAL_SPI_Transmot_IT(SPI_HandleTypeDef hspi,uint8_t pData,uint16_t Size);
  • HAL_SPI_Receive_IT(SPI_HandleTypeDef hspi,uint8_t pData,uint16_t Size);
  • HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef hspi,uint8_t pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

中断方式也是跟查询方式一一对应的,在每一个函数后面加了个_IT这个实际上就是使用了中断响应的。这样子我们去发一个数据,发完了以后能跳进发送中断的回调函数,接收也一样

DMA模式
  • HAL_SPI_Transmit_DMA(SPI_HandleTypeDef hspi,uint8_t pData, uint16_t Size, uint32_t Timeout);
  • HAL_SPI_Receive_DMA(SPI_HandleTypeDef hspi,uint8_t pData, uint16_t Size, uint32_t Timeout);
  • HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef hspi,uint8_t pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

DMA模式也是同样的三个函数,DMA模式相对来讲我们在使用大部分SPI的应用比较少。只在长时间(接收/发送)同样的信息来讲的时候或者发送同样的信息的时候会用到DMA模式。第一:高速的AD(有时不会用到单片机自身上的AD,使用的时外置的ADC芯片)(DMA采集模式); 在屏幕上不断的更新数据,我们就可以用DMA模式把我们要显示点的坐标通过DMA模式不断的往屏幕上发,这样就可以实现某一个通道采集的数据或者内部的温度湿度数据不断的通过SPI往屏幕上发(DMA发送模式)