搜索
查看: 4649|回复: 7

[已解决] STM32F767Zi HAL库SDMMC使用DMA方式写入数据异常

[复制链接]

该用户从未签到

1

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-7-6
发表于 2018-2-20 21:38:02 | 显示全部楼层 |阅读模式
本帖最后由 caojin85cn 于 2018-2-20 21:46 编辑

环境:WIN7 64bit + MDK5.20
硬件:stm32F7 Nucleo (F767Zi)
STM32F7xx_DFP  版本2.9.0(目前最新的)

SDMMC配置参数
  1. SDHandle_SDMMC.Instance = SDMMC2;
  2. SDHandle_SDMMC.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  3. SDHandle_SDMMC.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
  4. SDHandle_SDMMC.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  5. SDHandle_SDMMC.Init.BusWide = SDMMC_BUS_WIDE_1B;
  6. SDHandle_SDMMC.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;
  7. SDHandle_SDMMC.Init.ClockDiv = 10; //4Mhz
复制代码
SDMMC中断
  1. HAL_NVIC_SetPriority(SDMMC2_IRQn, 3, 1);
  2. HAL_NVIC_EnableIRQ(SDMMC2_IRQn);
复制代码

DMA中断
  1. HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
  2. HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
复制代码

目前的问题是
使用HAL库提供的函数:HAL_SD_WriteBlocks_DMA
直接写一个块或者多个块,函数返回值正常,也可以进入DMA传输完成中断,DMA也未报错
但是后续在读取数据时发现之前写入的数据全部都是0

而如果调用非DMA方式写入函数:HAL_SD_WriteBlocks 做同样的写入操作,则结果正常,后续读取数据也是和写入的一致

简单来说,就是通过DMA方式写入SD卡的数据全都是0

还求各位给点意见,可能是什么地方的问题?如何定位?
最近发现2.9.0版本的HAL库在SDMMC方面有一些Bug,会不会导致这个结果?

补充:DMA的读取结果是正常的

回复

使用道具 举报

该用户从未签到

1

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-7-6
 楼主| 发表于 2018-2-20 21:42:35 | 显示全部楼层
DMA配置参数
  1. hdma_sdmmc.Instance = DMA2_Stream5;
  2. hdma_sdmmc.Init.Channel = DMA_CHANNEL_11;
  3. hdma_sdmmc.Init.Direction = DMA_MEMORY_TO_PERIPH;
  4. hdma_sdmmc.Init.PeriphInc = DMA_PINC_DISABLE;
  5. hdma_sdmmc.Init.MemInc = DMA_MINC_ENABLE;
  6. hdma_sdmmc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  7. hdma_sdmmc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  8. hdma_sdmmc.Init.Mode = DMA_SxCR_PFCTRL;
  9. hdma_sdmmc.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  10. hdma_sdmmc.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  11. hdma_sdmmc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  12. hdma_sdmmc.Init.MemBurst = DMA_MBURST_INC4;
  13. hdma_sdmmc.Init.PeriphBurst = DMA_PBURST_INC4;
复制代码


回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-7-6
 楼主| 发表于 2018-2-20 21:43:42 | 显示全部楼层
本帖最后由 caojin85cn 于 2018-2-20 21:45 编辑

SD卡是Lexar 16G Class6 这个问题应该和SD卡无关,试过sony和kingston一样的结果
SDMMC1和SDMMC2都试过,结果一样
DMA2 Channel4 Stream3 Stream6
DMA2 Channel11 Stream0 Stream5
都试过,也是一样的结果
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-7-6
 楼主| 发表于 2018-2-21 12:27:03 | 显示全部楼层
已解决,Cache数据一致性问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2018-3-7
发表于 2018-3-6 17:21:41 | 显示全部楼层
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA之后然后顺便把while(BSP_SD_GetCardState()!= MSD_OK)注释了,f_open就返回说没有文件系统了,有点费解
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

新手上路

最后登录
2018-3-7
发表于 2018-3-6 17:22:50 | 显示全部楼层
  1. DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
  2. {
  3.   DRESULT res = RES_ERROR;
  4.   uint32_t timeout = 100000;

  5.   if((unsigned int)buff % 4)
  6.   {
  7.           buff = buff;
  8.   }

  9.   if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
  10.                        (uint32_t) (sector),
  11.                        count) == MSD_OK)
  12.   {
  13. //    while(BSP_SD_GetCardState()!= MSD_OK)
  14. //    {
  15. //      if (timeout-- == 0)
  16. //      {
  17. //        return RES_ERROR;
  18. //      }
  19. //    }
  20.     res = RES_OK;
  21.   }
  22.   
  23.   return res;
  24. }
复制代码

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-7-6
 楼主| 发表于 2018-6-28 17:37:33 | 显示全部楼层
hlb007 发表于 2018-3-6 17:21
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA ...

我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以了
你这个看起来是文件系统相关的,需要具体看一下文件系统对DMA读写的要求了
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

蝴蝶豆

初级会员

最后登录
2018-10-19
发表于 2018-9-6 19:42:12 | 显示全部楼层
caojin85cn 发表于 2018-6-28 17:37
我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以 ...

请问下,楼主这个 cache是怎么一回事,怎么做同步呢,我的好像也是读写错误,需要加入延时才能成功。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 21:42 , Processed in 0.193544 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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