硬汉嵌入式论坛

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

[SPI/QSPI] 攻克STM32H7使用SPI DMA方式驱动DAC8562/8563,H7的SPI+DMA灵活度媲美FPGA控制这些外设

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2020-3-18 08:39:35 | 显示全部楼层 |阅读模式
2021-12-06

教程已经发布,第74章:

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至94章(2021-11-29)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980




外设说明:
(1)H7的SPI外设比F4系列的灵活性强太多了,主要表现在两个方面:数据的传输支持了4-32bit,特别是那个NSS片选引脚,超强劲,可以做各种时间插入,灵活应对了市场上这类芯片的需求。
(2)DMA这块相比F4系列,有了质的飞跃,支持了DMAMUX,这个DMAMUX除了带来灵活的触发源选择,还支持了各种触发事件和同步触发功能。

STM32H7的SPI DMA驱动DAC8562/8563的关键就在这个高电平宽度和需要24bit的DMA传输实现方法上,因为DMA仅支持8bit,16bit和32bit,不支持24bit方式,实现上有个关键点,昨天搞了一天才解决。

当前驱动可以让DAC8562/8563运行在它支持的最高时钟下,即SPI DMA 50MHz满速运行,并且可以定时器控制速度。

1.png

评分

参与人数 2金币 +30 收起 理由
missfox + 20 赞一个!
龙之谷 + 10 很给力!

查看全部评分

回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-3-18 08:45:33 | 显示全部楼层
回复

使用道具 举报

27

主题

95

回帖

181

积分

初级会员

积分
181
发表于 2020-3-18 09:42:30 | 显示全部楼层
回复

使用道具 举报

1

主题

33

回帖

36

积分

新手上路

积分
36
发表于 2020-3-18 11:07:55 | 显示全部楼层
      
回复

使用道具 举报

23

主题

1404

回帖

1473

积分

至尊会员

积分
1473
发表于 2020-3-18 17:43:58 | 显示全部楼层
坐等demo

代码不规范,亲人两行泪!
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2021-12-3 11:09:45 | 显示全部楼层
满速50M  DAC8562/8563和H7之间的距离是多远
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-12-3 12:12:29 | 显示全部楼层
oneV 发表于 2021-12-3 11:09
满速50M  DAC8562/8563和H7之间的距离是多远

10-20厘米吧
QQ截图20211203121139.png
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2021-12-4 16:53:15 | 显示全部楼层

使用两个NUCLEO-H743ZI进行SPI通信 全双工 DMA方式  25M时 主机从机都能正确收到数据 50M和100M时从机可以正确收到数据 主机却无法正确收到数据了  好奇怪
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-12-4 17:46:10 | 显示全部楼层
oneV 发表于 2021-12-4 16:53
使用两个NUCLEO-H743ZI进行SPI通信 全双工 DMA方式  25M时 主机从机都能正确收到数据 50M和100M时从机可 ...

跳转下SPI GPIO速度等级有效果没。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2021-12-4 18:09:04 | 显示全部楼层
eric2013 发表于 2021-12-4 17:46
跳转下SPI GPIO速度等级有效果没。

试过的 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2021-12-4 19:31:30 | 显示全部楼层
教程和关键点说明有吗。。。刚好需要用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-12-6 14:08:22 | 显示全部楼层
roguebear 发表于 2021-12-4 19:31
教程和关键点说明有吗。。。刚好需要用。

写教程了,第74章:

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至94章(2021-11-29)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980


回复

使用道具 举报

0

主题

18

回帖

18

积分

新手上路

积分
18
发表于 2021-12-7 12:47:35 | 显示全部楼层
SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-12-7 13:51:20 | 显示全部楼层
hustkema 发表于 2021-12-7 12:47
SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。


有两个分别配置的,一个是第1次,剩下是每次帧间隔。

QQ截图20211207135007.png
回复

使用道具 举报

0

主题

18

回帖

18

积分

新手上路

积分
18
发表于 2021-12-8 09:39:04 | 显示全部楼层
eric2013 发表于 2021-12-7 13:51
有两个分别配置的,一个是第1次,剩下是每次帧间隔。

都配置了两个2周期。我的意思是指NSS到有效边沿到第一个数据开始的额外延迟,在SPI_ENABLE后,只在第一个数据帧起效,第二个数据帧这个延迟就不起效了。现在有个器件,对这个延迟有要求,只能每次只传一个,SPI关闭后再开启传下一个
回复

使用道具 举报

56

主题

904

回帖

1072

积分

至尊会员

积分
1072
发表于 2021-12-8 10:34:30 | 显示全部楼层
外设太多了。。感觉spi和dma都不够用了。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-12-11 01:01:07 | 显示全部楼层
roguebear 发表于 2021-12-8 10:34
外设太多了。。感觉spi和dma都不够用了。。。

你的需要多少SPI,
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-7-4 15:10:26 | 显示全部楼层
用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-7-4 15:10:45 | 显示全部楼层
用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2022-7-5 10:36:44 | 显示全部楼层
zkyzhh 发表于 2022-7-4 15:10
用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不 ...

采样点太少了,但是多了后,采样率又低了,适当提高触发频率。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-12-13 08:47:24 | 显示全部楼层
采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2022-12-13 10:36:43 | 显示全部楼层
zkyzhh 发表于 2022-12-13 08:47
采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢?

微调下配置,应该会有一个最接近的。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-12-13 11:06:05 | 显示全部楼层
eric2013 发表于 2022-12-13 10:36
微调下配置,应该会有一个最接近的。

有试过,但当频率比较高,比如20k以上,每个周期点数20以内的时候,偏差就比较大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2022-12-13 11:54:42 | 显示全部楼层
zkyzhh 发表于 2022-12-13 11:06
有试过,但当频率比较高,比如20k以上,每个周期点数20以内的时候,偏差就比较大

考虑建立一个查表方式,将用到的几个触发频率,都设置成查表方式,分频,周期等参数都是查表实现。

应该会好点。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-12-13 13:50:09 | 显示全部楼层
eric2013 发表于 2022-12-13 11:54
考虑建立一个查表方式,将用到的几个触发频率,都设置成查表方式,分频,周期等参数都是查表实现。

应 ...

好的,谢谢你
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-16 17:23:08 | 显示全部楼层
硬汉哥,我使用H745单片机的M7核的SPI2+DMA1(Circular模式)给F407单片机传输数据,设置同步触发模式(TIM12_TRGO--设置的触发频率位20k),实际上在F407接收端接收到的数据存在漏帧现象(TIM12设置20k的话大概会漏100帧数据)。实验现象如下图所示,每次TIM12触发,DMA会发送4个16bit的数据分别是(进入DMA传输完成中断的次数、0、1和2)。硬汉哥,您看这是咋回事呢?我如果减小TIM12的触发频率至200Hz,F4接收端就能正常。我目前没有示波器,看不了MOSI、CLK和NSS端的波形,但是我用万用表测试的个端口的频率(NSS--20kHz、CLK--1.28MHz、MOSI--120kHz左右)发现MOSI的频率对应不上。硬汉哥,求助!求助!
附:
IMG_20230116_170733.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-1-17 10:14:22 | 显示全部楼层
LXW 发表于 2023-1-16 17:23
硬汉哥,我使用H745单片机的M7核的SPI2+DMA1(Circular模式)给F407单片机传输数据,设置同步触发模式(TIM ...

你的SPI主从机的SPI配置上拉电阻都加上没,建议加上,效果好。

速度快了不正常,你的从机是不是处理不及时,导致丢包,如果是的话,考虑DMA方式。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-17 14:39:40 | 显示全部楼层
eric2013 发表于 2023-1-17 10:14
你的SPI主从机的SPI配置上拉电阻都加上没,建议加上,效果好。

速度快了不正常,你的从机是不是处理不 ...

主机和从机都是采用的DMA方式,我用万用表测试主机的NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK—1.28MHz以及MOSI—约110kHz,我怀疑是主机发送的问题,如果设置TIM12触发频率为200Hz的话通讯就正常,没有丢帧现象。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-1-18 08:40:20 | 显示全部楼层
LXW 发表于 2023-1-17 14:39
主机和从机都是采用的DMA方式,我用万用表测试主机的NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK— ...

Cache问题注意了没
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-1-19 15:03:36 | 显示全部楼层
eric2013 发表于 2023-1-18 08:40
Cache问题注意了没

硬汉哥,您SPI2+DMA+驱动片外DAC8563上面需要注意的问题我都注意了。程序里面我开启了Cache,不过在每次进入DMA传输完成中断后,我都会执行缓存清除操作,这个是没问题的。现在问题就是最快只能到200帧,再高就会漏帧,就和上面帖子里面描述的一样。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2023-1-20 01:00:24 | 显示全部楼层
LXW 发表于 2023-1-19 15:03
硬汉哥,您SPI2+DMA+驱动片外DAC8563上面需要注意的问题我都注意了。程序里面我开启了Cache,不过在每次 ...

这个还是后面示波器转包测试下吧。另外就是你的从机什么都不做,仅仅记录接收次数试试。

200Hz确实速度太慢了。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-2-3 20:10:41 | 显示全部楼层
eric2013 发表于 2023-1-20 01:00
这个还是后面示波器转包测试下吧。另外就是你的从机什么都不做,仅仅记录接收次数试试。

200Hz确实速 ...

用示波器看了,发送端没问题,接收端的问题!现在使用片外DAC(TLV563)做从机时输出正常。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-1-29 14:25:18 | 显示全部楼层
请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2024-1-29 15:30:37 | 显示全部楼层
koob 发表于 2024-1-29 14:25
请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么?

做了动态配置支持。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 16:16 , Processed in 0.289851 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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