目录
最近在工作在学习调试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位数据的采样工作,因此成功解决了接收到的数据左移一位的问题!
SPI调试的问题还有很多,暂时将自己遇到的问题进行总结,以便在以后工作调试SPI时更高效的解决问题。——2022.8.31
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_