你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32U575 SPI&GPDMA

[复制链接]
卖萌的小幽灵 提问时间:2025-6-9 16:55 / 未解决

我打算使用stm32u575rg通过spi读取外置adc的数据,通过lptim2的ch2提供外置ad的触发信号,ch1提供触发信号给spi1,SPI->TSIZE=1, SPI-CFG1-DSIZE=31,RXDMAEN=1,SPI工作在只接收模式,TRIGSEL=7。GPDMA的C0CR->LAP=1, SDW_LOG2=2, SBL_1=3,DDW_LOG2=2 DBL_1=3,DINC=1, BNDT=64.

测试时候发现SPI只能读取2组数据,共8个字节,EOT=1. 需要开启EOT中断然后再中断函数中重新关闭再开启SPI才能继续读数据。如何设置才能让spi不需要中断重启持续读取数据

收藏 评论10 发布时间:2025-6-9 16:55

举报

10个回答
xmshao 回答时间:3 天前
你现在DMA配置在Normal模式还是Circular模式?


如果是配置在Circular模式,正常情况下会循环接收。


如果Normal模式,如果接收到预先配置的数据个数后,DMA会停下来,需要重新启动。


我看你配置的BNDT为64,即使Normal模式的话,应该是接收到64字节数据后才会停下来,具体的


数据个数跟你的数据宽度配置有关。


我看你的配置,源端、目的端数据宽度设置为4字节,即1个字,BURST传输长度为4,即每次DMA被触发后传输4个数据?


即每次就传输4个字,即16个字节? 你是这个设计思路吗?
卖萌的小幽灵 回答时间:3 天前

xmshao 发表于 2025-6-9 17:59
你现在DMA配置在Normal模式还是Circular模式? </p>
<p>

感谢回复

DMA目前配置的是normal,后面打算改成circular。每个触发信号spi通讯是4个字节(2个16bit数据) 现在碰到的问题是每次触发spi收到数据需要重启一下spi,如果不重启spi的话只能接受2次数据(共2*4=8bytes)。清除eot标志位没用,只能重启SPI

我的想做的是lptim2每次触发spi接受216bit的数据,然后循环填充1024004Bytes的内存

xmshao 回答时间:前天 09:17
你能把你的实现方案介绍多点吗?


现在LPTIM的相关事件触发外部ADC的转换,STM32这边


的SPI是做MASTER吗?它将ADC结果接收进来是通过


什么同步的,即STM32的SPI模块如何知道有数据要接收了,


还是说它是做从SPI,外部ADC模块提供时钟并发送数据?
卖萌的小幽灵 回答时间:前天 10:17

xmshao 发表于 2025-6-10 09:17
你能把你的实现方案介绍多点吗?</p>
<p>

我是使用LPTIM2->CH2作为触发信号给外部ADC的,CH1提供给SPI做触发信号,两个触发信号调好了时间差可以正常触发采集,触发信号512kHz

主频设置128M

SPI使用SPI1&SPI2, 设置是MASTER RECEIVE ONLY,datasize32bit(16*2)MSB First,baudrate64M,trig:lptim2ch1 下降沿;CRC不启用;NSS:软件,FIFO Threshold默认1,SS Idleness, data Idleness都是0,IOSWAP关闭,RDY MASTER:内部,RDY POLARITY:HIGH

GPDMA使用CH0 CH1, CH0->REQUEST=SPI1_RX, CH1->REQUEST=SPI2_RX, 两个通道其他配置一样。源数据设置DATASIZE: WORD, BURST LENGTH=1 Allocated Port for Transfer=Port0. 目标数据设置dataWidth=word, burstLength=1 Allocated Port for Transfer=port1; dataHandling=disable, trig=disable; BNDT=32768

我尝试了一下burst length设置为1,不开启SPI中断的情况下还是只能采集2组数据一共8个字节

xmshao 回答时间:昨天 10:14

卖萌的小幽灵 发表于 2025-6-10 10:17</p>
<p>我是使用LPTIM2-&gt;CH2作为触发信号给外部ADC的,CH1提供给SPI做触发信号,两个触发信号调好了时间差可 ...

[md]嗯

了解你的应用思路,这样应该是可以的。LPTIM控制整个采样及数据提取的节奏。

LPTIM2-CH2事件作为SPI RX DMA的同步事件,每次触发过来后,SPI主动接收一块数据即完成。

下次触发时再来获取下一批数据。 你再检查下配置,是否哪里有点小问题。

卖萌的小幽灵 回答时间:昨天 17:37

xmshao 发表于 2025-6-11 10:14
嗯</p>
<p>了解你的应用思路,这样应该是可以的。LPTIM控制整个采样及数据提取的节奏。

[md]我不太清楚那里出的问题,现在就是卡在spi只能接收2组数据就不工作了。结果每次spi收完1组数据都需要重新启动一下,已经卡了几个礼拜了。

正常情况下这些寄存器的值应该是多少可以实现这个功能呀

xmshao 回答时间:12 小时前

卖萌的小幽灵 发表于 2025-6-11 17:37
我不太清楚那里出的问题,现在就是卡在spi只能接收2组数据就不工作了。结果每次spi收完1组数据都需要 ...

[md]你这个问题我这边不太好模拟,你可以先简化下,就利用LPTIM触发 uart的DMA发送,看看这个基本流程有没有问题。

butterflyspring 回答时间:8 小时前
卖萌的小幽灵 发表于 2025-6-11 17:37
[md]我不太清楚那里出的问题,现在就是卡在spi只能接收2组数据就不工作了。结果每次spi收完1组数据都需要 ...

看到楼主使用TSIZE 去控制一次接收数据数量。

但是手册里表明,确实需要关闭和从新启动SPI 才能恢复状态机。
所以看来中断里的代码是必要的。

STM32U575 TSIZE 1.PNG STM32U575 TSIZE 2.PNG
卖萌的小幽灵 回答时间:3 小时前

butterflyspring 发表于 2025-6-12 15:02
看到楼主使用TSIZE 去控制一次接收数据数量。</p>
<p>但是手册里表明,确实需要关闭和从新启动SPI 才能恢复状态 ...

我注意到这一个了,如果tsize这个不控制的话在1次触发会一次性接收很多组数据。按照手册来说应该在完成1次接收之后就需要重启SPI。实际测试中发现是接收了2组数据之后才停止的。

卖萌的小幽灵 回答时间:3 小时前

xmshao 发表于 2025-6-12 11:27
你这个问题我这边不太好模拟,你可以先简化下,就利用LPTIM触发 uart的DMA发送,看看这个基本流程有 ...

[md]这个我也有用到,用LPTIM1触发LPDMA通过LPUART定时发送数据,这个功能是正常的

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版