LINUX.ORG.RU

STM32 DMA SPI теряет данные

 ,


0

4

Суть проблемы в том, что при дебаге экран ILI9341 c STM32F100RB работает, а при передергивании питания нет. Если нажать ресет, то тоже всё отлично работает.

Вот скрин не рабочего (с верху) и рабочего (снизу) SPI

https://yadi.sk/d/muJdadmkwCnang

★★★

Дай повангую, у экрана есть «серая зона» после подачи питания, во время которой не следует пихать ему данные?

// По ссылке не ходил.

aol ★★★★★
()
Ответ на: комментарий от anonymous

что это означает?

Выключить питание и включить

AUX ★★★
() автор топика
Ответ на: комментарий от aol

после подачи питания, во время которой не следует пихать ему данные?

Задержка перед инициализацией SPI и DMA не помогают

AUX ★★★
() автор топика
Ответ на: комментарий от aol

Если захардкорить костыль типа:

for(int x=0; x<6;x++){
    dmaSendCmd(LCD_SLEEP_OUT);
    delay_ms(150);
    dmaSendCmd(LCD_DISPLAY_ON);
}
Оно конечно работает, но посаны говорят что это не выход.

AUX ★★★
() автор топика

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

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

Попробуй понизить частоту контроллера и посмотреть, что получится.

Пробовал и не помогло, тем более если после включения нажать кнопку ресет, то всё будет работать. Явно проблема с потерей первого байта в DMA или SPI. Почему, хз.

AUX ★★★
() автор топика
Ответ на: комментарий от CYB3R

Также пробовал подтягивать внешним резистором ноги SPI, не помогло.

AUX ★★★
() автор топика
Ответ на: комментарий от CYB3R

Также пробовал разные источники тактирования HSI и HSE, тоже не работает.

AUX ★★★
() автор топика

ну, раздел 12 жи..

12.Power ON/OFF Sequence

If RESX line is not held stable by host during Power On Sequence as defined in Sections 12.1 and 12.2, then it will be necessary to apply a Hardware Reset (RESX) after Host Power On Sequence is complete to ensure correct operation. Otherwise function is not guaranteed

ну, и там в окрестностях данной главы еще почитай.

aol ★★★★★
()
Ответ на: комментарий от AUX

@aol дело говорит.

Надо подать аппаратный ресет ногой RESX

RESX I MCU (VDDI/VSS) This signal will reset the device and must be applied to properly initialize the chip. Signal is active low.

shkolnick-kun ★★★★★
()
Последнее исправление: shkolnick-kun (всего исправлений: 2)
Ответ на: комментарий от shkolnick-kun

void ILI9341_Reset(void)
{
HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(LCD_CS_PORT, LCD_CS_PIN, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET);	
}

Вот так?

AUX ★★★
() автор топика
Последнее исправление: AUX (всего исправлений: 1)
Ответ на: комментарий от AUX

Я бы сделал так:

void ILI9341_Reset(void)
{
HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET);	
HAL_Delay(200);
}

А на самом деле - х.з., там от многих факторов питание может зависеть, надо подбирать задержку перед ILI9341_Reset и задержки внутри тоже

shkolnick-kun ★★★★★
()
Ответ на: комментарий от shkolnick-kun

Завтра попробую. Но почему костыль, работает?

for(int x=0; x<6;x++){
    dmaSendCmd(LCD_SLEEP_OUT);
    delay_ms(150);
    dmaSendCmd(LCD_DISPLAY_ON);
}
AUX ★★★
() автор топика
Ответ на: комментарий от deep-purple

А если x<2

Не работает

А delay_ms(10)

Не работает

Игрался с делеями, не влияет.

AUX ★★★
() автор топика
Последнее исправление: AUX (всего исправлений: 1)
Ответ на: комментарий от anonymous

Эдик опять забыл принять таблетки?

anonymous
()
Ответ на: комментарий от anonymous

Нет, это я для примера написал, а так я сраный СПЛщик и ЛЛщик.

AUX ★★★
() автор топика
Ответ на: комментарий от AUX

Но почему костыль, работает?

Забей и сделай тайминги и т.д. строго по даташиту. Пытаться понять разумом логику некоторых людей бесполезно. Недавно надо было запилить драйвер st7735 по DMA. Оказался раза в три меньше того что по интернетам гуляет.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 2)
Ответ на: комментарий от AUX

Фик знает. В нашем коде через HAL, там с DMA не накосячить особо https://github.com/puzrin/dispenser/blob/master/hal/stm32f072cb/st7735.cpp.

В новом проекте будет дисплей тоже на ILI9341, но пока платы приедут, пока отладим - месяца два. Прямо сейчас ничего более конкретного не могу сказать. Я бы грешил на тайминги на ресете, и возможно частоты шины если «провода» длинные.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Я на SPL пишу, могу завтра залить код на github.

AUX ★★★
() автор топика
Ответ на: комментарий от Harald

Даже указали на проблему - на ногу RESX. Но нет, делать по даташиту - не наш выбор.

anonymous
()
Ответ на: комментарий от AUX

Но почему костыль, работает?

Не документированные особенности контроллера.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от AUX

Смотри, что посылается по DMA, в софте логического анализатора должен быть десериализатор для SPI.

Да, команды обычно отправляются без DMA, по DMA только данные в видеопамять гоняются.

shkolnick-kun ★★★★★
()
Ответ на: комментарий от shkolnick-kun

Если послать 8 байт чего угодно перед тем как инициализировать экран, то все работает. Теряются при включении питания данные, в анализатор видно. Что это может быть?

AUX ★★★
() автор топика
Ответ на: комментарий от AUX

Теряются при включении питания данные, в анализатор видно. Что это может быть?

Если можешь сделать без задержек:

послать 8 байт чего угодно перед тем как инициализировать экран, то все работает.

То уже не важно!

shkolnick-kun ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.