硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1276|回复: 7
收起左侧

[USB] USB + 硬件SPI 通信外部 AD7616

[复制链接]

2

主题

18

回帖

24

积分

新手上路

积分
24
发表于 2024-12-3 10:02:25 | 显示全部楼层 |阅读模式
本帖最后由 gqs123 于 2024-12-3 10:04 编辑

我在尝试使用 TIM 定时触发(因为想实现采样率可控) 硬件SPI(比软件翻转快一些)对外部AD7616采集数据  采样频率大概在300K左右,但是这样配合上USB_HS_CDC 的时候,USB就无法正常发送了,用串口工具都打不开,好像CDC类处理程序没有响应。
    是因为定时器的中断频率太高了嘛,3us中断一次,USB_HS 的一个微帧是125us,为了减少中断次数,我直接在TIM的PWM中断里面调用的 SPI非中断发送。
    STM32H7 能不能做到 保证300K采样率的情况下,还能实时用USB发数据出去啊,求大佬解惑
    我看别人用FPGA做的,H7好像是单核不能并行处理
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 2024-12-3 16:00:33 | 显示全部楼层
你这个需要SPI+DMA,循环,双BUFFER , 然后把长度拉长,采集数据量大一些,然后一帧完成把数据以快于300k 的速率发出来,然后循环往复,没有什么是拿空间解决不了的问题,将1ms 的数据 采集 不过需要  1024个数据量而已,给你1ms 发送足够了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2024-12-4 09:22:20 | 显示全部楼层
完全没问题,我们TOOL还双通道2M速度,USB实时上传。

按照楼上坛友的方式调整下方案。
回复

使用道具 举报

0

主题

40

回帖

40

积分

新手上路

积分
40
发表于 2024-12-5 10:12:28 | 显示全部楼层
这点速度,H7,配合HS,完全无压力,
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2024-12-5 10:32:15 | 显示全部楼层
eric2013 发表于 2024-12-4 09:22
完全没问题,我们TOOL还双通道2M速度,USB实时上传。

按照楼上坛友的方式调整下方案。

大佬我有几个疑问:
    1、SPI +DMA 能配合定时器触发嘛,因为我需要可以调节采样率,SPI使用DMA的时候硬件片选好像也没法控制了,如果用循环模式,那它基本上就一直在采集,好像没法做到,比如说我要100us才采集一次。
      我现在的方案是用的 定时器的pwm中断,每10us一个周期,然后再0.1占空比的时候触发,就算我读取的速度快了一点也会等到定时器溢出到下一个周期才会再采集数据

    2、开启DMA后 开销似乎是比我不用中断进行SPI接收要大的,因为HAL库要进行中断处理,本来我只需要进行一次中断,现在要进行2~3次了(DMA传输完成、半完成、SPI rxen)。
         我试了一下,如果再TIM 中断里面调用 SPI 非中断接收函数 处理速度是3us完成整个流程(从触发,到处理定时器中断、到SPI接收完成),SPI+DMA 可能要12us,因为我是用的单次触发想可控,没用循环(启动SPI DMA传输,硬件工作时间,处理SPI中断、处理DMA中断)
   
回复

使用道具 举报

2

主题

18

回帖

24

积分

新手上路

积分
24
 楼主| 发表于 2024-12-5 10:40:26 | 显示全部楼层
我补充一下,这芯片麻烦的地方有两点:
  1、每次读取数据之前需要手动转换,发送一个CONVST信号,然后等待BUSY信号吗,时序图如下,SPI+DMA的循环模式,我试了一下,一直再发,好像没法中断:
  2、他不能自动切换通道,我要给他寄存器写命令他才能切换到下一个通道。

时序图

时序图
回复

使用道具 举报

4

主题

26

回帖

38

积分

新手上路

积分
38
发表于 2024-12-5 15:50:16 | 显示全部楼层
gqs123 发表于 2024-12-5 10:40
我补充一下,这芯片麻烦的地方有两点:
  1、每次读取数据之前需要手动转换,发送一个CONVST信号,然后等 ...

AD7616不支持转换期间读取数据,这个速度达不到7606的速度应该
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 2024-12-6 16:40:35 | 显示全部楼层
siasevan 发表于 2024-12-5 15:50
AD7616不支持转换期间读取数据,这个速度达不到7606的速度应该

1. 可以研究一下硬件SPI有一个硬件CS 时间可调功能,将器接到CONVST 引脚充当转化时间,可调周期为0-15还是挺客观的,通过调节SPI 频率来改变采样时间尽可能接近你需要的速率
2. 可以研究一下 定时器触发 dmamax  将 spi 读取数据放入内存中,硬件spi ,长度可以调很长,也可循环采集,同时SPI 读写应该可以同时进行,读数据的同时,发送命令切换通道, 还有很骚的玩法,  定时器触发DMAMUX 某一通道例如 DMA1 CHANNEL 1 切换ADC 通道,然后 DMA1 CHANNEL 1 在作为同步时间去触发 SPI 读, 反正方法很多
3. 我觉得STM32H7 的 spi 功能还是设计的不够强大,还是有一些小缺陷,小遗憾,但是总体上和其他外设dma dmamux 定时器 可以实现很多功能,基本我开发中 用到的80%的 特别时序SPI 都可以满足
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 03:38 , Processed in 0.042624 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表