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

 
 
> STM32F4 DMA+SDIO, на основе Cube HAL
kan35
сообщение Apr 13 2015, 14:26
Сообщение #1


Знающий
****

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



Здравствуйте все!
У кого нибудь получалось напустить SDIO на DMA в STM32? Особенно инстресует если получалось оживить его на драйвере в комплекте HAL от ST.

У меня какой то странный глюк - в счетчие ДМА перед началом транзакции считывания 512 байт в счетчике числится 128 32 битных слов, а после - остается 4 слова (не дочитывает). В итоге прерывание не случается и все остальные беды. Какого лешего эти 4 слова остаются не вычитанными???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Apr 13 2015, 16:03
Сообщение #2


Знающий
****

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



У меня STM32F1 все заработало можно сказать с пол пинка - и чтение и запись. А на F4 - никак. Делаю одинаково - настраиваю проект через STM32CubeMX. Поллингом проверял - работает, хотя там другие беды.
Ссылка на проект целиком ниже, я думаю запустится на любой плате с SD картой.
https://yadi.sk/d/L5v5UHt0fxMdr
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 13 2015, 16:49
Сообщение #3


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

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



Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл.

А прожект всё-таки лучше чистый создать и тестировать пока только функции

HAL_SD_ReadBlocks_DMA / HAL_SD_CheckReadOperation

HAL_SD_WriteBlocks_DMA / HAL_SD_CheckWriteOperation
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 13 2015, 18:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Dr.Alex @ Apr 13 2015, 19:49) *
Тоже не помню чтобы были проблемы с чтением (ДМА), но может быть просто забыл.

Тут не совсем понятно в чем проблема. Проект, действительно, не маленький - разбираться очень долго.
Я бы отметил две причины, которые следует устранить:
- бывают плохие карты (фэйковые, бракованные, изношенные и т.п.);
Советую попробовать разные карты. Но раз поллингом работает, значит не оно.
- бывают медленные карты (чтение может прерываться);
Таймаут действует для ожидания данных. От момента передачи команды на чтение до появления признака готовности данных.
Чтобы порция не дочитывалась стабильно, это что-то другое.
В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO.
Вообще, флаги ошибок о многом могут рассказать.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 13 2015, 19:59
Сообщение #5


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

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



Цитата(adnega @ Apr 13 2015, 21:59) *
В DMA есть битик DMA_SCR_PFCTRL, который можно (и нужно) установить только при обмене с SDIO.

HAL нигде его не ставит, и я кажыцо догадываюс почему.
Еррата запрещает ставить соответствующий битик в самом SDIO, поэтому я думаю что и в ДМА его либо нельзя ставить, либо он просто не возымеет действия без такого же битика в SDIO.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 13 2015, 21:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Dr.Alex @ Apr 13 2015, 22:59) *
HAL нигде его не ставит, и я кажыцо догадываюс почему.
Еррата запрещает ставить соответствующий битик в самом SDIO, поэтому я думаю что и в ДМА его либо нельзя ставить, либо он просто не возымеет действия без такого же битика в SDIO.

Errata описывает только SDIO HW flow control, но я его и не использую. На DMA это не влияет. Еще один нужный битик DMA_SCR_PBURST.
У меня такой код (обработку ошибок и нестандартного поведения не привожу):
CODE

Перед считыванием данных я проверяю статус (CMD13) - если карта в TRAN, то буду считывать:

else if(cs.current_state == CARD_STATE_TRAN)
{
SDIO->DCTRL = 0;
SDIO->DLEN = sdio_p_buf_size;
DMA2_Stream6->CR = 0
| (4 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (2 << DMA_SCR_MSIZE)
| (2 << DMA_SCR_PSIZE)
| (1 << DMA_SCR_PBURST)
| (1 << DMA_SCR_PFCTRL)
| (0 << DMA_SCR_EN);
DMA2_Stream6->FCR = 0
| (1 << DMA_SFCR_DMDIS)
| (1 << DMA_SFCR_FTH);
DMA2->HIFCR = (0x3D << 16);
DMA2_Stream6->PAR = (DWORD)&SDIO->FIFO;
DMA2_Stream6->M0AR = (DWORD)sdio_p_buf;
DMA2_Stream6->NDTR = sdio_p_buf_size / sizeof(DWORD);
sdio_fsm = SDIO_FSM_READ;
SDIO_Send(CMD18_READ_MULTIPLE_BLOCK, (sdio_sect << ((card_type == CARD_SDHC)? 0 : 9)), EXPECT_SHORT_RESP);
}

когда CMD18 выполнится запускаю прием данных так:

DMA2_Stream6->CR = 0
| (4 << DMA_SCR_CHSEL)
| (1 << DMA_SCR_MINC)
| (2 << DMA_SCR_MSIZE)
| (2 << DMA_SCR_PSIZE)
| (1 << DMA_SCR_PBURST)
| (1 << DMA_SCR_PFCTRL)
| (1 << DMA_SCR_EN);
SDIO->DCTRL = 0
| (9 << SDIO_DCTRL_DBLOCKSIZE)
| (1 << SDIO_DCTRL_DTDIR)
| (1 << SDIO_DCTRL_DMAEN)
| (1 << SDIO_DCTRL_DTEN);

по приходу прерывания DATAEND отправляю "горшочек не вари" для CMD18:

if(status & (1 << SDIO_DATAEND))
{
SDIO->ICR = (1 << SDIO_DATAEND);
SDIO->DCTRL = 0;
sdio_fsm = SDIO_FSM_READ_STOP;
SDIO_Send(CMD12_STOP_TRANSMISSION, NO_ARGUMENTS, EXPECT_SHORT_RESP);
}

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kan35   STM32F4 DMA+SDIO   Apr 13 2015, 14:26
- - Dr.Alex   ДА. Не первый раз удивляюсь, почему этот и другие ...   Apr 13 2015, 15:05
- - kan35   Спасибо за ответ! У меня проблема при чтении п...   Apr 13 2015, 15:41
- - adnega   Цитата(kan35 @ Apr 13 2015, 17:26) У кого...   Apr 13 2015, 15:50
- - kan35   Убрал вариант влияния FATfs. Оставил только эти фу...   Apr 14 2015, 05:52
- - adnega   Считывать надо словами (DWORD 32-бита). В NDTR дол...   Apr 14 2015, 06:00
- - kan35   CIRC не влияет, я отключал А 32 битный захват данн...   Apr 14 2015, 06:35
|- - adnega   Цитата(kan35 @ Apr 14 2015, 09:35) то ест...   Apr 14 2015, 07:54
|- - Dr.Alex   Вы так и не посмотрели статус СДИО, наверняка там ...   Apr 14 2015, 08:03
|- - kan35   Цитата(Dr.Alex @ Apr 14 2015, 11:03) Вы т...   Apr 14 2015, 08:37
|- - Dr.Alex   Посмотрел щас у себя, оказалось что читаю я всё-та...   Apr 14 2015, 10:28
|- - Dr.Alex   Раскапывая чибиос, обнаружил похоже ЕДИНСТВЕННУЮ к...   Apr 16 2015, 14:45
|- - AHTOXA   Цитата(Dr.Alex @ Apr 16 2015, 19:45) Неуж...   Apr 16 2015, 17:21
|- - amateur   Внезапно тоже бился с недопередачей последних нес...   Apr 17 2015, 16:46
|- - Dr.Alex   Если бы дело было только в этом. Я этот бит раз ст...   Apr 17 2015, 17:12
- - kan35   действительно, в дма должен быть выставлен periphe...   Apr 18 2015, 05:08
- - pitt   SDIO+DMA FEIF error. I didn't find any way to...   Apr 29 2015, 14:00


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 23:14
Рейтинг@Mail.ru


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