eric2013 发表于 2020-3-18 08:39:35

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

2021-12-06

教程已经发布,第74章:

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


static/image/hrline/4.gif

外设说明:
(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满速运行,并且可以定时器控制速度。



morning_enr6U 发表于 2020-3-18 08:45:33

{:8:}

chinacool 发表于 2020-3-18 09:42:30

{:8:}

andre_king 发表于 2020-3-18 11:07:55

{:8:}      

missfox 发表于 2020-3-18 17:43:58

坐等demo

;P

oneV 发表于 2021-12-3 11:09:45

满速50MDAC8562/8563和H7之间的距离是多远

eric2013 发表于 2021-12-3 12:12:29

oneV 发表于 2021-12-3 11:09
满速50MDAC8562/8563和H7之间的距离是多远
10-20厘米吧

oneV 发表于 2021-12-4 16:53:15

eric2013 发表于 2021-12-3 12:12
10-20厘米吧

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

eric2013 发表于 2021-12-4 17:46:10

oneV 发表于 2021-12-4 16:53
使用两个NUCLEO-H743ZI进行SPI通信 全双工 DMA方式25M时 主机从机都能正确收到数据 50M和100M时从机可 ...

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

oneV 发表于 2021-12-4 18:09:04

eric2013 发表于 2021-12-4 17:46
跳转下SPI GPIO速度等级有效果没。

试过的 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH

roguebear 发表于 2021-12-4 19:31:30

教程和关键点说明有吗。。。刚好需要用。

eric2013 发表于 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


hustkema 发表于 2021-12-7 12:47:35

SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。

eric2013 发表于 2021-12-7 13:51:20

hustkema 发表于 2021-12-7 12:47
SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。

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


hustkema 发表于 2021-12-8 09:39:04

eric2013 发表于 2021-12-7 13:51
有两个分别配置的,一个是第1次,剩下是每次帧间隔。

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

roguebear 发表于 2021-12-8 10:34:30

外设太多了。。感觉spi和dma都不够用了。。。

eric2013 发表于 2021-12-11 01:01:07

roguebear 发表于 2021-12-8 10:34
外设太多了。。感觉spi和dma都不够用了。。。

你的需要多少SPI,

zkyzhh 发表于 2022-7-4 15:10:26

用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波?

zkyzhh 发表于 2022-7-4 15:10:45

用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波?

eric2013 发表于 2022-7-5 10:36:44

zkyzhh 发表于 2022-7-4 15:10
用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不 ...

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

zkyzhh 发表于 2022-12-13 08:47:24

采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢?

eric2013 发表于 2022-12-13 10:36:43

zkyzhh 发表于 2022-12-13 08:47
采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢?

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

zkyzhh 发表于 2022-12-13 11:06:05

eric2013 发表于 2022-12-13 10:36
微调下配置,应该会有一个最接近的。

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

eric2013 发表于 2022-12-13 11:54:42

zkyzhh 发表于 2022-12-13 11:06
有试过,但当频率比较高,比如20k以上,每个周期点数20以内的时候,偏差就比较大

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

应该会好点。

zkyzhh 发表于 2022-12-13 13:50:09

eric2013 发表于 2022-12-13 11:54
考虑建立一个查表方式,将用到的几个触发频率,都设置成查表方式,分频,周期等参数都是查表实现。

应 ...

好的,谢谢你

LXW 发表于 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的频率对应不上。硬汉哥,求助!求助!
附:

eric2013 发表于 2023-1-17 10:14:22

LXW 发表于 2023-1-16 17:23
硬汉哥,我使用H745单片机的M7核的SPI2+DMA1(Circular模式)给F407单片机传输数据,设置同步触发模式(TIM ...

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

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

LXW 发表于 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的话通讯就正常,没有丢帧现象。

eric2013 发表于 2023-1-18 08:40:20

LXW 发表于 2023-1-17 14:39
主机和从机都是采用的DMA方式,我用万用表测试主机的NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK— ...

Cache问题注意了没

LXW 发表于 2023-1-19 15:03:36

eric2013 发表于 2023-1-18 08:40
Cache问题注意了没

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

eric2013 发表于 2023-1-20 01:00:24

LXW 发表于 2023-1-19 15:03
硬汉哥,您SPI2+DMA+驱动片外DAC8563上面需要注意的问题我都注意了。程序里面我开启了Cache,不过在每次 ...

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

200Hz确实速度太慢了。

LXW 发表于 2023-2-3 20:10:41

eric2013 发表于 2023-1-20 01:00
这个还是后面示波器转包测试下吧。另外就是你的从机什么都不做,仅仅记录接收次数试试。

200Hz确实速 ...

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

koob 发表于 2024-1-29 14:25:18

请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么?

eric2013 发表于 2024-1-29 15:30:37

koob 发表于 2024-1-29 14:25
请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么?

做了动态配置支持。
页: [1]
查看完整版本: 攻克STM32H7使用SPI DMA方式驱动DAC8562/8563,H7的SPI+DMA灵活度媲美FPGA控制这些外设