攻克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满速运行,并且可以定时器控制速度。
{:8:} {:8:} {:8:} 坐等demo
;P 满速50MDAC8562/8563和H7之间的距离是多远 oneV 发表于 2021-12-3 11:09
满速50MDAC8562/8563和H7之间的距离是多远
10-20厘米吧
eric2013 发表于 2021-12-3 12:12
10-20厘米吧
使用两个NUCLEO-H743ZI进行SPI通信 全双工 DMA方式25M时 主机从机都能正确收到数据 50M和100M时从机可以正确收到数据 主机却无法正确收到数据了好奇怪 oneV 发表于 2021-12-4 16:53
使用两个NUCLEO-H743ZI进行SPI通信 全双工 DMA方式25M时 主机从机都能正确收到数据 50M和100M时从机可 ...
跳转下SPI GPIO速度等级有效果没。 eric2013 发表于 2021-12-4 17:46
跳转下SPI GPIO速度等级有效果没。
试过的 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH 教程和关键点说明有吗。。。刚好需要用。 roguebear 发表于 2021-12-4 19:31
教程和关键点说明有吗。。。刚好需要用。
写教程了,第74章:
【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至94章(2021-11-29)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。 hustkema 发表于 2021-12-7 12:47
SPI的片选,有一个问题,从CS拉低到第一个CLK时钟的延迟设置,只在第一次传输数据有效。
有两个分别配置的,一个是第1次,剩下是每次帧间隔。
eric2013 发表于 2021-12-7 13:51
有两个分别配置的,一个是第1次,剩下是每次帧间隔。
都配置了两个2周期。我的意思是指NSS到有效边沿到第一个数据开始的额外延迟,在SPI_ENABLE后,只在第一个数据帧起效,第二个数据帧这个延迟就不起效了。现在有个器件,对这个延迟有要求,只能每次只传一个,SPI关闭后再开启传下一个 外设太多了。。感觉spi和dma都不够用了。。。 roguebear 发表于 2021-12-8 10:34
外设太多了。。感觉spi和dma都不够用了。。。
你的需要多少SPI, 用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波? 用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不是每周期10个点即可达到100kHz,但我设置每周期10个点时,输出的是三角波,该怎么变成正弦波? zkyzhh 发表于 2022-7-4 15:10
用的V7板子加DAC8563做信号发生器实验,想产生不低于80kHz的信号应该怎么做,假设数据更新速率是1MHz,是不 ...
采样点太少了,但是多了后,采样率又低了,适当提高触发频率。 采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢? zkyzhh 发表于 2022-12-13 08:47
采用定时器触发,设置定时周期,如果不能被整除,会导致出来的信号频率不准,这个问题该怎么解决呢?
微调下配置,应该会有一个最接近的。 eric2013 发表于 2022-12-13 10:36
微调下配置,应该会有一个最接近的。
有试过,但当频率比较高,比如20k以上,每个周期点数20以内的时候,偏差就比较大 zkyzhh 发表于 2022-12-13 11:06
有试过,但当频率比较高,比如20k以上,每个周期点数20以内的时候,偏差就比较大
考虑建立一个查表方式,将用到的几个触发频率,都设置成查表方式,分频,周期等参数都是查表实现。
应该会好点。 eric2013 发表于 2022-12-13 11:54
考虑建立一个查表方式,将用到的几个触发频率,都设置成查表方式,分频,周期等参数都是查表实现。
应 ...
好的,谢谢你 硬汉哥,我使用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的频率对应不上。硬汉哥,求助!求助!
附: LXW 发表于 2023-1-16 17:23
硬汉哥,我使用H745单片机的M7核的SPI2+DMA1(Circular模式)给F407单片机传输数据,设置同步触发模式(TIM ...
你的SPI主从机的SPI配置上拉电阻都加上没,建议加上,效果好。
速度快了不正常,你的从机是不是处理不及时,导致丢包,如果是的话,考虑DMA方式。 eric2013 发表于 2023-1-17 10:14
你的SPI主从机的SPI配置上拉电阻都加上没,建议加上,效果好。
速度快了不正常,你的从机是不是处理不 ...
主机和从机都是采用的DMA方式,我用万用表测试主机的NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK—1.28MHz以及MOSI—约110kHz,我怀疑是主机发送的问题,如果设置TIM12触发频率为200Hz的话通讯就正常,没有丢帧现象。 LXW 发表于 2023-1-17 14:39
主机和从机都是采用的DMA方式,我用万用表测试主机的NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK— ...
Cache问题注意了没 eric2013 发表于 2023-1-18 08:40
Cache问题注意了没
硬汉哥,您SPI2+DMA+驱动片外DAC8563上面需要注意的问题我都注意了。程序里面我开启了Cache,不过在每次进入DMA传输完成中断后,我都会执行缓存清除操作,这个是没问题的。现在问题就是最快只能到200帧,再高就会漏帧,就和上面帖子里面描述的一样。 LXW 发表于 2023-1-19 15:03
硬汉哥,您SPI2+DMA+驱动片外DAC8563上面需要注意的问题我都注意了。程序里面我开启了Cache,不过在每次 ...
这个还是后面示波器转包测试下吧。另外就是你的从机什么都不做,仅仅记录接收次数试试。
200Hz确实速度太慢了。 eric2013 发表于 2023-1-20 01:00
这个还是后面示波器转包测试下吧。另外就是你的从机什么都不做,仅仅记录接收次数试试。
200Hz确实速 ...
用示波器看了,发送端没问题,接收端的问题!现在使用片外DAC(TLV563)做从机时输出正常。 请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么? koob 发表于 2024-1-29 14:25
请问一下,在例程中开启SPI的DMA循环方式发送之前,特地关闭了DMA和SPI的中断,这么操作的用意是什么?
做了动态配置支持。
页:
[1]