This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

通过DMA读写SD卡数据的一个问题



在138的MMCSD卡控制器的那一章有说到,在用DMA读写SD卡数据时,DMA _SIZE必须要大于或等于控制器的FIFO的大小,现在设置的FIFO大小为64byte,但是只有当我每次DMA传输数据长度等于64byte的时候才能读取成功,大于的时候就不行,SD卡每个扇区大小为512byte,也就是说每读一个扇区要分成8次DMA的传输才能完成,请问是我哪里配置不对吗?还是SD卡控制器通过DMA确实每次只能获取FIFO大小的数据?

  • 下面是我的DMA的参数配置和启动的代码:

    stEdma3CcPaRamEntry stPaRamEntry;
    memset(&stPaRamEntry, 0, sizeof(stEdma3CcPaRamEntry));
    stPaRamEntry.option = (1<<20)|(EDMA0_MMCSD0RX_CHANNEL<<12)|(1<<2);
    stPaRamEntry.srcAdrr = MMCSD0_DRR;
    stPaRamEntry.aCnt = 4;
    stPaRamEntry.bCnt = 16;
    stPaRamEntry.destAddr = (uint32_t)data;
    stPaRamEntry.srcBIdx = 0;
    stPaRamEntry.destBIdx = 4;
    stPaRamEntry.linkAddr = 0xFFFF;
    stPaRamEntry.bCntReload = 0;
    stPaRamEntry.srcCIdx = 0;
    stPaRamEntry.destCIdx = 64;
    stPaRamEntry.cCnt = len/64;

    Edma30SetCcPaRam(EDMA0_MMCSD0RX_CHANNEL, &stPaRamEntry);

    M_EDMA30CC_GC_ESR = 1 << EDMA0_MMCSD0RX_CHANNEL;

    while(!(M_EDMA30CC_GC_IPR&(1<<EDMA0_MMCSD0RX_CHANNEL)))
    {}
    M_EDMA30CC_GC_ICR |= (1<<EDMA0_MMCSD0RX_CHANNEL);

    其中data是数据指针,len要读取的长度,调试时为512
  • FIFOLEV满了会产生EDMA事件,此时DMA读到的就是FIFO大小的数据。
    The FIFO includes logic to generate EDMA events and interrupts based on the amount of data in the FIFO
  • 也就是说DMA size不能大于FIFO的大小是吗?
  • 请问如何让其读完一次FIFO大小的数据后等第二次FIFO满了继续读呢,而不需要手动触发?