学习6__STM32--SPI外设之中断收发

Posted 壹点灵异

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习6__STM32--SPI外设之中断收发相关的知识,希望对你有一定的参考价值。

> 目标

STM32双机 SPI中断收发通信

 

> 描述

  #1  STM32双机配置为一主一从模式

  #2  采用主机中断发送,从机中断接收

  #3  收发机制采用不间断收发(发送为空就发送,接收非空就接收,中间无其他操作打断)

  #4  就是单字节发送与接收

 

> 问题

  从机接收端会出现,接收到的数据可能是原始发送数据也会是错误数据,出现这种现象的条件是发送主机复位、发送主机重新上电、随时间变化(物理碰触等)都会产生错误数据,而复位接收从机、重新上电接收从机会纠正数据

 

> 分析

  #1  STM32双机未共地导致      共地后问题依旧

  #2  STM32未使用NSS引脚导致    使用后问题依旧

  #3  工作模式改变尝试(发送与接收工作模式配置为不匹配)    问题依旧

  #4  主机发送太过频繁导致,导致接收来不及接收导致          拉大发送数据周期问题依旧

  #5  从数据结果上分析,应该是发送主机与接收从机未同步导致,接收总线的数据先由移位寄存器接收,再copy至数据寄存器,所以分析数据移位现象是出现在移位寄存器中,比如正在传输中由复位操作或断电操作等,致使移位寄存器只接收了3bit数据,而SPI数据的接收机制是,移位寄存器收满8bit数据后copy至数据寄存器,这一切都是硬件完成,注意数据的搬移是copy,所以移位寄存器中的数据还在,就像刚刚的这种行为导致移位寄存器只接收了3bit数据,未满8bit数据故不会copy至数据寄存器,所以等待恢复工作后,再接收5bit数据,这样满8bit数据后copy至spi->DR,但是这1byte数据中的前3bit与后5bit数据本不是一个有效byte数据,就导致读到1byte无效数据,产生了接收错误数据的现象

 

> 解决

  #1  拉大发送数据周期&在进入接收中断后先关闭SPI外设,然后再读取数据,出中断前开始SPI外设

  #n  。。。

>总结

  #1  这种方法只是暂时解决了该条件下接收错误数据的问题,并未完美解决和分析透这一现象

  #2  不拉大发送数据周期,只是在进入接收中断后先关闭SPI外设,然后再读取数据,出中断前开始SPI外设,接收数据错误问题依旧

  

 

以上是关于学习6__STM32--SPI外设之中断收发的主要内容,如果未能解决你的问题,请参考以下文章

STM32 SPI 发送第一个数据不成功问题

stm32f10x串口实验之中断模式

STM32调试串口

干货 | STM32串口DMA收发机制

请教STM32的 SPI 同时中断收发问题

STM32STM32F103C8T6+nrf24l01收发示例