硬汉嵌入式论坛

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

[SPI/QSPI] STM32H7的SPI DMA配置时,SPI硬件FIFO,DMA突发设置等几个重要注意事项

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2021-1-7 09:11:39 | 显示全部楼层 |阅读模式


1、特别注意STM32H7的硬件FIFO不是随便配置,他的最大值如下限制(V7的BSP驱动手册DAC8563的SPI DMA驱动章节有详说):

1.png

比如我们使用SPI4,SPI5,那么最大值就是8字节,这点要特别注意,然后配置如下两个参数时:
hspi5.Init.DataSize = SPI_DATASIZE_16BIT;
hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_04DATA;

16bit配4个FIFO,正好是8字节,大家配置时,切不要超过了。


2、然后就是DMA的突发配置。

配置突发需要把DMA FIFO打开,然后单独的源地址和目的地址是可以分别配置突发的,无需两个都使能突发
hdma_tx.Init.MemBurst            = DMA_MBURST_INC4;
hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;

hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;


回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-5 21:50:06 | 显示全部楼层
硬汉您好,我想问下我做一个项目需要随时准备发出SPI信息,但还有更新需求,SPIFIFO会导致我数据更新的时候FIFO里面的数据没法更新,但我不想频繁配置DMA和SPI,有没有把SPIFIFO功能关掉的配置呀?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-6 08:08:02 | 显示全部楼层
lichangming 发表于 2024-8-5 21:50
硬汉您好,我想问下我做一个项目需要随时准备发出SPI信息,但还有更新需求,SPIFIFO会导致我数据更新的时候 ...

设置SPI的FIFO大小为01DATA即可
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-6 09:21:31 | 显示全部楼层
eric2013 发表于 2024-8-6 08:08
设置SPI的FIFO大小为01DATA即可

设置后,并通过仿真查看寄存器设置成功,实测发现不论设置的是多少,都会存进去16个字节,查看手册貌似该处设置是指示RXFIFO标志位用的,TXFIFO不受影响。
SPI.PNG
STM说明.png
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-6 10:21:03 | 显示全部楼层
eric2013 发表于 2024-8-6 08:08
设置SPI的FIFO大小为01DATA即可

硬汉我又试了更改DMA传输的FIFO大小为半满,单次突发,结果每次还是一启动就先存16个字节,表现为NDT的值减少16,也是不管用
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-6 11:17:32 | 显示全部楼层
eric2013 发表于 2024-8-6 08:08
设置SPI的FIFO大小为01DATA即可

如图所示,设置的FIFO大小为2个数据,之前是一个数据,数据大小17E,DMA配置和SPI的TXDMAEN使能后,NDT还为17E,一旦使能SPI就16E了,作为从机,是有16个字节的数被缓冲到了莫名其妙的地方,不论SPI的TXFIFO设置是多少,Cache也关过试了解决不了
SPI配置.PNG
17E.PNG
16E.PNG
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-6 11:20:30 | 显示全部楼层
eric2013 发表于 2024-8-6 08:08
设置SPI的FIFO大小为01DATA即可

目前DMA使用的是单次传输,没有使用DMAFIFO,我试了把DMAFIFO放开,就发现数据更新会从16个字节扩大到32个字节刷新滞后,很明显更不对了,说明目前这个原因不是DMA的,就是SPI的,也不知道是不是SPIFIFO配置不对,但是寄存器显示都对了,实在想不明白
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-8-7 09:05:10 | 显示全部楼层
lichangming 发表于 2024-8-6 11:20
目前DMA使用的是单次传输,没有使用DMAFIFO,我试了把DMAFIFO放开,就发现数据更新会从16个字节扩大到32 ...

是SPI FIFO大小配置为01DATA

spi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA

这种情况也不正常吗
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-8-8 09:48:51 | 显示全部楼层
eric2013 发表于 2024-8-7 09:05
是SPI FIFO大小配置为01DATA

spi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA

是的,这种i情况配置过了,不起作用。多试了几组,我目前认为手册里说的改的一直是FIFO标志位相关起效果的阈值,至于FIFO大小并改不了,硬汉可以实测一下,使能一段DMA往SPI外设发送里填,会发现不论这个值设置为多少,都是提前拿走16字节的数
回复

使用道具 举报

4

主题

25

回帖

37

积分

新手上路

积分
37
发表于 2024-9-15 12:04:41 | 显示全部楼层
后续呢 , 我也是遇到一样的情况 但是我直接开头16字节直接都定义为报头了  不管它 实际数据16字节以后
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2024-9-19 16:58:15 | 显示全部楼层
面包人 发表于 2024-9-15 12:04
后续呢 , 我也是遇到一样的情况 但是我直接开头16字节直接都定义为报头了  不管它 实际数据16字节以后

狠人啊哈哈,直接给16个字节干没了。后续就是和上面的一样,FIFO大小确实不能改,但是我每次发送前判断一下CS再去开DMA使能,这样就不会提前把数据给我填进去了,算是手动弥补
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-10-26 23:35:22 | 显示全部楼层
lichangming 发表于 2024-8-6 10:21
硬汉我又试了更改DMA传输的FIFO大小为半满,单次突发,结果每次还是一启动就先存16个字节,表现为NDT的值 ...

H7的SPI确实是这样,不知道是HAL库问题还是外设就是这样,一上来就直接塞进去了16个
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2025-2-19 01:00:22 | 显示全部楼层
sanit 发表于 2024-10-26 23:35
H7的SPI确实是这样,不知道是HAL库问题还是外设就是这样,一上来就直接塞进去了16个

验证了 是SPI外设强制带了16字节的FIFO,无法关闭。那个阈值设置不是设置FIFO大小的意思
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 02:01 , Processed in 0.316529 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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