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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
Dr.Alex
сообщение Apr 13 2015, 15:05
Сообщение #2


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

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



ДА.
Не первый раз удивляюсь, почему этот и другие глюки не были найдены раньше, хотя народу кто якобы уже много лет пользуется СТМ32Ф4 целая москва.
То ли все делают ёлочные гирлянды и не пишут СД через дма, то ли я лошара.

Речь о записи на СД, как я понимаю.
ДМА останавливается потому что в СДИО по непонятной причине возникает ошибка TXUNDERR (регистр STA), проверьте.
Почему-то возникает она всегда на последних 10-и словах. Само ДМА не при чём.

А лечение такое:: пишите в DLEN (SDIO) на 16+ слов больше, чем в ДМА.
А окончание записи придётся контролировать именно по завершению ДМА, прерывание от СДИО вообще запретите.
То есть, несколько функций придётся подредактировать, сейчас не скажу каких точно.

Сообщение отредактировал IgorKossak - Apr 13 2015, 16:10
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 13 2015, 15:41
Сообщение #3


Знающий
****

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



Спасибо за ответ!
У меня проблема при чтении пока, до записи банально не добрался.
Попробовал прибавить 16 к 512 в DLEN, но ситуация не сильно поменялась, в счетчике стало оставаться 3 (вместо 4).

при чем эти несчастные 16 остаются в счетчике DLEN после отработки, надо видимо еще что-то править
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 13 2015, 15:50
Сообщение #4


Гуру
******

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



Цитата(kan35 @ Apr 13 2015, 17:26) *
У кого нибудь получалось напустить SDIO на DMA в STM32?

Чтение работает как часы. Без шаманств, в строгом соответствии с документацией.
Правда, сторонними библиотеками не пользуюсь.
Могли бы вы привести код?
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 13 2015, 16:03
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #8


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

Группа: Свой
Сообщений: 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
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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
сообщение Apr 14 2015, 05:52
Сообщение #10


Знающий
****

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



Убрал вариант влияния FATfs. Оставил только эти функции:
Код
    BSP_SD_Init();
    char buffer[512];
    BSP_SD_ReadBlocks((uint32_t *)buffer, 0, 512, 1);

PFCTRL дейтсивтельно ни влияет. Просто NDTR начинается с 0xFFFF. И в данном случае так же не дочитывает 4 слова.
По битам - проверяю, все то же самое, см. картинку.

test
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 14 2015, 06:00
Сообщение #11


Гуру
******

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



Считывать надо словами (DWORD 32-бита). В NDTR должно лежать количество DWORD'ов для считывания (для сектора 512 байт NDTR=128).
PBURST и PFCTRL нужно установить - помню тоже шаманил с настройками. Размеры транзакций для периферии и памяти 32-битные.

А CIRC не лишний? Зачем нужен циклический буфер?
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 14 2015, 06:35
Сообщение #12


Знающий
****

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



CIRC не влияет, я отключал
А 32 битный захват данных и так включен (PSIZE=2, MSIZE = 2).
В NDTR перед началом транзакции было 0x00000080, после - 4, то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут!

раньше напарывался та такой косяк, что данные были не выровнены на 4 байта, но тут все четко.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 14 2015, 07:54
Сообщение #13


Гуру
******

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



Цитата(kan35 @ Apr 14 2015, 09:35) *
то есть отправилось 124 слова, кстати я в буфере вижу, что так и есть, данные из карты идут!

Т.е. последние 16 байт не укладываются в буфер?
Буфер смотрели? Данные не смещены?
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение Apr 14 2015, 08:03
Сообщение #14


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

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



Вы так и не посмотрели статус СДИО, наверняка там ошибки..
Go to the top of the page
 
+Quote Post
kan35
сообщение Apr 14 2015, 08:37
Сообщение #15


Знающий
****

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



Цитата(Dr.Alex @ Apr 14 2015, 11:03) *
Вы так и не посмотрели статус СДИО, наверняка там ошибки..

Посмотрел - ошибок нет во флагах. Скрин приложу чуть позже.
Данные 512 байт как будто пролетают все.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 05:24
Рейтинг@Mail.ru


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