请教各位大佬,关于SPICLK错位的问题怎么搞好?
现在调试SPI从机,碰到数据错位的问题,表现如下,
每个数据的CLK都移位了,上面--CLK 中间--数据 下面--自己做的测试信号(每收到一个数据翻转下)
想知道有什么好办法能解决这种问题,
前置条件,1、只有 CLK和data两根数据线,没有CS线;
2、两个设备不是同时上电;(相当于即插即用)
自己的想法,1、通过BYS标志,判断异常
但在实际中测试,超时结束后BSY位为0,Spi2ErrFlag1 = SPI2->SR;读取到的值为0x02,所以无法判断异常。
本来按照自己的理解,要是数据错位了,在空闲时间的时候SPI应该还是在接收数据的过程中,BSY应该是置1的,结果居然不是。 工作模式切换一下,有四种模式,都试试。 楼主的需求是这样:SPI不带CS,他考虑插拔或异常时,主从的时钟会错位。 2nd 发表于 2022-11-30 23:12
楼主的需求是这样:SPI不带CS,他考虑插拔或异常时,主从的时钟会错位。
(引用自4楼)
是的,感觉设计的很不方便,看网上有人提了个建议,要是有直接清除计数移位的操作就好了
我现在只能考虑识别到异常就复位芯片 错位情况用示波器也看看波形,另外逻辑分析仪检测电压合适不?开发阶段先查为什么有错位情况 用定时器监控一下clk高电平宽度,超过一定的时间后从机就认为是下一个数据开始 有点像IIC, 加16位以上同步帧头,帧尾加crc校验,以此判断数据接收是否合法。 liufabing 发表于 2022-12-1 08:49
错位情况用示波器也看看波形,另外逻辑分析仪检测电压合适不?开发阶段先查为什么有错位情况 ...
(引用自6楼)
不是电平问题,就是由于不是同时上电,拔插之类的造成数据错位 chxzh123 发表于 2022-12-1 09:16
用定时器监控一下clk高电平宽度,超过一定的时间后从机就认为是下一个数据开始 ...
(引用自7楼)
这个就是类似于超时检测,这个也可行,
有两个问题,1、目前没有专门加上CLK的检测脚;
2、怎么复位SPI的,我没看到相关操作;
我现在做的是配置为双通道收发模式,通过BSY位检测异常,然后复位整个芯片;
(一个数据帧的间隔最低有2~3ms,超时检测是没问题的)
作为产品,我还加上超时10ms没有收到完整帧的情况下,复位整个芯片(防止BSY检测不成功);
但是我还做了了个SPI监测数据的工具,就不能加上帧判断了 siguo 发表于 2022-12-1 10:59
加16位以上同步帧头,帧尾加crc校验,以此判断数据接收是否合法。
(引用自9楼)
数据通讯结构没办法改变,这个是改装产品,得配合着别的东西来调,只能在现有条件下做稳定 能不能尝试使用软件模拟来做超时判定? 或者是用定时器模块来在从机那里生成cs信号? SPI不是一直操作的吧,如果中间有停顿,就自己判断一下,自己复位一下。 看clk脉宽有区别,可以以这个脉宽的来判断clk头?
https://www.byteparadigm.com/files/documents/Using-SPI-Protocol-at-100MHz.pdf
希望有帮助 cl1cl1cl1cl1 发表于 2022-12-1 12:01
看clk脉宽有区别,可以以这个脉宽的来判断clk头?
(引用自15楼)
CLK-5us的脉宽,时间太短不太可行 yyts 发表于 2022-12-1 11:53
SPI不是一直操作的吧,如果中间有停顿,就自己判断一下,自己复位一下。
(引用自14楼)
我现在就是想办法做超时判断,复位整个芯片 isakura 发表于 2022-12-1 15:21
我现在就是想办法做超时判断,复位整个芯片
(引用自18楼)
为啥不直接拿另一个io控制cs实现spi的复位? 不知道你那个spi速度是多少,然后spi的传输是不是一直都在传不停,以及你要给它反馈些什么数据回去,处理时间是不是要很多
如果spi时钟在1M以内,又不是一直在传(比如传50个自己,停一会),那么随便弄个51,PIC,AVR什么的8位机就能搞定,时序那里抠汇编指令(抱歉我只会8位机的汇编哈哈)。空闲时间处理j反馈的数据,初次时钟触发时候先看spi那个宽的正脉冲作为同步条件,因为看波形那里明显比其它正常bit宽很多,
提供一个思路而已。当然也可以用其他高级方法:
比如还是用那个宽脉冲,使用高级mcu的脉宽捕获/比较功能?能不能区别出来?符合条件的中断里面立马启动spi 如果实际波形就是顶楼那样的话,看你说宽度都5us了,这么宽,bit脉冲估计就是1us-2us,真的太多方法来判断同步了,因为那个宽脉冲太明显,实际上你要做的就是一个可重触发的单稳态电路,甚至就用额外的硬件电路都可以实现:就是外挂一个单稳态触发器,其输入就是上升沿,稳态时间稍微比那个宽脉冲小一点点,比bit脉冲大一倍左右,这样其稳态输出就是CS片选信号了,
页:
[1]