You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F412启用DMA时SDIO Tx Underrun错误排查求助

SD卡SDIO单块写DMA传输Tx FIFO欠载错误求助

我正在开发SD卡驱动项目,目前已完成初始化及DMA读数据功能,全程未使用HAL库。以下是参考手册实现的SD卡单块写操作代码:

void SDIO_MEM_Write_SingleBlock512(uint32_t Address, uint32_t* Buffer)
{
    //Single Block Transfer

    //uint8_t Result = 0xFF;
    uint8_t tempCardState;

    SDIO->DLEN = 512;
    SDIO->DTIMER = 0xFFFFFFFF;

    //Configure DMA
    DMA2->LIFCR |= DMA_LIFCR_CTCIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTEIF3 | DMA_LIFCR_CFEIF3; //Clear Interrupt Flag

    DMA2_Stream3->CR = 0;
    DMA2_Stream3->CR |= (0b11 << DMA_SxCR_PL_Pos) | DMA_SxCR_MINC | (0b01 << DMA_SxCR_DIR_Pos) | (4 << DMA_SxCR_CHSEL_Pos) | (0b01<<DMA_SxCR_MBURST_Pos) | (0b01<<DMA_SxCR_PBURST_Pos) | (0b10 << DMA_SxCR_MSIZE_Pos) | (0b10 << DMA_SxCR_PSIZE_Pos) | (0b1<<DMA_SxCR_PFCTRL_Pos);
    DMA2_Stream3->PAR  = (uint32_t) &SDIO->FIFO;
    DMA2_Stream3->M0AR = (uint32_t) Buffer; //Memory Address which data will be copied
    DMA2_Stream3->NDTR = 128; // Data to be transfered
    DMA2_Stream3->CR |= DMA_SxCR_EN;

    //Write Single Block Command issued by using CMD24
    SDIO_SendCMD(Address, 24, WAIT_SHRTRESPONS, 0);

    if(SDIO_WaitCMDResponse() != 0xFF)
    {
        while(1);//Error Occurred
    }

    //Get R1 for Analysis
    if((SDIO->RESP1) & 0xFDFFE008) //Card Status
    {
        while(1);//Error Occurred
    }


    SDIO->DCTRL = 0;
    SDIO->DCTRL |= ((BLKSIZE_512 << SDIO_DCTRL_DBLOCKSIZE_Pos) | (TRSFRDIR_HtC << SDIO_DCTRL_DTDIR_Pos) | (TRSFRMOD_BLK << SDIO_DCTRL_DTMODE_Pos) | SDIO_DCTRL_DTEN | SDIO_DCTRL_DMAEN);

    while((SDIO->STA & (SDIO_STA_DBCKEND)) == 0);

    SDIO->ICR = (SDIO_ICR_DBCKENDC | SDIO_ICR_DATAENDC);

    //Wait until write Operation is finished
    do
    {
        if(SDIO_FetchCardState(&tempCardState) != 0xFF)
        {
            while(1);//Error Occurred
        }
    }while(tempCardState == 0x04); //Check Transfer State

    //return Result;
}

执行上述代码中SDIO->DCTRL配置语句启用DMA和SDIO数据传输后,SDIO STA寄存器立即出现Tx FIFO欠载错误,DMA ISR寄存器出现FIFO错误。调整DMA与SDIO的启用顺序后问题仍未解决,想请教是否有同行遇到过类似问题?


内容的提问来源于stack exchange,提问作者user19402326

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:31:21