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
相关产品推荐
相关产品推荐

