Dr.Alex 0 14 апреля, 2015 Опубликовано 14 апреля, 2015 · Жалоба Посмотрел щас у себя, оказалось что читаю я всё-таки без ДМА, поскоку практически не читаю, а только пишу. Попробовал с ДМА, нарвался на ту же фигню. Но добавление 16-и в DLEN всё-таки меняет ситуацию, ДМА доходит до конца. Строчка в функции HAL_SD_ReadBlocks_DMA выглядит так: sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks + 16; Но в целом всё равно не работает, т.к. появляются другие проблемы. Как минимум нужно ещё поправить функцию HAL_SD_CheckReadOperation. К сож. времени нет с этим разбираться, но вообще проблему дожать необходимо, а то говно какое-то. UPD:: Заметил, что это прокатывет если читать более одного 512-байт сектора. Хотя бы 2. Если читать 512 байт, то вместо 4 слов не дочитывает 3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 16 апреля, 2015 Опубликовано 16 апреля, 2015 · Жалоба Раскапывая чибиос, обнаружил похоже ЕДИНСТВЕННУЮ комбинацию настроек ДМА и ФИФО, при которой вроде бы всё работает:: 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); Неужели всё.... :-о :-о :-о Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 16 апреля, 2015 Опубликовано 16 апреля, 2015 · Жалоба Неужели всё.... :-о :-о :-о Если DMA_MDATAALIGN_WORD означает доступ по словам, то ещё не всё :) Гляньте вот этот топик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amateur 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Внезапно :) тоже бился с недопередачей последних нескольких байт, пока не последовал примеру выше (который из чибиоса) и не выставил SDIO в качестве DMA flow controller. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба Если бы дело было только в этом. Я этот бит раз сто ставил и убирал. А оказалось что ВСЕ настройки должны быть только такими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 18 апреля, 2015 Опубликовано 18 апреля, 2015 · Жалоба действительно, в дма должен быть выставлен peripherial flow control, burst mode по 4 слова, а так же, что не маловажно, чтобы работал стандартрный HAL драйвер нужно включить прерывание так же от SDIO и установить прерывание от него выше, чем от dma. Вроде бы проблема решена. Хоть и не понятно, почему работает именно при таких настройках и только при таких. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
let's see 0 29 апреля, 2015 Опубликовано 29 апреля, 2015 (изменено) · Жалоба 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. Изменено 30 апреля, 2015 пользователем pitt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться