Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 25

STM32F4 SPI DMA FIFO. Ошибка FIFO, но передача происходит

10.04.2022, 14:47. Показов 1288. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей полностью закрашивается, но устанавливается флаг ошибки FIFO в регистрах DMA.
МК: STM32F401CEU6

Инициализация
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    //Где-то там
    alignas(32) uint16_t buff[80 * 160];
 
    // SPI init
    SPI2->CR1 |= (0b000 << SPI_CR1_BR_Pos) |
                 SPI_CR1_MSTR |
                 SPI_CR1_SSI | SPI_CR1_SSM;
    SPI2->CR2 |= SPI_CR2_TXDMAEN;
    SPI2->CR1 |= SPI_CR1_SPE;
 
    // DMA init
    DMA1_Stream4->CR |= (0b01 << DMA_SxCR_DIR_Pos) |
                        (0 << DMA_SxCR_CHSEL_Pos) |
                        (0b11 << DMA_SxCR_MBURST_Pos) |
                        DMA_SxCR_MINC;
 
    DMA1_Stream4->PAR = (uint32_t)&SPI2->DR;
    DMA1_Stream4->M0AR = (uint32_t)getBuffer();
 
    DMA1_Stream4->FCR &= ~DMA_SxFCR_FTH;
    DMA1_Stream4->FCR |= DMA_SxFCR_DMDIS;
    __DMB();
    DMA1_Stream4->FCR |= (0b11 << DMA_SxFCR_FTH_Pos);

Функции отправки
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void ST7735s::stopScreenUpdate()
{
    DMA1_Stream4->CR &= ~DMA_SxCR_EN;
    while (DMA2_Stream4->CR & DMA_SxCR_EN)
        ;
    CS_Up();
}
 
 
void ST7735s::startScreenUpdate()
{
    stopScreenUpdate();
    sendCommand(ST77XX_RAMWR);
    CS_Down();
    DC_Up();
    DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4;
    DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2;
    DMA1_Stream4->CR |= DMA_SxCR_EN;
}


После передачи устанавливается флаг ошибки работы FIFO-буфера в DMA. Флаг приходится сбрасывать вручную + ненормально это как-то. Ошибка, как-никак.
Выдержка из документации
Кликните здесь для просмотра всего текста

• FIFO error: the FIFO error interrupt flag (FEIFx) is set if:
– A FIFO underrun condition is detected
– A FIFO overrun condition is detected (no detection in memory-to-memory mode
because requests and transfers are internally managed by the DMA)
– The stream is enabled while the FIFO threshold level is not compatible with the
size of the memory burst (refer to Table 34: FIFO threshold configurations)


Недосдачи вроде как быть недолжно:
  • 80 пикселей * 160 пикселей * 2 байта = 25 600 байт. Итого, если я правильно понял логику, при размере пакета в 16 кусков, при размере куска = MSIZE = 1 байту, должно всё работать, т.к. конфигурации допустима + 25 600 байт ровно делиться на транзакции по 16 байт.
  • Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С делением на 16 заполняется лишь 1/16 часть дисплея.
  • Перезаписи (ovverun) тоже нет - все пиксели занимают свои места
  • Ошибок SPI нет
  • Выравнивание сделал с запасом. Пробовал ранее 4 - без результата (Точнее результат - ошибка ).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2022, 14:47
Ответы с готовыми решениями:

Пороговый уровень FIFO DMA
Потребовалась мне тут пакетная передача в DMA. Появился один вопросик. В RM0090 написано (регистр DMA_SxFCR): Здесь не ошибка...

Как правильно настроить FIFO в DMA?
В памяти лежит массив Half-wordов. Через DMA хочу передать его по UART. Соответственно в настройках DMA ставлю: ...

HAL SPI DMA(STM32F4) + WIZ550io
Здравствуйте! Нужна помощь в реализации функции приема-передачи данных по SPI через DMA канал с STM32F4Dyscovery на сетевой модуль...

2
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 906
Записей в блоге: 16
11.04.2022, 21:19
Цитата Сообщение от NPD Посмотреть сообщение
Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С
точно ? помоему там количество посылок указывается.. а что это будет - байты или полуслова - это уже DMA не касается
0
0 / 0 / 0
Регистрация: 13.11.2016
Сообщений: 25
11.04.2022, 23:49  [ТС]
C++
1
2
3
4
5
    SPI2->CR2 &= ~SPI_CR2_TXDMAEN;
    DMA1->HIFCR = DMA_HIFCR_CTCIF4;
    DMA1_Stream4->NDTR = WIDTH * HEIGHT;
    DMA1_Stream4->CR |= DMA_SxCR_EN;
    SPI2->CR2 |= SPI_CR2_TXDMAEN;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2022, 23:49
Помогаю со студенческими работами здесь

stm32f4 spi dma возврат HAL_BUSY
Привет. Столкнулся с проблемой передачи и приема данных по spi. Инициализация spi: void MX_SPI4_Init(void) { hspi4.Instance =...

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C1294
Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT. Необходимо управлять четырьмя приводами одновременно, для этого...

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C
Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT. Необходимо управлять четырьмя приводами одновременно, для этого...

Передача от клиента к серверу и от сервера к клиенту через канал fifo()
Всем привет. Мне нужно через канал fifo отправить от клиента к серверу строку, сервер должен записать ее с задом-наперед и передать ее к...

Ошибка открытия файла FIFO
Здравствуйте. Имеется такая задача: создать две программы, одна из которых принимает аргумент (строку), которую она должна передать в FIFO....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru