Jump to content

    
Sign in to follow this  
kan35

STM32F4 DMA+SDIO

Recommended Posts

Посмотрел щас у себя, оказалось что читаю я всё-таки без ДМА, поскоку практически не читаю, а только пишу.

Попробовал с ДМА, нарвался на ту же фигню.

Но добавление 16-и в DLEN всё-таки меняет ситуацию, ДМА доходит до конца.

Строчка в функции HAL_SD_ReadBlocks_DMA выглядит так:

sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks + 16;

Но в целом всё равно не работает, т.к. появляются другие проблемы.

Как минимум нужно ещё поправить функцию HAL_SD_CheckReadOperation.

К сож. времени нет с этим разбираться, но вообще проблему дожать необходимо, а то говно какое-то.

 

UPD::

Заметил, что это прокатывет если читать более одного 512-байт сектора. Хотя бы 2.

Если читать 512 байт, то вместо 4 слов не дочитывает 3.

Share this post


Link to post
Share on other sites

Раскапывая чибиос, обнаружил похоже ЕДИНСТВЕННУЮ комбинацию настроек ДМА и ФИФО, при которой вроде бы всё работает::

 

hdma_sdio.Instance = DMA2_Stream6;
hdma_sdio.Init.Channel = DMA_CHANNEL_4;
hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH;//DMA_PERIPH_TO_MEMORY
hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_sdio.Init.MemInc = DMA_MINC_ENABLE;
hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_sdio.Init.Mode = DMA_PFCTRL;
hdma_sdio.Init.Priority = DMA_PRIORITY_LOW; // Единственное что не имеет значения
hdma_sdio.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_sdio.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_sdio.Init.MemBurst = DMA_MBURST_INC4;
hdma_sdio.Init.PeriphBurst = DMA_PBURST_INC4;
HAL_DMA_Init(&hdma_sdio);

__HAL_LINKDMA(hsd,hdmarx,hdma_sdio);
__HAL_LINKDMA(hsd,hdmatx,hdma_sdio);

 

Неужели всё.... :-о :-о :-о

Share this post


Link to post
Share on other sites

Внезапно :) тоже бился с недопередачей последних нескольких байт, пока не последовал примеру выше (который из чибиоса) и не выставил SDIO в качестве DMA flow controller.

 

Share this post


Link to post
Share on other sites

Если бы дело было только в этом. Я этот бит раз сто ставил и убирал.

А оказалось что ВСЕ настройки должны быть только такими.

 

Share this post


Link to post
Share on other sites

действительно, в дма должен быть выставлен peripherial flow control, burst mode по 4 слова, а так же, что не маловажно, чтобы работал стандартрный HAL драйвер нужно включить прерывание так же от SDIO и установить прерывание от него выше, чем от dma.

 

Вроде бы проблема решена. Хоть и не понятно, почему работает именно при таких настройках и только при таких.

post-14594-1429333527_thumb.png

post-14594-1429333538_thumb.png

Share this post


Link to post
Share on other sites

SDIO+DMA FEIF error.

I didn't find any way to avoid this error but ignoring it. I wasn't the first one of doing so. There is an example from Keil: .\Keil\ARM\Boards\Keil\MCBSTM32F400\RL\FlashFS\SD_File\SDIO_STM32F4xx.c

static BOOL WriteBlock (U32 bl, U8 *buf, U32 cnt) {
  /* Write a cnt number of 512 byte blocks to Flash Card. */
  U32 i;

  SDIO->DLEN    = cnt * 512;
  SDIO->DTIMER  = cnt * DATA_WR_TOUT_VALUE;
  SDIO->DCTRL   = SDIO_DCTRL_DBLOCKSIZE_3 | SDIO_DCTRL_DBLOCKSIZE_0 |
                  SDIO_DCTRL_DMAEN        | SDIO_DCTRL_DTEN    ;

  for (i = DMA_TOUT; i; i--) {
    if (DMA2->LISR & DMA_LISR_TEIF3) {
      break;
    }
    
    if (DMA2->LISR & DMA_LISR_TCIF3) {
      if ((SDIO->STA & (SDIO_STA_DBCKEND|SDIO_STA_DATAEND)) == (SDIO_STA_DBCKEND|SDIO_STA_DATAEND)) { 
        /* Data transfer finished. */
        return (__TRUE);
      }
    }
  }
  /* DMA Transfer timeout. */
  return (__FALSE);
}

 

If you look inside their for loop they just ignoring FEIF.

I verified that card access works (at least every time I've tried) and as I stated before I don't know any way to avoid this error.

STM errata doesn't shed light on this issue or I didn't find it...

Does anyone knows better way to deal with this issue?

 

Thank you in advance.

Edited by pitt

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this