运行环境
单片机:STM32F0 系列单片机
问题描述
- 主从设备使用spi 通信。当时协议设计的时候,只有sck,mosi,miso 三个通信口。
- 现在用硬件spi实现slave 功能。
- 硬件spi的cpol,cpha,lsb(msb)等参数都配置正常。在sck 没“干扰信号“时,通信都正常。但是当sck出现“干扰信号”后,slave spi 收到的数据都不符合预期。
- 这里所说的 sck“干扰信号”不是外部干扰,而是协议设计中,用来表示某种状态的信号。所以没办法通过硬件滤波的方法去掉。
问题分析
硬件spi 移位寄存器会在连续8个sck 上升沿信号(假设我这里配置上升沿接收数据)之后,结束一个字节的接收。如果前面“干扰信号”有两个上升沿信号,则对后面的正常数据传输,还需要6个sck 上升沿,就结束了一个byte的传输。
查看stm32f0 数据手册和标准库函数,没找到识别这种异常的方法。我觉得比较理想的判断方法是硬件层面提供对每次sck 上升沿的间隔的最大溢出时间,如果超过这个时间了,就认为sck 信号异常。
问题解决
利用SPI_I2S_FLAG_BSY这个状态位判断这种情况。从slave 端收到第一个sck 上升沿信号,到接收完第8个,SPI_I2S_FLAG_BSY 位一直有效。