SPI接收数据左移一位问题
最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。
实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。
一、问题描述
根据从机芯片手册,主机配置CPOL=1、CPHA=0、CS有效电平=0、MSB。
按要求配置完毕后主机给从机芯片发送初始化报文之后,从机芯片会通过INT请求主动发送初始化状态报文给主机MCU。按照通信格式从机发给主机的初始化状态报文是:‘0x40 0x00 0x00 0x01 0x00’,但实际收到的报文是:‘0x80 0x00 0x00 0x02 0x00’,换算成二进制就能发现数据整体向左移了一位。
二、问题分析
从数据整体移动一位(1bit)分析应该主机MCU接收数据时,数据采样有滞后,导致数据整体左移了一位。于是我在网上找寻到以下前人经验,并一一验证:
1.SPI的CLK引脚在初始化时配置了下拉
这位前辈的说法是:SPI中CLK空闲状态是高电平,但是在初始化时钟IO的时候配置了下拉,导致主机空闲的时候无法处于低电平。所以SPI去读取数据的时候,时钟上多了一个上升沿,导致采集的第一个数据不对,并且都向后移了一位。
按照这位前辈的说法,数据应当是向右移了一位。
<
本文记录了在SPI通信中遇到的数据左移一位的问题,通过排查硬件配置、数据线稳定性以及调整CPOL和CPHA参数,最终解决了问题。作者分析了SPI时序并提出了解决方案,即改变主机的CPOL和CPHA设置,为主机提供额外的时钟周期以正确采样数据。
最低0.47元/天 解锁文章
1239

被折叠的 条评论
为什么被折叠?



