关注+星标,及时获取更多技术分享~
最近做一个项目,客户用4Mhz的SPI时钟给我们发数据,一开始还想着用软件模拟SPI接收,结果还是我too young too简单。
4Mhz虽然听起来速度不高,但是相当于一个电平持续时间是125ns,用stm32的库函数去读,根本就做不到,光是响应中断就需要十几个指令周期,几十纳秒就出去了,更不用说再读取电平状态去判断了。
所以不得不更改电路板,被迫接受使用硬件SPI的命运。因为以前知道stm32的硬件IIC有问题,所以能自己模拟的都自己模拟了,这就是单片机的劣势,已经做好的硬件功能自己不能更改,你也不知道它内部到底发生了什么,这时候还是感觉FPGA真香。
做好配置后,用FPGA发射了一个波形,stm32使用SPI3中断接收,正常接收没有问题。就此搁置。
过了一段时间,项目启动,客户要每隔200us给我们发一次数据(太可怕了,还好没有使用软件SPI,否则别的啥事也别干了),这时候问题显现出来:丢包。
下面进行问题排查,可能的因素有:
- 是否是频率太高导致硬件SPI接收能力跟不上/li>
- 是否SPI的LE使能信 和时钟信 之间间距太短导致stm32的spi来不及判断/li>
- 信 传输过程中存在干扰/li>
针对第一种可能,尝试降低发送频率,无效果;尝试降低接收频率,无效果;
针对第二种可能,尝试把NSS和CLK起始信 拉长,测试,无效果;
到这时候想到了是不是中断响应过于频繁导致接收失败,于是用DMA接收SPI试了一下,配置没成功,所以放弃了。当然,放弃的原因是我想明白了,就算用DMA接收到数据,我也要立即响应,所以中断还是一直存在。
配置好程序之后,一实验,发现没有丢包!!!这充分证明了stm32的硬件SPI是没问题的,速度完全可以跟得上,尝试提升发送频率也没有问题。
那么就是第三种可能了
- 客户板到我们板之间的连接是暂时用临时线焊接的,是否因线太乱导致时钟信 等扰动太大,读数失败/li>
- 因结构紧张,和客户板连接的接插件到单片机IO口之间经过了多层转接,是否导致了信 扰动太大/li>
- 画PCB的同事不够专业,出现了多个直角走线的情况,是否导致信 收到的干扰太大/li>
接下来用逻辑分析仪抓数据,先抓客户板到我们板连接线的根部,发现波形正常;再抓单片机IO口根部波形,也不知道是手抖还是啥,LE信 有抖动,其余的信 比较正常。具体的症结出在哪,到现在没有头绪,但是确定了肯定是板子的设计有问题。
这时候,客户提醒了,说在时钟的下降沿抓数据,因为下降沿往往是干净的,上升沿由于PCB或线路的原因,可能会出现抖动。
那么在程序里改成了时钟的下降沿捕获数据,果不其然,这次再也没有丢包的现象出现了~
总结:本次的现象说明,电路板的设计本身有问题,导致了上升沿的不稳定,那么既然电路板已经做完了,为了实现功能,只好是把在时钟的上升沿捕获数据改成下降沿捕获数据,这样才可以提升传输的可靠性。
那么回归到我曾经思考过的问题,stm32的硬件SPI到底设计上有没有问题呢案是确定的。用过硬件SPI的都知道,stm32的NSS端如果配置成硬件模式,那么整个通信是无法完成的,整个过程,NSS都会是低电平状态。通过查询相关资料,stm32的NSS应该在外部接一个上拉电阻,才能正常输出时序。这个设计比较恶心人,但是具体的我并没有试验所以能不能实现不敢妄下结论。各位可以试验一下。
如果您觉得这篇文章帮到了你,请点赞或者留下您的评论,您的鼓励是我前进的动力~
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!