硬汉嵌入式论坛

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

[SD/SDIO] stm32H743 sd使用dma问题 HAL_SD_ReadBlocks_DMA()读到数据全是0

[复制链接]

5

主题

27

回帖

42

积分

新手上路

积分
42
发表于 2021-10-20 15:45:45 | 显示全部楼层 |阅读模式
请教一个下个 我使用stm32h743 sd使用dma  使用cubemx 生成的代码 通过HAL_SD_WriteBlocks_DMA()和 HAL_SD_ReadBlocks_DMA()函数读写 sd卡 ,读到的数据是0.
__align(4) uint8_t  write_buf[512];
__align(4) uint8_t  read_buf[512];
void sd_test(void)
{
        u32 i = 0, status;
        HAL_SD_CardStateTypeDef State;
  HAL_SD_CardCIDTypeDef SD_CardCID;
        State = HAL_SD_GetCardState(&hsd1);
        if(State == HAL_SD_CARD_TRANSFER)
        {
                HAL_SD_GetCardCID(&hsd1,&SD_CardCID);
                printf("\r\n Initialize SD card successfully!\r\n\r\n");
                printf(" SD card information! \r\n");
                printf(" CardCapacity  : %llu \r\n",((unsigned long long)hsd1.SdCard.BlockSize*hsd1.SdCard.BlockNbr));
                printf(" CardBlockSize : %d \r\n",hsd1.SdCard.BlockSize);
                printf(" RCA           : %d \r\n",hsd1.SdCard.RelCardAdd);
                printf(" CardType      : %d \r\n",hsd1.SdCard.CardType);
                printf(" ManufacturerID: %d \r\n",SD_CardCID.ManufacturerID);
        }
        else
        {
                printf("SD卡初始化失败\n" );
                while(1); // 停机
        }
      
        for(i = 0; i < 512; i++)
        {
                write_buf = i % 256;
        }
        printf("------------------- Write SD card block data Test ------------------\r\n");
//status = HAL_SD_WriteBlocks(&hsd1,(uint8_t *)write_buf,0,1,0xffff);
status = HAL_SD_WriteBlocks_DMA(&hsd1,(uint8_t *)write_buf,0,512);
//status = BSP_SD_WriteBlocks_DMA((uint32_t *)write_buf,0,100);
if(status == 0)
{
    printf("Write block data ok \r\n" );
}
else
{
    printf("Write block data fail!\r\n " );
}
delay_ms(2000);
      
printf("------------------- Read SD card block data after Write ------------------\r\n");
status = HAL_SD_ReadBlocks_DMA(&hsd1,(uint8_t *)read_buf,0,512);
//status = BSP_SD_ReadBlocks_DMA((uint32_t *)read_buf, 2 ,100);
if(status == 0)
{
    printf("Read block data ok \r\n" );
    for(i = 0; i < 512; i++)
    {
        printf("0x%02x ", read_buf);
        if((i+1)%16 == 0)
        {
            printf("\r\n");
        }
    }
}else
{
  printf("read block data fail %d\r\n", status);
}

      
      
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2021-10-21 08:42:28 | 显示全部楼层
方便的话,可以使用我这个里面的V7-025,各种主流SD卡全部测试通过。

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至91章(2021-03-22)
http://www.armbbs.cn/forum.php?m ... 6980&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-11-3 16:12:03 | 显示全部楼层
检查一下:
#define ENABLE_SD_DMA_CACHE_MAINTENANCE  1
也许,可以解决问题。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2023-7-6 13:14:45 | 显示全部楼层
leoo00 发表于 2021-11-3 16:12
检查一下:
#define ENABLE_SD_DMA_CACHE_MAINTENANCE  1
也许,可以解决问题。

L4不支持这个,反正把对齐是弄了的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 19:39 , Processed in 0.236159 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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