stm32——SPI总线

主要功能

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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值