野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 233|回复: 2

SD卡DMA传输有问题

[复制链接]
发表于 2024-7-17 11:04:23 | 显示全部楼层 |阅读模式
使用野火H743的例程移植到H750的芯片。(1)在例程中单块读写正常。多块写入正常,但是多块读取失败。(2)将多块写入注释掉,可以成功多块读取。(3)在回调函数里面增加关闭DMA也第一第二点一样。代码如下    if(Status == HAL_OK)
    {
        /* 起始地址为0,写入NUMBER_OF_BLOCKS*512个字节的内容  */
                                TIM6->CNT = 0;
        Status = HAL_SD_WriteBlocks_DMA(&uSdHandle, (uint8_t *)Buffer_Block_Tx, 0,NUMBER_OF_BLOCKS);
                          CPU_TS_Tmr_Delay_US(1000);
        while(TX_Flag == 0);
                                w_time = TIM6->CNT;
                                printf("write 32kB time:%d\r\n",w_time);
                                printf("写入速度:%d kB/s\r\n",NUMBER_OF_BLOCKS/2*10000/w_time);
    }
    /* Fill the buffer to reception */
    Fill_Buffer(Buffer_Block_Rx, MULTI_BUFFER_SIZE/4, 0);   
//    SCB_CleanDCache_by_Addr((uint32_t*)Buffer_Block_Rx, MULTI_BUFFER_SIZE/4);
    if(Status == HAL_OK)
    {
        /* 起始地址为0,读取NUMBER_OF_BLOCKS*512个字节的内容  */
                                printf("start read!\r\n");
                                TIM6->CNT = 0;
                                Status = HAL_SD_ReadBlocks_DMA(&uSdHandle, Buffer_Block_Rx,0, NUMBER_OF_BLOCKS);
                                CPU_TS_Tmr_Delay_US(1000);
                                printf("waite start read ok!\r\n");
        //等待DMA传输完成
        while(RX_Flag == 0);
                                w_time = TIM6->CNT;
                                printf("read 32kB time:%d\r\n",w_time);
                                printf("读取速度:%d kB/s\r\n",NUMBER_OF_BLOCKS/2*10000/w_time);
    }         void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
    TX_Flag=1;
                hsd->Instance->IDMACTRL = SDMMC_DISABLE_IDMA;
}

回复

使用道具 举报

 楼主| 发表于 2024-7-17 11:05:56 | 显示全部楼层
第一次发贴不会用回车,直接就发帖了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-30 16:13:16 | 显示全部楼层
例程读取的时候DMA传输完成了,但是SD处于busy状态,在读取之前加入判断卡状态的代码即可。
Status = HAL_SD_WriteBlocks_DMA(&uSdHandle, (uint8_t *)Buffer_Block_Tx, 0,NUMBER_OF_BLOCKS);
CPU_TS_Tmr_Delay_US(10000);
while(TX_Flag == 0);
while(HAL_SD_GetCardState(&uSdHandle) != HAL_SD_CARD_TRANSFER) ;//判断卡状态,等待卡完成写入,建议读写前都加入这条代码
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-8 11:36 , Processed in 0.136993 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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