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

 
 
> STM32L4 + SD + DMA + FatFs
Allregia
сообщение Jul 26 2017, 18:49
Сообщение #1


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Джентельмены, нет ли у кого работающего примера работы SD+FatFs через DMA на L4? Буду очень признателен.

Пробовали пример от STM32L476G_EVAL, но там только в поллинге.
Попробовали пределать под DMA, но пока не работает, читает только первый килобайт а потом ошибка, с записью вообще пока не работает.
В поллинге нет проблем, но он работает только при выключенных прерываниях (оно есть в коде на еваборду).
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
Genadi Zawidowsk...
сообщение Jul 26 2017, 18:54
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Есть для не "L" а для "F"

https://188.134.5.254/browser/trunk

Файл sdcard.c и dskio.c

ПРограммирование адреса периферии не тут, надюсь поможет. Это как пониямете из работающего проекта..

CODE
/* DMA2 Stream6 Channel 4 */
const uint_fast8_t ch = 4;

DMA2_Stream6->M0AR = addr;
DMA2_Stream6->NDTR = (DMA2_Stream6->NDTR & ~ DMA_SxNDT) |
(1 * DMA_SxNDT_0); // Особый случай - регистр игнорируется. В примерах от ST пишется 1

if (direction == 0)
{
// Read from SD CARD
//DMA2_Stream6->NDTR = (DMA2_Stream6->NDTR & ~ DMA_SxNDT) |
// (length0 * count / 4 * DMA_SxNDT_0); // Особый случай - регистр игнорируется. В примерах от ST пишется 1

DMA2_Stream6->FCR =
1 * DMA_SxFCR_DMDIS | // use FIFO mode
3 * DMA_SxFCR_FTH_0 | // 11: full FIFO
0;

DMA2_Stream6->CR =
0 * DMA_SxCR_DIR_0 | // 00: Peripheral-to-memory
ch * DMA_SxCR_CHSEL_0 | // канал
1 * DMA_SxCR_PFCTRL | // 1: The peripheral is the flow controller (required for SDIO/SDMMC connected DMA)
1 * DMA_SxCR_MBURST_0 | // 01: INCR4 (incremental burst of 4 beats)
1 * DMA_SxCR_PBURST_0 | // 01: INCR4 (incremental burst of 4 beats)
//0 * DMA_SxCR_DIR_0 | // 00: Peripheral-to-memory
1 * DMA_SxCR_MINC | //инкремент памяти
2 * DMA_SxCR_MSIZE_0 | //длина в памяти - 32 bit
2 * DMA_SxCR_PSIZE_0 | //длина в DR - 32 bit
//1 * DMA_SxCR_CIRC | //циклический режим не требуется при DBM
2 * DMA_SxCR_PL_0 | // Priority level - High
0 * DMA_SxCR_CT | // M0AR selected
//0 * DMA_SxCR_DBM | // double buffer mode seelcted
0;
}
else
{
// Write to SD CARD

//DMA2_Stream6->NDTR = (DMA2_Stream6->NDTR & ~ DMA_SxNDT) |
// (length0 * count * DMA_SxNDT_0); // Особый случай - регистр игнорируется. В примерах от ST пишется 1

DMA2_Stream6->FCR =
1 * DMA_SxFCR_DMDIS | // use FIFO mode
1 * DMA_SxFCR_FTH_0 | // 01: 1/2 full FIFO (changed from read !)
0;

DMA2_Stream6->CR =
1 * DMA_SxCR_DIR_0 | // 01: Memory-to-peripherial
ch * DMA_SxCR_CHSEL_0 | // канал
1 * DMA_SxCR_PFCTRL | // 1: The peripheral is the flow controller (required for SDIO/SDMMC connected DMA)
0 * DMA_SxCR_MBURST_0 | // 00: single transfer (changed from read !)
1 * DMA_SxCR_PBURST_0 | // 01: INCR4 (incremental burst of 4 beats)
//0 * DMA_SxCR_DIR_0 | // 00: Peripheral-to-memory
1 * DMA_SxCR_MINC | //инкремент памяти
0 * DMA_SxCR_MSIZE_0 | //длина в памяти - 8 bit (changed from read !)
2 * DMA_SxCR_PSIZE_0 | //длина в DR - 32 bit
//1 * DMA_SxCR_CIRC | //циклический режим не требуется при DBM
2 * DMA_SxCR_PL_0 | // Priority level - High
0 * DMA_SxCR_CT | // M0AR selected
//0 * DMA_SxCR_DBM | // double buffer mode seelcted
0;
}

DMA2->HIFCR = (DMA_HIFCR_CTCIF6 /*| DMA_HIFCR_CTEIF6 */); // Clear TC interrupt flag соответствующий stream
//DMA2_Stream6->CR |= (DMA_SxCR_TCIE /* | DMA_SxCR_TEIE */); // разрешить прерывания от DMA по TC и TE

DMA2_Stream6->CR |= DMA_SxCR_EN;


Сообщение отредактировал IgorKossak - Jul 26 2017, 19:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 26 2017, 19:24
Сообщение #3


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Спасибо, попробую.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 27 2017, 08:20
Сообщение #4


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Трудно там разобраться, тем более что L4 и F4 немного отличаются (напрмиер каналы DMA).
Может есть у кого именно для L4?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 27 2017, 08:57
Сообщение #5


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Да, у L проще... так попробовали бы по аналогии... Главные вещи - едигичка в регистре длины, размеры данных у источника-получателя.

Сообщение отредактировал Genadi Zawidowski - Jul 27 2017, 08:57
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 27 2017, 11:34
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Genadi Zawidowski, а зачем разные размеры источника и приемника при записи? Вот тут:

0 * DMA_SxCR_MSIZE_0 | //длина в памяти - 8 bit (changed from read !)
2 * DMA_SxCR_PSIZE_0 | //длина в DR - 32 bit

У меня везде стоит по 32бита. Кстати в регистр длины в принципе можно писать что угодно, после начала работы DMA он сбросится в 0xFFFF об этом прямо указано в доках.

Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 27 2017, 11:41
Сообщение #7


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Там было много непонятного... много казалось бы разумного отсеялось.. осталось то что совпало с примером от ST. Когда оно заработало, я не трогал... Вохможно тут и 32 бита можно.
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 27 2017, 11:49
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(Genadi Zawidowski @ Jul 27 2017, 14:41) *
Там было много непонятного...

По этой причине я написал по докам с нуля. Хотя поковыряться пришлось тоже - забыл вначале Hardware Flow Control включить sm.gif.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 27 2017, 11:58
Сообщение #9


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Если посмотришь, у меня только инициализация DMA стянута. Остальное тоже только по докам. Сперва вообще запускал на Ренесансе по усеченной документации... Потом уже на STM32F.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 27 2017, 14:46
Сообщение #10


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

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



Цитата(Шаманъ @ Jul 27 2017, 16:34) *
Genadi Zawidowski, а зачем разные размеры источника и приемника при записи? Вот тут:

0 * DMA_SxCR_MSIZE_0 | //длина в памяти - 8 bit (changed from read !)
2 * DMA_SxCR_PSIZE_0 | //длина в DR - 32 bit

У меня везде стоит по 32бита. Кстати в регистр длины в принципе можно писать что угодно, после начала работы DMA он сбросится в 0xFFFF об этом прямо указано в доках.

А, тут не всё так просто. Вот, почитайте эту тему, я там походил по граблям...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 27 2017, 18:53
Сообщение #11


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



У L4, как я понял. в DMA нет барста, поэтому так выравнивать не надо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 27 2017, 19:43
Сообщение #12


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

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



Дело не только и не столько в burst, сколько в пословном доступе к невыровненным данным. Этого, думаю, и L4 не любит.
(FatFs при определённых условиях вызывает функцию записи блока с адресом буфера, не кратным 4).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Jul 27 2017, 20:03
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839



Цитата(AHTOXA @ Jul 27 2017, 17:46) *
А, тут не всё так просто. Вот, почитайте эту тему, я там походил по граблям...

У меня такого не может произойти - доступ всегда по выровненным адресам.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 28 2017, 17:06
Сообщение #14


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Используя у себя FatFs R0.12b, дорабатывал напильником выравнивание члена buf структуры FIL и win в структуре FATFS - перестали идти невыровненные обращения. Мне это требовалось еще и для нормальной работы DATA CACHE процессоров, вернее чтобы FatFs работал при наличии DCache. Все это есть в проекте.

Сообщение отредактировал Genadi Zawidowski - Jul 28 2017, 17:07
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 28 2017, 19:28
Сообщение #15


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

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



Выравнивание buf структуры FIL не помогает, всё равно FatFs при определённых условиях передаёт в функцию записи блока невыровненный указатель. Почитайте по моей ссылке. Но у вас доступ DMA к памяти побайтный (0 * DMA_SxCR_MSIZE_0), поэтому не страшно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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