реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32F4 DMA+SDIO, на основе Cube HAL
Dr.Alex
сообщение Apr 14 2015, 10:28
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Посмотрел щас у себя, оказалось что читаю я всё-таки без ДМА, поскоку практически не читаю, а только пишу.
Попробовал с ДМА, нарвался на ту же фигню.
Но добавление 16-и в DLEN всё-таки меняет ситуацию, ДМА доходит до конца.
Строчка в функции HAL_SD_ReadBlocks_DMA выглядит так:
sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks + 16;
Но в целом всё равно не работает, т.к. появляются другие проблемы.
Как минимум нужно ещё поправить функцию HAL_SD_CheckReadOperation.
К сож. времени нет с этим разбираться, но вообще проблему дожать необходимо, а то говно какое-то.

UPD::
Заметил, что это прокатывет если читать более одного 512-байт сектора. Хотя бы 2.
Если читать 512 байт, то вместо 4 слов не дочитывает 3.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 16 2015, 14:45
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



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

Код
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);


Неужели всё.... :-о :-о :-о
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 16 2015, 17:21
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Dr.Alex @ Apr 16 2015, 19:45) *
Неужели всё.... :-о :-о :-о

Если DMA_MDATAALIGN_WORD означает доступ по словам, то ещё не всё sm.gif
Гляньте вот этот топик.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
amateur
сообщение Apr 17 2015, 16:46
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 25-03-07
Пользователь №: 26 489



Внезапно sm.gif тоже бился с недопередачей последних нескольких байт, пока не последовал примеру выше (который из чибиоса) и не выставил SDIO в качестве DMA flow controller.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 17 2015, 17:12
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Если бы дело было только в этом. Я этот бит раз сто ставил и убирал.
А оказалось что ВСЕ настройки должны быть только такими.
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 18 2015, 05:08
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



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

Вроде бы проблема решена. Хоть и не понятно, почему работает именно при таких настройках и только при таких.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
pitt
сообщение Apr 29 2015, 14:00
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



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 - Apr 30 2015, 01:36


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 07:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016