caojin85cn 发表于 2018-2-20 21:38:02

STM32F767Zi HAL库SDMMC使用DMA方式写入数据异常

本帖最后由 caojin85cn 于 2018-2-20 21:46 编辑

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

SDMMC配置参数
SDHandle_SDMMC.Instance = SDMMC2;
SDHandle_SDMMC.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
SDHandle_SDMMC.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
SDHandle_SDMMC.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
SDHandle_SDMMC.Init.BusWide = SDMMC_BUS_WIDE_1B;
SDHandle_SDMMC.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;
SDHandle_SDMMC.Init.ClockDiv = 10; //4MhzSDMMC中断
HAL_NVIC_SetPriority(SDMMC2_IRQn, 3, 1);
HAL_NVIC_EnableIRQ(SDMMC2_IRQn);
DMA中断HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
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的读取结果是正常的

caojin85cn 发表于 2018-2-20 21:42:35

DMA配置参数
hdma_sdmmc.Instance = DMA2_Stream5;
hdma_sdmmc.Init.Channel = DMA_CHANNEL_11;
hdma_sdmmc.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_sdmmc.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdmmc.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdmmc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdmmc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdmmc.Init.Mode = DMA_SxCR_PFCTRL;
hdma_sdmmc.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_sdmmc.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sdmmc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sdmmc.Init.MemBurst = DMA_MBURST_INC4;
hdma_sdmmc.Init.PeriphBurst = DMA_PBURST_INC4;

caojin85cn 发表于 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
都试过,也是一样的结果

caojin85cn 发表于 2018-2-21 12:27:03

已解决,Cache数据一致性问题

hlb007 发表于 2018-3-6 17:21:41

老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA之后然后顺便把while(BSP_SD_GetCardState()!= MSD_OK)注释了,f_open就返回说没有文件系统了,有点费解

hlb007 发表于 2018-3-6 17:22:50

DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
uint32_t timeout = 100000;

if((unsigned int)buff % 4)
{
        buff = buff;
}

if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
                     (uint32_t) (sector),
                     count) == MSD_OK)
{
//    while(BSP_SD_GetCardState()!= MSD_OK)
//    {
//      if (timeout-- == 0)
//      {
//      return RES_ERROR;
//      }
//    }
    res = RES_OK;
}

return res;
}

caojin85cn 发表于 2018-6-28 17:37:33

hlb007 发表于 2018-3-6 17:21
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA ...

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

luo_18 发表于 2018-9-6 19:42:12

caojin85cn 发表于 2018-6-28 17:37
我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以 ...

请问下,楼主这个 cache是怎么一回事,怎么做同步呢,我的好像也是读写错误,需要加入延时才能成功。
页: [1]
查看完整版本: STM32F767Zi HAL库SDMMC使用DMA方式写入数据异常