主要功能

  • 支持8bit或16bit的数据帧格式,可设置MBS(高位优先)/LSB(低位优先)先行

  • 支持主、从机模式

  • 片选信号的管理模式可选硬件或软件

  • 硬件CRC校验功能

  • 支持中断、DMA

  • 支持Motorola模式和TI模式

  • 支持半双工模式(单线单向、单线双向)

  •  

    NSS片选问题

  • 把SSM置1时,通过软件编程的方式来控制引脚,适于当从机较多时使用
  • 把SSM置0时,通过硬件方式来控制引脚
  • 1.NSS output enabled(SSM=0,SSOE=1)

           适用于一主一从模式,可以让SPI硬件模块自动去操作片选信号(这种模式有一定问题)

    2.NSS output disabled(SSM=0,SSOE=0)

           这种配置能够允许多主机设备运行

           当M1收发数据时,将NSS置低电平,M2接收后,知道有一个主机在收发数据工作中,M2自动退出,等M1NSS上升为高电平时,M2再开始工作。这种情况下NSS成为了主机之间的仲裁信号,解决主机间冲突问题。

     

    CRC校验功能

           如果外界有信号干扰或线路板间信号互相干扰,导致一位数据高电平变低电平等情况,一整个字节的数据不能使用,导致整包数据都无法使用。为保证从机接收到数据的准确性以及能够及时发现错误数据,通常使用CRC校验

           把收到的数据跟多项式进行一个混合运算后得到校验数据。发送一帧数据后紧接发送1到2个字节的校验数据,若计算后的数据与校验数据不同,则说明有数据出错,一整包数据都要舍弃。

           常用的校验位有8位和16位,校验的复杂程度各不相同,但8位和16位的复杂程度已足够判断数据是否出错

           以CRC—16为例,多项式x16+x15+x2+1的含义为:x16表示这是CRC—16,计算结果为2的15次方加2的平方加1是0x8005

     

    中断

  • SPI总线的接收和发送按照字节的方式响应中断。收或发一个或两个字节进入一次中断

  • 发送中断与接收中断使用较多,与串口中断类似

  • 错误中断使用较少

  •  

    Motorola和TI模式对比

    Motorola模式

     

    TI模式

     

    主要区别在于NSS信号线

    Motorola模式:

           NSS空闲时保持高电平,拉低后,说明选通器件,可以与主机通信,数据收发完后,再拉高电平,进入空闲状态。

    TI模式:

            NSS空闲时保持低电平,若要选通器件,先升高电平,用一个clock的时间降回低电平 ,此过程将NSS的一个高脉冲作为起始信号。

     

    HAL库函数分析

    1.查询模式(阻塞方式)

    HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, const 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, const uint8_t *pTxData, uint8_t *pRxData,uint16_t Size, uint32_t Timeout)

            实际上三个函数达到的作用是基本相同的,因为SPI是全双工,发送数据的同时也在接收数据,总线上总是双向数据的传输。区别在于transmit函数忽略了接收数据,而receive函数忽略了发送数据。

    2.中断模式

    HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, const 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, const uint8_t *pTxData, uint8_t *pRxData,uint16_t Sizet)

           开启中断后,发/收一次数据就会进入相对应的回调函数。

    3.DMA模式

    HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pData, uint16_t Size)
    
    HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
    
    HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, const uint8_t *pTxData, uint8_t *pRxData,uint16_t Sizet)

    DMA模式相对在SPI的应用中使用较少。

    适用情况:

    1.高速AD,用SPI采集AD芯片数据时可以用DMA模式把数据不断采集到数据包里去进行处理

    2.作示波器时,用发送DMA模式把要显示的数据发送给示波器,实现数据的通道采集

     

     

    作者:lzhshq

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 SPI总线详解

    发表回复