Перейти к содержанию
    

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

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

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

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

sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks + 16;

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

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

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

 

UPD::

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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);

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если DMA_MDATAALIGN_WORD означает доступ по словам, то ещё не всё :)

Гляньте вот этот топик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

post-14594-1429333527_thumb.png

post-14594-1429333538_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Изменено пользователем pitt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...