OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5478|回复: 1

F7的SDIO+DMA传输有问题

[复制链接]

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-6-20
在线时间
10 小时
发表于 2017-5-19 09:42:59 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 MCU爆炸者 于 2017-5-19 09:45 编辑

    不知道诸位有不有遇到这样的情况,SDIO+DMA读数据(只读一个块)的时候会丢失一部分数据,SD卡设的4线模式,丢失的数据总是在头和尾,我看了手册DMA的部分,使用DMA FIFO的情况很多时候要半字或者全字对对齐,索性我就8字节对齐了,贴了部分代码上来
    [mw_shl_code=c,true]__align(8) vu8 Array[512];
HAL_SD_ReadBlocks_DMA(&SD_Handle, (u8*)Array, 40, 1);[/mw_shl_code]
QQ图片20170519091534.png

    我看了看HAL_SD_ReadBlocks_DMA这个函数的内容,DMA是字模式的
[mw_shl_code=applescript,true]HAL_StatusTypeDef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint8_t *pData, uint32_t BlockAdd, uint32_t NumberOfBlocks)

......
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pData, (uint32_t)(BLOCKSIZE * NumberOfBlocks)/4);
......
}[/mw_shl_code]
    我的DMA配置是这样的
[mw_shl_code=applescript,true]    __HAL_LINKDMA(&SD_Handle,hdmarx,SD_DMA);
   
    SD_Handle.hdmarx->Instance                  = DMA2_Stream3;
    SD_Handle.hdmarx->Init.Channel              = DMA_CHANNEL_4;
    SD_Handle.hdmarx->Init.Direction            = DMA_PERIPH_TO_MEMORY;
    SD_Handle.hdmarx->Init.FIFOMode             = DMA_FIFOMODE_ENABLE;
    SD_Handle.hdmarx->Init.FIFOThreshold        = DMA_FIFO_THRESHOLD_FULL;  
    SD_Handle.hdmarx->Init.Mode                 = DMA_PFCTRL;
    SD_Handle.hdmarx->Init.PeriphDataAlignment  = DMA_PDATAALIGN_WORD;
    SD_Handle.hdmarx->Init.MemDataAlignment     = DMA_MDATAALIGN_WORD;
    SD_Handle.hdmarx->Init.PeriphBurst          = DMA_PBURST_INC4;
    SD_Handle.hdmarx->Init.MemBurst             = DMA_MBURST_INC4;
    SD_Handle.hdmarx->Init.PeriphInc            = DMA_PINC_DISABLE;
    SD_Handle.hdmarx->Init.MemInc               = DMA_MINC_ENABLE;
    SD_Handle.hdmarx->Init.Priority             = DMA_PRIORITY_VERY_HIGH;
   
    HAL_DMA_Init(SD_Handle.hdmarx);[/mw_shl_code]

    如果哪里有问题,还望大佬指出..
    DMA方式读出来的数据
  

  使用polling模式读出来的数据又是对的...
  [mw_shl_code=c,true]HAL_SD_ReadBlocks(&SD_Handle, (u8*)Array, 40, 1, 10000);[/mw_shl_code]

asdasds.png

   而且更神奇的是使用不同的长度对齐(2的整数倍)的时候会出现不同的程度的丢失,头尾都会有部分丢失,比如我设置4字节对齐,头尾就各丢十多个字节,然后不弄了。第二天起床的时候有可能它丢失的字节数就不一样了...简直神奇..  我开SDIO的中断检查标志位的时候也没发现问题,只有DATAEND数据传输结束位会被拉起,没有出现错误标志, 我去其他电子论坛转悠了一圈,发现有人在用L4的时候也出现了同样的情况,F4则没事(原子F429的板子我有,尝试过,正常的)。这个问题好像普遍就集中在F7和L系列的库上面,不知道大佬们们有什么好点的建议没有...   板子是F746的Discovery板..


















asdasds.png
QQ图片20170519091534.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-22 00:35:22 | 显示全部楼层
试试我们开发板的代码呢?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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