Перейти к содержанию

STM32F4 DMA FIFO + SPI_TX = FIFO error, но работает


Дмитрий239

Рекомендуемые сообщения

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

Инициализация

    //Где-то там
    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);

Функции отправки

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 - без результата (Точнее результат - ошибка).

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Сначала надо разрешать ( EN ) DMA затем переферийное устройство.

If the user enables the used peripheral before the corresponding DMA stream, a “FEIF” 
(FIFO Error Interrupt Flag) may be set due to the fact the DMA is not ready to provide the 
first required data to the peripheral (in case of memory-to-peripheral transfer).

 

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

void ST7735s::startScreenUpdate()
{
    stopScreenUpdate();
    sendCommand(ST77XX_RAMWR);
    CS_Down();
    DC_Up();
    SPI2->CR1 &= ~SPI_CR1_SPE;
    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;
    __NOP();
    /*
    NDTR = 25'599   // (-1)
    FS[2:0] = 0b011 // 3/4
    FEIF4 = 1       // error
    */
    SPI2->CR1 |= SPI_CR1_SPE;
}

Модифицировал функцию: теперь перед запуском

  • отключаю SPI
  • включаю DMA
  • включаю SPI

Но в отладчике видно, что после включения DMA всё равно устанавливается флаг ошибки.

Передача работает. 

Также пробовал:

  • MSIZE[1:0] = 0b10 (32 bit)
  • MBURST[1:0] = 0b01 (incremental burst of 4 beats)

- так же ошибка.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В копилку:

На *H743 на DMA1 каналах 6/7 сделан прием/передача в UART. 

При этом, "передача" в UART так-же выставляет признак ошибки, а вот прием (DR -> mem) ошибок не вызывает.

Вариант: UART не может работать со скоростью DMA (физически не может, скорости "не те") а потому передача DMA mem->DR упирается в DR и ждет его готовности. DMA ждет, и заодно уж выставляя флаг ошибки, сообщая "меня тут тормознули". Понятно, что объяснение весьма натянутое и фривольное, но хоть что-то. IMHO

 

 

Ссылка на комментарий
Поделиться на другие сайты

Ё-моё

Меня, конечно, смущало полное отключение SPI, но я попытался.

Оказалось всё куда проще - отключать надо разрешение DMA на использование устройства

То есть 

SPI2->CR2 &= ~SPI_CR2_TXDMAEN;
DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2;
DMA1_Stream4->CR |= DMA_SxCR_EN;
SPI2->CR2 |= SPI_CR2_TXDMAEN;

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...