SPI接收数据左移一位问题

目录

  • 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去读取数据的时候,时钟上多了一个上升沿,导致采集的第一个数据不对,并且都向后移了一位。

按照这位前辈的说法,数据应当是向右移了一位。

我发现我的CLK引脚确实带了下拉,于是我将它改成上拉或者既不上拉也不下拉分别进行测试,发现仍然存在数据左移的问题。

2.外接了SPI数据线,导致数据不稳定

参考文章

这位前辈说:SPI是板载传输方式,如果外界SPI的数据线就可能导致数据不稳定,可能发生错误位移的情况。这位前辈曾经将CLK线外拉出来,放到桌子上划都会时STM32接收到时钟信号,从而接收到数据,因此很容易多接收到一个数据造成位移。要修复这个位移就要重置接收counter,清空DR寄存器。

虽然我遇到的问题和数据线外界没有关系,但是我之前也用过一个SPI转USB的模块调试SPI,那时就要将SPI的数据线外接,在数据收发的过程中的确非常容易受到干扰。我看到工作中前辈都是使用示波器去调试SPI的,因此熟练使用示波器是很有必要的。

3.更改主机从机的CPOL和CPHA

参考文章

这位前辈说主机从机的CPOL和CPHA配置相反,SPI能够正常收发数据。

我尝试将主机配置成CPOL=0、CPHA=1,然后再进行测试,结果惊奇的发现数据正常了!!!

三、探究原理

解决完问题之后再倒推探究其中的原理,弄清楚为什么这样配置之后就能够成功解决问题!

回到问题的本质,主机接收到的数据整体向左移了一位,那就有两种可能性:

  • 从机发送数据过快,主机还来不及采样第一位

  • 主机采样数据时过慢,开始采样时从机已经发送完第一位,开始采样就是从第二位

这两种可能性就是一个问题:主机采样和从机数据发送的时序不匹配。

按照原先主从模式中都配置成CPOL=1、CPHA=0来画个简单的时序图理解数据采样,

高电平时时钟空闲,第二个边沿数据采样,主从模式都按照下图进行采样:

从图中可以看出主从模式都是在时钟的下降沿进行采样的,由于主从模式CPOL(时钟极性)不同时也能正常收发数据,可以看出从模式只通过时钟的跳变沿进行数据采样。在从模式CPOL=1、CPHA=0的情况下,从模式的采样边沿是下降沿。

出现主模式接收到从模式的数据左移一位情况的采样时序图如下:

因此在主模式配置:CPOL=0、CPHA=1,从模式配置:CPOL=1、CPHA=0时的采样时序图:

这时由上图就可以看出,在这种情况下主模式比刚刚多了一个时钟周期来准备进行第1位数据的采样工作,因此成功解决了接收到的数据左移一位的问题!

四、经验总结

  1. 在以后SPI调试过程中如果出现数据右移一位的问题时,可以参考’SPI的CLK引脚在初始化时配置了下拉’的方法,改变CLK的IO上下拉试试。
  2. 如果出现数据中增加了一些错误的数据时,可以检查是否有SPI数据线外接的情况,可以参考’外接了SPI数据线,导致数据不稳定’的方法试试。
  3. 出现数据左移一位时,就可以参考将CPOL和CPHA更改一下,给SPI主从模式一个时钟周期的数据采样准备时间。

SPI调试的问题还有很多,暂时将自己遇到的问题进行总结,以便在以后工作调试SPI时更高效的解决问题。——2022.8.31

SPI接收数据异常问题总结相关推荐

  1. STM32F407 CAN模块发送接收数据异常

    现象: 1.CAN模块初始化成CAN_MODE_LOOPBACK模式 CAN模块通过HAL_CAN_AddTxMessage发送数据时,TX管脚能够发出数据,示波器也可以测量到数据波形,CAN使用中断 ...

  2. C# serialport串口接收数据异常,出现很多3F的解决方法

    出现3F是奇偶校验错误导致的,你可以将奇偶校验属性设置为none,至于出现短文,是由于数据接收不完整导致,你可以在读取缓存数据的时候延时个20ms就可以了 转载于:https://my.oschina ...

  3. STM32:DMA方式接收SPI总线数据,并按照协议进行处理

    一.前言 为满足高速数据传输的要求,采用SPI总线.MCU端(STM32F072  Cortex-M0)接收CPU发送的SPI数据(数据18个字节为一包,起始包为0xAA,最后一包为CheckSum校 ...

  4. nRF24L01+不能接收或接收偶尔异常等问题实战分享

    nRF24L01+不能接收或接收偶尔异常等问题实战分享 nRF24L01+接收异常问题综述 如何快速判断nRF24L01+通信失败问题是出在接收端 正常接收数据时硬件电路必需的基本保障 现象1:一次也 ...

  5. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制...

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  6. 性能优化:如何更快地接收数据

    从网卡到应用程序,数据包会经过一系列组件,其中驱动做了什么?内核做了什么?为了优化,我们又能做些什么?整个过程中涉及到诸多细微可调的软硬件参数,并且相互影响,不存在一劳永逸的"银弹" ...

  7. linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

    嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议.现在嵌入式系统中已经定义了数百种通信协议来实现数据交换,一般来说可以将其分为两类:并行或串行. 并行传输数据是指同时传输多个数据位,它们通常 ...

  8. 利用spi发送接收信息c语言,SPI接收发送函数程序

    unsigned char SPI_RW(unsigned char byte) { ?? ?unsigned char bit_ctr; ?? ?for(bit_ctr=0;bit_ctr<8 ...

  9. QT串口QSerialPort解决接收数据不完整问题

    QT串口QSerialPort解决接收数据不完整问题 QSerialPort类例程:Examples\Qt-5.9.1\serialport\terminal,该例子完美展示了qt串口收发过程,直接在 ...

最新文章

  1. 20171220-python学习笔记--函数类型
  2. java面试第十五天
  3. Python的日志模块logging的使用
  4. 游击式(移动)开发的两种方式
  5. 使用python下载文件_详解使用Python下载文件的几种方法
  6. 热电偶校验仪_热电偶校验方法_电厂系列之热控仪表装置校验讲解
  7. vue Iframe
  8. who are you really?
  9. 绝非玩笑!人工智能或开创黑客新时代
  10. WM有约(五):部署应用程序
  11. Android apk系列1-------APK签名
  12. 【原创】MySQL Replay线上流量压测工具
  13. 基于FPGA的DHT11数字温湿度传感器测试
  14. 单片机 TDA8023 读 ic 卡 smrat card sync_card
  15. [飘渺女声]罗琳娜 麦肯尼(Loreena McKennitt)
  16. 写在前面 - 跟小智一起学网络(1)
  17. IE无法打开网页的问题
  18. 2019领克车展 Max Co币机诞生记
  19. CSS3基础(4)——CSS3 渲染属性
  20. ERROR 1010 (HY000): Error dropping database (can‘t rmdir ‘.\qpweb‘, errno: 41) 删库失败问题的解决

热门文章

  1. 网络丢包工具clumsy
  2. 本地项目连接远程gitLab
  3. 【Python并行计算】- Dask 让你的python更快更强
  4. TIA-810测试,TIA-920测试,手机、耳机、音箱、会议电话、APP语音通讯测试
  5. 观点分享:关于物流集成设备的招标文件起草规范
  6. 网购秒杀系统架构设计 1
  7. lumia 830起死回生
  8. 什么是RAID及创建RAID的方法
  9. 将Ubuntu安装在U盘上,实现即插即用
  10. win10系统的两台电脑之间局域网共享文件