主要功能
-
支持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模式把要显示的数据发送给示波器,实现数据的通道采集