【原创+转载】NXP linux SPI多字节时钟连续没有间隔问题

(此处为原创)

前一阵遇到了 imx8 + rh850使用spi通信时(RH850为从机,字长度设置为16bit,5Mhz速率),RH850在使用硬件触发DMA来搬运SPI的收发数据时,数据总是错位。

后来也是如下述博主一样,利用逻辑分析仪截取SPI数据,发现是imx8d发出的每帧数据中,字与字之间几乎没有更大的时间间隔,总之从肉眼看分不出个数来。因为RH850的DMA速率可能跟不上,所以导致错位了。

(之所以判断是RH850的DMA速率跟不上,是因为使用RH850的spi的buffer来收发数据,就不产生错误。可见和spi模块本身是没啥问题的。)

而RH850的DMA是无法设置时钟的(后来我看STM32也没有DMA的时钟配置,所以不太清楚DMA的时钟到底依赖什么),所以在非要用DMA做数据搬运的情况下,只能让imx8侧,在发送SPI数据时,每个字之间添加一定的延时。但可惜的是imx8侧一直没有修改成功。

现在看到如下这篇文章,有种相见恨晚的感觉。所以转载了。感谢作者!(当然现在我没有验证如下方法是否在我那时做的项目中有效)

*********(原创、转载分割线)**********************************************************************

NXP linux SPI多字节时钟连续没有间隔问题
项目场景:
硬件平台:NXP Cortex-A9 双核
linux内核版本:4.19.35

问题描述:
使用SPI通讯时,当传输数据小于32字节时发现SPI时序单个字节与单个字节之间时钟是连在一起的,没有间隔。大于32字节时,时序是分开的,由于SPI另一端接的是单片机,速度慢,需要把时序分开。
问题时序

 

正常时序


原因分析:
查看NXP SPI底层驱动发现当传输字节小于32字节时,系统会使用IO方式传输,反之这会使用DMA传输。

 

解决方案:
根据原因修改驱动的判断条件,由于我们不想使用IO方式,并且传输数据都会大于10个字节,所以我这里把判断条件改到了10。

需要修改的文件为:drivers/spi/spi-imx.c

需要修改的部分截图:

 

————————————————
版权声明:本文为CSDN博主「YANGXUSHI520」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangshixu520/article/details/108794764

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值