发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[以太网/USB/其他总线]

总线响应时间调测的快要吐了

[复制链接]
1659|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-5-13 11:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-5-13 13:11 编辑

#申请原创#
@21小跑堂

产品用于工业自动化领域,所以对总线响应时间的实时性要求比较高,为了调优这个总线响应时间,在基于MCU和ADC芯片的SPI数据读取以及MCU和从站芯片的SPI通信交互这块,可真的是煞费苦心,听我慢慢道来!
1、使用不同方案并测试MCU和ADC芯片的SPI通信时间
(1)使用硬件SPI + STM32 HAL库标准发送和接收函数
10M速率,采集4个通道,使用IO口电平翻转的方法进行测试;
耗时200us左右

标准库的发送和接收函数耗时:
发送:HAL_SPI_Transmit  // 3.5us
接收:HAL_SPI_Receive   // 7.35us
(2)使用软件模拟SPI  
采集4个通道,耗时140us左右

采集一次,ADC驱动函数需发送2个字节+接收6个字节:

优化ADC采集函数:
采集4个通道,大部分最短耗时106us


2、MCU和从站芯片的SPI通信时间测试
(1)使用标准SPI + HAL库标准发送和接收函数
10M速率,使用IO口电平翻转的方法进行测试;
运行一次协议栈的中断服务程序,耗时1.28ms左右;

所以此时如果在上位机上设置扫描周期1ms,即PDI中断周期是1ms,模块是无法进行连接到主站的。
(2)使用标准SPI+自编的发送和接收函数
运行一次协议栈的PDI中断服务程序PDI_Isr,耗时442us左右;
用PLC主机实测,扫描周期配置为500us时,模块无法正常运行;屏蔽PDI函数里的部分与通信相关的代码,中断执行一次400us左右,然后扫描周期配置为500us时,模块可以正常运行。修改机制后测试:
之前的PDI函数是放在PDI外部中断里执行的,现在设计为在中断里只设置标志位,而将该函数放到main里运行;用主机实测,扫描周期配置为500us时,模块可以正常运行。然后简单进行了这种情况的滤波滞后时间测试,结果如下表所示;
  扫描周期  
滤波滞后时间
  500us  
52ms
  600us  
29ms
  700us  
20ms
  800us  
16ms
  900us  
15ms
  1000us  
13ms
从测试可以看出,扫描周期配置为500us时,滞后时间太长,无法达到要求;即修改的机制虽然可以保证中断执行正常,但因PDI_Isr接口执行时间不变,滤波滞后时间较长。扫描周期>=1000us基本可以符合需求。
(3)使用软件模拟SPI
运行一次协议栈的PDI中断服务程序,耗时582us左右;
上位机上设置扫描周期>=1ms,模块可以连接到主站。以下是三种方案的运行PDI函数的时间对比:
  方案  
运行时间
  硬件SPI + HAL库函数  
1.28ms
  硬件SPI + 自编函数  
442us
  软件SPI  
582us

3、协议栈优化前后的时间测试
对运行在main主程序里的协议栈接口MainLoop的运行频次进行了优化,其优化方案为:如果设置了滤波使能,则每运行50次ADC采集及数据处理接口后再运行1次协议栈【按时间计算的话,大概是每隔5ms多运行1次】;对比测试了优化前后的滞后时间,分别是33ms14ms,如下图所示:

4、滤波设置后的滞后时间测试
对程序设计进行了以下优化:
1、 减少main主程序里的协议栈运行频次;即提高ADC采集和数据处理接口的运行频次;
2、 MCU和ADC的通信机制改为模拟SPI;即缩短标准SPI字节处理之间的寄存器标志位等待时间;
3、 优化ADC采集数据的驱动函数接口;即提高ADC数据采集接口的执行速度;
4、 MCU和ESC的通信机制改为标准SPI+自编函数;即提高SPI传输数据的速度;

实测滤波设置后的滞后时间:一般在13ms-14ms左右,如下图,扫描周期配置1000us,进行了不同电压的测试:

反正这个产品的总线响应时间调测,我当时真的是快要调测到吐了......
不知道朋友们有木有在时间优化方便改程序改到不想改的地步?



804286822af657253e.png (540.97 KB )

804286822af657253e.png

90336822b09934d05.png (1.01 MB )

90336822b09934d05.png

9966822b77873ab8.png (623.52 KB )

9966822b77873ab8.png

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2025-05-20
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
dffzh 2025-5-21 08:50 回复TA
@21小跑堂 :是的,二姨的经验值得学习 
21小跑堂 2025-5-20 17:47 回复TA
对比测试硬件SPI + HAL库函数  、 硬件SPI + 自编函数 、软件SPI 三种方式的运行时间,找到更合适的采样方式。根据二姨的经验,使用DMA+寄存器操作,完全摒弃库函数,可以将速度更好的提升,特别是HAL库,为了降低用户使用难度,库函数变的臃肿,执行效率低下。高速场景还需掌握寄存器的操作。 
沙发
zjsx8192| | 2025-5-14 08:18 | 只看该作者
软件模拟SPI还采集快点?不应该啊

使用特权

评论回复
板凳
William1994| | 2025-5-14 08:43 | 只看该作者
太慢了吧.
莫非你下一步要上DMA?

使用特权

评论回复
地板
dukedz| | 2025-5-14 09:23 | 只看该作者
本帖最后由 dukedz 于 2025-5-14 09:27 编辑

仅使用 hal 初始化、直接寄存器操作 spi dma 传输,最快
示例代码:https://github.com/dukelec/cdstep/

用 hal 操作 spi dma,接收和发送分别来两次中断,一次是dma完成一半的中断,一次是dma完成中断,总共 4 次中断
自己寄存器操作 spi dma,写+读 仅一次 dma 接收中断即可

使用特权

评论回复
5
dffzh|  楼主 | 2025-5-14 09:29 | 只看该作者
本帖最后由 dffzh 于 2025-5-14 09:31 编辑
zjsx8192 发表于 2025-5-14 08:18
软件模拟SPI还采集快点?不应该啊

步骤1中是因为HAL库的SPI发送和接收API接口有很多异常处理,时间上会稍微慢点

使用特权

评论回复
6
dffzh|  楼主 | 2025-5-14 09:30 | 只看该作者
William1994 发表于 2025-5-14 08:43
太慢了吧.
莫非你下一步要上DMA?

是的,本来准备用DMA了,后面芯片部门修改了MCU和ESC芯片之间的SPI通信驱动代码,优化了时间

使用特权

评论回复
评论
xch 2025-5-15 09:03 回复TA
@dffzh :使用DMA方式的代码占用空间比中断方式少很多。 
dffzh 2025-5-15 08:51 回复TA
@xch :现在产品成本把控大,MCU芯片的烧录引脚都已复用I2C功能,内存空间所剩不多。 
xch 2025-5-14 09:42 回复TA
估计是没用过DMA。所以要“准备”半年。 
7
dffzh|  楼主 | 2025-5-14 09:31 | 只看该作者
dukedz 发表于 2025-5-14 09:23
仅使用 hal 初始化、直接寄存器操作 spi dma 传输,最快
示例代码:https://github.com/dukelec/cdstep/

好的,非常感谢!

使用特权

评论回复
8
时光贩卖机| | 2025-5-14 12:31 | 只看该作者
真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享!

使用特权

评论回复
9
dffzh|  楼主 | 2025-5-15 08:53 | 只看该作者
时光贩卖机 发表于 2025-5-14 12:31
真是不容易,工业自动化领域的实时性要求确实很高。你的调测经验对于我们这些后来者来说非常宝贵,感谢分享 ...

是的,所以工业总线一般都是称现场总线,对PLC和从站模块的总线响应速度要求比较高

使用特权

评论回复
10
cooldog123pp| | 2025-5-15 13:13 | 只看该作者
感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。

使用特权

评论回复
11
dffzh|  楼主 | 2025-5-21 08:49 | 只看该作者
cooldog123pp 发表于 2025-5-15 13:13
感觉你这是在做芯片相关的测试啊,是晶圆测试码还是已经封装了,确实测的很仔细了。 ...

主要是优化通信响应时间

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

614

帖子

6

粉丝