问题描述:SPI单接收模式,多产生两个时钟周期:
使用基于M0核的MCU,使用SPI和DMA与从机通讯
发送
:SPI单发送模式,向下位机发送命令字节,下位机接收到命令后将返回数据
接收
:开启SPI的单接收模式,并用DMA接收数据
用示波器看波形,发现多了两个时钟周期
配置spi字长为8bit,就会多出两个8bit时钟;配置spi字长为16bit,就会多出两个16bit时钟
- 查看收到的数据,数据无误
- 不使能DMA,配置完单接收模式后使能SPI。在使能SPI后设置断点,发现断点处时钟线立刻产生了两个时钟周期,确认和DMA无关,可能是SPI单接收模式的问题
- 如SPI不使用单接收模式而使用全双工接收数据,相同情况下时钟线不会产生两个时钟周期。确认是单接收模式的问题
推测多两个时钟周期的原因:
SPI是全双工模式,主机即使只接收数据也要向TX缓冲区写数据,时钟产生并开启传输
当SPI配置为单接收模式时,SPI会自动向TX缓冲区填写数据,时钟产生并开启传输
-
在单接收模式下,SPI自动向TX缓冲区写入数据,从机的SPI返回的数据写入RX缓冲区
如果RX缓冲区读的不及时,SPI的RX缓冲区和移位寄存器都满,SPI无法继续传输
-
当读取完一组数据后,SPI还在单接收模式中,继续往TX缓冲区填写数据,下位机接收到指令后继续返回数据
但是程序没有继续读取RX缓冲区的数据,导致RX缓冲区和移位寄存器满,停止传输
RX缓冲区和移位寄存器各占一个时钟周期,产生两个时钟周期而停止传输
接收到的数据是无误的,题主是因为其它问题接上示波器才发现的此问题
将SPI的单接收模式模式改成全双工模式后,问题解决
版权声明:本文为weixin_42129666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。