硬汉嵌入式论坛

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

[ADC] STM32H7使用SPI接口驱动AD7606,如果DMA采用正常模式没问题,循环模式略有难度(教程和案例已经发布)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
发表于 2020-4-14 11:39:34 | 显示全部楼层 |阅读模式
2020-08-04 补充
教程已经发布,第77章。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980



以我们的SPI隔离型AD7606为例进行说明:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=91249




SPI方式接线使用到的引脚:
GPIO_PWM  : 专门用于启动ADC转换。
GPIO_INT    : 用于接收7606转换完成的就绪状态。
SPI_SCK      : SPI时钟
SPI_MISO   :读取输入
SPI_CS        : 片选

这里实现SPI DMA方式的关键就是GPIO_INT去触发DMA控制,如果是单纯的DMA正常模式,实现比较简单,接收到INT引脚的就绪状态,使用SPI DMA将8路数据全部读取出来即可。

如果是循环转换模式,就需要PWM一直开启着,来一路INT信号,触发DMA读取一次8路数据。

针对这个问题,就可以使用DMAMUX的事件触发方式来实现,可以选择的主要是:
HAL_DMAMUX1_REQ_GEN_EXTI0
HAL_DMAMUX2_REQ_GEN_EXTI0
HAL_DMAMUX2_REQ_GEN_EXTI2

这种的就略有点麻烦,如果用户使用的INT引脚不是EXTI0或者EXTI2,使用起来就不太方便。








回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-4-14 13:36:14 | 显示全部楼层
更新完毕。
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-4-14 15:08:27 | 显示全部楼层
终于开始搞了,那我就不研究了,坐享其成
代码不规范,亲人两行泪!
回复

使用道具 举报

14

主题

99

回帖

141

积分

初级会员

积分
141
发表于 2020-4-14 17:02:58 | 显示全部楼层
硬汉加油~~
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2020-8-5 17:15:27 | 显示全部楼层
请教一下楼主,因为最近也早搞类似的东西,请问有这个的代码吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-8-5 17:21:45 | 显示全部楼层
vcdlk 发表于 2020-8-5 17:15
请教一下楼主,因为最近也早搞类似的东西,请问有这个的代码吗?

教程和例子已经发布,第77章。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-8-5 20:27:48 | 显示全部楼层
请教一下硬汉老大,我看到您在测试SPI DMA的时候都是使用了SRAM1 SRAM2 SRAM3等小块RAM,而且都没有开启cache。不使用TCM很好理解,因为DMA1 DMA2无法访问。为什么不使用AXI SRAM呢?我测试在AXI SRAM区域的时候会出现 SPI RX DMA接收到的数据都为00,cache为WT。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-8-6 09:22:25 | 显示全部楼层
王海靖 发表于 2020-8-5 20:27
请教一下硬汉老大,我看到您在测试SPI DMA的时候都是使用了SRAM1 SRAM2 SRAM3等小块RAM,而且都没有开启cac ...

这个没有技术上的原因,小块的DMA空间,我现在基本都会使用小块的SRAM配套。

关闭这部分RAM空间的Cache主要是方便大家移植排查问题。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-8-6 09:55:15 | 显示全部楼层
eric2013 发表于 2020-8-6 09:22
这个没有技术上的原因,小块的DMA空间,我现在基本都会使用小块的SRAM配套。

关闭这部分RAM空间的Cach ...

多谢硬汉老大的回复.我这边测试SPI RX DMA总线有回复数据,也在读之前刷了cache,但是数据就是0,AXI RAM设置的是WT
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-8-6 10:10:22 | 显示全部楼层
王海靖 发表于 2020-8-6 09:55
多谢硬汉老大的回复.我这边测试SPI RX DMA总线有回复数据,也在读之前刷了cache,但是数据就是0,AXI RAM ...

你的意思是你当前的这个测试用小块的RAM可以,AXI SRAM不行?
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-8-7 09:18:12 | 显示全部楼层
eric2013 发表于 2020-8-6 10:10
你的意思是你当前的这个测试用小块的RAM可以,AXI SRAM不行?

参考您的可以是实现,我自己弄的不行。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-8-8 13:03:38 | 显示全部楼层
王海靖 发表于 2020-8-7 09:18
参考您的可以是实现,我自己弄的不行。

好的,
回复

使用道具 举报

44

主题

564

回帖

701

积分

金牌会员

积分
701
发表于 2020-11-17 17:17:01 | 显示全部楼层
硬汉大佬,V7版本的AD7606使用SPI驱动好像没有例程是吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2020-11-17 19:02:08 | 显示全部楼层
ou513 发表于 2020-11-17 17:17
硬汉大佬,V7版本的AD7606使用SPI驱动好像没有例程是吗

V7的SPI接口方式接7606后面有时间了做,最近其它工作排满了。
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2021-2-20 21:38:17 | 显示全部楼层
老大 没有看到SPI接口的7606的例子,好像是FMC的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-2-20 21:56:14 | 显示全部楼层
miaoqiongb 发表于 2021-2-20 21:38
老大 没有看到SPI接口的7606的例子,好像是FMC的

V5和V6的标准库网盘有SPI方式的,HAL方式的SPI还没有顾上整,后面有时间了吧
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2021-2-20 22:06:56 | 显示全部楼层
最近用了AD7689  没有busy信号 想通过SPI+DMA方式搞一下 不过目前还没有成功
回复

使用道具 举报

57

主题

88

回帖

259

积分

高级会员

积分
259
发表于 2021-3-12 16:10:10 | 显示全部楼层
请教硬汉,V7上通过SPI以外部触发DMA模式来读取AD7606模块有做出没?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-3-12 16:13:41 | 显示全部楼层
twodiamond 发表于 2021-3-12 16:10
请教硬汉,V7上通过SPI以外部触发DMA模式来读取AD7606模块有做出没?

暂不做了。
回复

使用道具 举报

57

主题

88

回帖

259

积分

高级会员

积分
259
发表于 2021-3-12 16:20:08 | 显示全部楼层
请教硬汉,V7使用SPI以外部触发DMA来读取AD7606模块有完成没?理解你的意思是:
1、用PWM生产方波信号去周期启动AD7606做转换;
2、利用AD7606转换完成信号做为DMAMUX的同步信号GPIO_INT(比如PB0)来启动DMA,从SPI读取;

有2点疑惑:
1、这个PB0(GPIO_EXTI0)是做为外部触发源呢还是同步触发源?
2、DMA采样循环模式读取AD7606,每次8个通道的采样值都会覆盖旧值吧,有没可能让它按8次*8通道的循环缓冲存放呢?

谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-3-13 09:06:34 | 显示全部楼层
twodiamond 发表于 2021-3-12 16:20
请教硬汉,V7使用SPI以外部触发DMA来读取AD7606模块有完成没?理解你的意思是:
1、用PWM生产方波信号去周 ...

等我后面有精力制作了,并且方案是可行的,再跟你分享,现在的讨论还不具有可行性,所以意义不大
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2021-4-24 12:14:05 | 显示全部楼层
本帖最后由 eggplant886 于 2021-4-24 14:58 编辑

掌柜您好,想请教下h750vbt6,qfp100封装能不能用fmc读取ad7606,这个ic的fmc,地址数据强制服用,最大24bit.   把地址建立时间调小是不是可以当场不复用的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-4-25 09:00:09 | 显示全部楼层
eggplant886 发表于 2021-4-24 12:14
掌柜您好,想请教下h750vbt6,qfp100封装能不能用fmc读取ad7606,这个ic的fmc,地址数据强制服用,最大24bi ...

不需要专用的FMC_Ax地址线,使用NE片选就够了。
回复

使用道具 举报

2

主题

75

回帖

81

积分

初级会员

积分
81
发表于 2021-4-25 16:43:31 | 显示全部楼层
eric2013 发表于 2021-4-25 09:00
不需要专用的FMC_Ax地址线,使用NE片选就够了。

100引脚的H750没有单独的FMC_Ax,地址和数据引脚复用成FMC_AD[0:15]。
我把7606的CS和RD并联在一起,使用FMC_NOE作为片选,这样是不是更为合适,因为mcu在FMC_AD[0:15]输出地址时,片选并不起作用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-4-26 12:01:46 | 显示全部楼层
eggplant886 发表于 2021-4-25 16:43
100引脚的H750没有单独的FMC_Ax,地址和数据引脚复用成FMC_AD[0:15]。
我把7606的CS和RD并联在一起,使 ...

有,从A16开始到A23,不过用不到FMC_Ax地址线
QQ截图20210426120127.png
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2021-4-29 16:06:08 | 显示全部楼层
eric2013 发表于 2021-3-13 09:06
等我后面有精力制作了,并且方案是可行的,再跟你分享,现在的讨论还不具有可行性,所以意义不大

SPI方案还没有出吧 硬汉?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-4-30 09:23:29 | 显示全部楼层
miaoqiongb 发表于 2021-4-29 16:06
SPI方案还没有出吧 硬汉?

V5和V6的标准库有SPI AD7606例子,论坛置顶帖相应网盘可以下载。
回复

使用道具 举报

57

主题

88

回帖

259

积分

高级会员

积分
259
发表于 2021-6-19 22:13:59 | 显示全部楼层
硬汉,请教:
参考你的方案,用H743的SPI1接口AD7606模块,以AD7606_BUSY做为DMA1(Stream0/Stream1)的启动事件event,每个event激活8次DMA操作(对应8个通道),从示波器来看,cs/clk/miso信号都是对的,但是有2点问题:
1、开始时event只启动接收DMA(spi dma rx),cs/clk没有波形输出;后来在使能了发送DMA(spi dma tx)后,cs/clk才有波形,而且单独使能发送DMA,也会有波形,不知什么道理?
2、虽然示波器上看起来各个波形、信号都正确,但是,DMA RX接收数据缓冲区没有丝毫变化,好像没接收一样,不知这可能同什么有关系?

谢谢!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2021-6-20 10:58:59 | 显示全部楼层
twodiamond 发表于 2021-6-19 22:13
硬汉,请教:
参考你的方案,用H743的SPI1接口AD7606模块,以AD7606_BUSY做为DMA1(Stream0/Stream1)的启 ...

这个我后面给大家做个Demo分享。
回复

使用道具 举报

57

主题

88

回帖

259

积分

高级会员

积分
259
发表于 2021-6-20 12:29:11 | 显示全部楼层
eric2013 发表于 2021-6-20 10:58
这个我后面给大家做个Demo分享。

期待!!!
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-9-14 22:32:49 | 显示全部楼层
王海靖 发表于 2020-8-7 09:18
参考您的可以是实现,我自己弄的不行。

你好,我这边也遇到了你帖子中提到的问题。
使用的是函数内的局部变量当做 DMA 的缓存区,局部变量是在 0x24000000 开始的那块 RAM 里,也就是 AXI SRAM。
同样的出现了 DMA 传输成功,SPI 外设的 RXDR 寄存器数据也对,就是 缓存区的数据都是 0,并且传输之前不是 0,传输之后才变成的 0。说明传输还是起了作用的,只是数据不对。

我想问下你这个问题后面解决了吗?怎么解决的。
回复

使用道具 举报

7

主题

15

回帖

36

积分

新手上路

积分
36
发表于 2023-4-7 16:26:49 | 显示全部楼层
eric2013 发表于 2021-6-20 10:58
这个我后面给大家做个Demo分享。

硬汉老大,有分享Demo吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107027
QQ
 楼主| 发表于 2023-4-7 16:44:07 | 显示全部楼层
Yang.L.C 发表于 2023-4-7 16:26
硬汉老大,有分享Demo吗

后续没有再研究了。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-6-14 16:17:30 | 显示全部楼层
eric2013 发表于 2023-4-7 16:44
后续没有再研究了。

您好,请教个问题,看7606的时序似乎应该是在spi sclk的下降沿采样数据,为啥我们V5的demo程序中却是在上升沿采样数据?谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 14:15 , Processed in 0.455051 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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