硬汉嵌入式论坛

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

[SPI/QSPI] 有没有用过H7的 SPI dma传输?我移植官方例程也没成功!

  [复制链接]

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-16 23:15:39 | 显示全部楼层 |阅读模式
      有没有用过H7的 SPI dma传输?我移植官方例程也没成功!不知道哪里出错了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2018-9-17 01:10:40 | 显示全部楼层
SPI DMA有例子,在官方板子上溜溜应该没问题的。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-9-17 11:01:31 | 显示全部楼层
本帖最后由 KAIXIN 于 2018-9-17 11:40 编辑
eric2013 发表于 2018-9-17 01:10
SPI DMA有例子,在官方板子上溜溜应该没问题的。

直接下载官方例程到板子,都出错,你也可以试试。
#define SPIx_MOSI_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE();
它这个应该是错的      应该是  GPIOA
因为对照它代码下面是
define SPIx_MOSI_PIN                            GPIO_PIN_7
#define SPIx_MOSI_GPIO_PORT              GPIOA
#define SPIx_MOSI_AF                           GPIO_AF5_SPI1

加#define MASTER_BOARD
作为主机,按键按下,会进入出错代码,LED3亮



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2018-9-17 11:46:43 | 显示全部楼层
KAIXIN 发表于 2018-9-17 11:01
直接下载官方例程到板子,都出错,你也可以试试。
#define SPIx_MOSI_GPIO_CLK_ENABLE()      __HAL_RCC ...

好的,等我后面测试到了就跟楼主交流下。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-9-17 12:22:29 | 显示全部楼层
本帖最后由 KAIXIN 于 2018-9-17 12:27 编辑
eric2013 发表于 2018-9-17 11:46
好的,等我后面测试到了就跟楼主交流下。

多谢了,搞了两天了!   这个是我的程序,读写Q25Q128   ,之前不用DMA可以读写,就像用一下DMA,搞了好久

我的文件.zip

7.54 KB, 下载次数: 72

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2018-9-18 02:13:30 | 显示全部楼层
KAIXIN 发表于 2018-9-17 12:22
多谢了,搞了两天了!   这个是我的程序,读写Q25Q128   ,之前不用DMA可以读写,就像用一下DM ...

好的,后面搞到这块了,我们交流
回复

使用道具 举报

1

主题

19

回帖

22

积分

新手上路

积分
22
发表于 2018-9-18 20:07:31 | 显示全部楼层
STM32H7的DMA有点复杂,现在先暂时用的IO模拟,等有空了再试试。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-10-5 18:12:31 | 显示全部楼层
HFLY 发表于 2018-9-18 20:07
STM32H7的DMA有点复杂,现在先暂时用的IO模拟,等有空了再试试。

不要用DMA没问题,就是改成DMA就出错!   不要沉贴了。。。。。。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-10-11 18:30:05 | 显示全部楼层
KAIXIN 发表于 2018-10-5 18:12
不要用DMA没问题,就是改成DMA就出错!   不要沉贴了。。。。。。

是什么样的错误?
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-10-11 19:19:45 | 显示全部楼层
oneV 发表于 2018-10-11 18:30
是什么样的错误?

读取的数值都是0,内容有我的压缩文件
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-10-13 17:12:34 | 显示全部楼层
KAIXIN 发表于 2018-10-11 19:19
读取的数值都是0,内容有我的压缩文件

你调用了Cache_Enable();  是否有开D cache? 如果开了 是否有注意数据一致性问题?
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-10-13 21:27:53 | 显示全部楼层
oneV 发表于 2018-10-13 17:12
你调用了Cache_Enable();  是否有开D cache? 如果开了 是否有注意数据一致性问题?

我用 ADC的 DMA都没问题,就是弄不了  SPI的DMA
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106760
QQ
发表于 2018-10-14 00:13:44 | 显示全部楼层
KAIXIN 发表于 2018-10-13 21:27
我用 ADC的 DMA都没问题,就是弄不了  SPI的DMA

把Cache关闭了,测试下看看,另外RAM空间使用AXI SRAM试试。
回复

使用道具 举报

5

主题

26

回帖

41

积分

新手上路

积分
41
发表于 2019-11-20 21:23:48 | 显示全部楼层
有同样的问题,不额外开贴了,请楼主不要介意。
我使用的是H743VIT6,目前想使用SPI1的DMA功能传输,DMA配置代码贴出来了
  1. /* SPI1 DMA Init */
  2.     /* SPI1_RX Init */
  3.     hdma_spi1_rx.Instance = DMA2_Stream0;
  4.     hdma_spi1_rx.Init.Request = DMA_REQUEST_SPI1_RX;
  5.     hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  6.     hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  7.     hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
  8.     hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  9.     hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  10.     hdma_spi1_rx.Init.Mode = DMA_NORMAL;
  11.     hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
  12.     hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  13.     if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
  14.     {
  15.       __NOP();
  16.     }

  17.     __HAL_LINKDMA(hspi,hdmarx,hdma_spi1_rx);

  18.     /* SPI1_TX Init */
  19.     hdma_spi1_tx.Instance = DMA2_Stream3;
  20.     hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX;
  21.     hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  22.     hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  23.     hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
  24.     hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  25.     hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  26.     hdma_spi1_tx.Init.Mode = DMA_NORMAL;
  27.     hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
  28.     hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  29.     if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
  30.     {
  31.       __NOP();
  32.     }

  33.     __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);

  34.     /* SPI1 interrupt Init */
  35.     HAL_NVIC_SetPriority(SPI1_IRQn, 1, 0);
  36.     HAL_NVIC_EnableIRQ(SPI1_IRQn);
  37.         HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0);
  38.     HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
  39.         HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 0);
  40.     HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
复制代码
工程开启了Cache,MPU配置代码也贴出来
  1. int mpu_init(void)
  2. {
  3.     MPU_Region_InitTypeDef MPU_InitStruct;

  4.     /* Disable the MPU */
  5.     HAL_MPU_Disable();

  6.     /* Configure the MPU attributes as WT for AXI SRAM */
  7.     MPU_InitStruct.Enable            = MPU_REGION_ENABLE;
  8.     MPU_InitStruct.BaseAddress       = 0x24000000;
  9.     MPU_InitStruct.Size              = MPU_REGION_SIZE_512KB;
  10.     MPU_InitStruct.AccessPermission  = MPU_REGION_FULL_ACCESS;
  11.     MPU_InitStruct.IsBufferable      = MPU_ACCESS_NOT_BUFFERABLE;
  12.     MPU_InitStruct.IsCacheable       = MPU_ACCESS_CACHEABLE;
  13.     MPU_InitStruct.IsShareable       = MPU_ACCESS_NOT_SHAREABLE;
  14.     MPU_InitStruct.Number            = MPU_REGION_NUMBER0;
  15.     MPU_InitStruct.TypeExtField      = MPU_TEX_LEVEL0;
  16.     MPU_InitStruct.SubRegionDisable  = 0X00;
  17.     MPU_InitStruct.DisableExec       = MPU_INSTRUCTION_ACCESS_ENABLE;

  18. HAL_MPU_ConfigRegion(&MPU_InitStruct);

  19.     /* Enable the MPU */
  20.     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  21.     return 0;
  22. }
复制代码
目前的状态是使用SPI的DMA发送正常(有一个lcd屏同样挂载在SPI1,只给lcd发送指令和数据,屏幕正常显示了),但是SPI的DMA接收功能读取时数据一直是0,关闭Cache测试了一遍还是0,不开DMA模式读取回来数据正常。
想请问一下可能是什么原因?
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2019-11-21 08:55:00 | 显示全部楼层
水滴石穿 发表于 2019-11-20 21:23
有同样的问题,不额外开贴了,请楼主不要介意。
我使用的是H743VIT6,目前想使用SPI1的DMA功能传输,DMA配 ...

你用了DMA就一定有CACHE,既然用了DMA就不要关闭CACHE,注意你的CACHE配置i策略以及刷CACHE
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 02:25 , Processed in 0.235505 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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