Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Не могу найти документацию по RGB-LED модулю P4

Ср апр 14, 2021 19:26:29

Купил на али вот такой модуль. У меня уже был опыт работы с монохромным P10, думал, что здесь так же просто. А оказалось все не так. Распиновку обнаружил и появилась уйма вопросов: судя по данным из интернетов, дисплей делится на две половинки, а каждая из них — на 2⁴=16 блоков (в отличие от монохромных, где было одно целое и 4 блока). Не нашел даже схемы, в каком порядке загораются пиксели. Я уж молчу о временных диаграммах! В найденных даташитах есть лишь физические данные, ничего о подробном описании протокола и особенностей адресации нет.
В общем, меня как будто бы в гугле забанили: на запросы "P4 led module protocol" и "p4 led module pinout" вылезает всякий разнообразный абдуриновский бред. А я хочу при помощи DMA по таймеру дрыгать ногами, отправляя 6 битов данных за раз. (жаль, конечно, что так через одно место китайцы все сделали, лучше бы напаяли 100500 сдвиговых регистров, чтобы по SPI можно было за один присест отправить данные на весь экран целиком).

Re: Не могу найти документацию по RGB-LED модулю P4

Пт апр 16, 2021 02:22:40

P10, P4 и т.д. это всего лишь сокращение от pitch 10 mm, pitch 4 mm и т.д. Искать способы коммуникации со светодиодной панелью исходя из расстояния между светодиодами - смело. Но, видимо, не очень эффективно :rofl:
Возможно, если внимательно осмотреть плату Вашего модуля, на ней будет написано что-то вроде hub75e или hub75f - это название интерфейса. Его-то и нужно было просить у гугла ;) На монохромную панельку не похоже, наверное, потому что у неё hub12 написано на плате ;)

Re: Не могу найти документацию по RGB-LED модулю P4

Вс апр 18, 2021 22:12:31

На панели ничего, что могло бы натолкнуть на протокол, не написано. Мне подсказали в ЖЖ, что скорей всего, у нее HUB75E.
Попробовал, набросал пробный код. Однако, вместо того, чтобы получить вертикальные линии, вижу вот такую жесть!

Схему панели в интернете найти не смог. Я вообще не понимаю, что происходит! Может, нужно поставить буферные мосфеты и дергать управляющие электроды пятью вольтами, а не 3.3В? Или же китаец подсунул фуфло?

Re: Не могу найти документацию по RGB-LED модулю P4

Вс апр 18, 2021 23:35:37

Ваш пробный код сложночитаем, имхо нет смысла разбираться с ним, намного проще рассказать Вам, как должно быть :)
Первая попавшаяся мне в гуглокартинках фоточка интерфейсного разъёма:
https://4.bp.blogspot.com/-P3auvkuEEO4/ ... necotr.jpg
Делать ннада так:
1) ставим на R1R2G1G2B1B2 интересующий нас цвет. Для начала, к примеру, 0xFFFFFF upd: сорри, размечтался чот ;) 111111, конечно же :)
2) подаём стробирующий импульс на CLK. Таким образом мы фиксируем цвет первой точки в строке (полустроке, четвертьстроке, и т.д. - в зависимости от организации матрицы)
3) повторяем пп 1, 2 необходимое количество раз (опять же, зависит от организации матрицы)
4) ставим на выводах ABCDE разъёма адрес (порядковый номер) строки. Тут опять же могут быть варианты, зависящие от организации матрицы.
5) подаём стробирующий импульс на LAT
6) ...
7) профит!
По поводу "буферных мосфетов" и согласования уровней - у Вас повторяющаяся картина, хоть и не та, которой Вы ждёте, очевидно :) Следовательно, с большой вероятностью, ошибка в логике. Я бы для Вашей матрицы сделал примерно так: записывал бы 128 пикселей в строку (это 2 строки физически на Вашей матрице получатся), затем подавал бы адреса по порядку 0, 1, 2 и т.д. до 16. И смотрел бы, что выходит. если заливка хоть в каком-то виде начнёт получаться - пол-экрана по вертикали зальётся, или с каким-нибудь чередованием белые/чёрные полосы - выставлял бы разные цвета для различных строк, так выяснил бы порядок расположения строк на дисплее. Ну, и т.д., метод тыка - самый могучий метод в мире :)
А, про пункт 0 чуть не забыл - подать питание, прижать OE к земле... ;)

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 00:00:03

Все ноги настроены в режиме push-pull, логика от ряда к ряду не меняется. Я даже пробовал один и тот же буфер передавать все 16 раз. И все равно картина была абсолютно той же самой! Попробовал поменять режим ШИМ (у меня это режим 2: 0->1, но так стало еще хуже, т.е. явно клоку нужен нарастающий фронт).
Пока что единственное, что приходит на ум — уровни нужно разогнать до пяти вольт. Т.е. поставить буферы, преобразующие уровень.
Отложу пока в долгий ящик. А там, глядишь, напаяю буферы и проверю. Правда, в этом случае характеристики станут еще хуже, вряд ли получится хотя бы 300fps получить на трехбитном цвете…

Добавлено after 2 minutes 38 seconds:
Вот, как у меня настройки выполнены. GPIO:
Код:
static inline void gpio_setup(){
    // Enable clocks to the GPIO subsystems, turn on AFIO clocking to disable SWD/JTAG
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
    // turn off JTAG (PB3/4 is in use)
    AFIO->MAPR = AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
    // turn off USB pullup
    USBPU_OFF();
    // Set led as opendrain output
    GPIOC->CRH = CRH(13, CNF_ODOUTPUT|MODE_SLOW);
    // SCREEN color PINs: PA0..PA5
    GPIOA->CRL = CRL(0, CNF_PPOUTPUT|MODE_FAST) | CRL(1, CNF_PPOUTPUT|MODE_FAST) | CRL(2, CNF_PPOUTPUT|MODE_FAST) |
                 CRL(3, CNF_PPOUTPUT|MODE_FAST) | CRL(4, CNF_PPOUTPUT|MODE_FAST) | CRL(5, CNF_PPOUTPUT|MODE_FAST);
    // USB pullup - opendrain output
    GPIOA->CRH = CRH(15, CNF_PPOUTPUT|MODE_SLOW);
    // A..D, LAT, nOE: PB4..PB9
    GPIOB->CRL = CRL(4, CNF_PPOUTPUT|MODE_FAST) | CRL(5, CNF_PPOUTPUT|MODE_FAST) | CRL(6, CNF_PPOUTPUT|MODE_FAST) | CRL(7, CNF_PPOUTPUT|MODE_FAST);
    GPIOB->CRH = CRH(8, CNF_PPOUTPUT|MODE_FAST) | CRH(9, CNF_PPOUTPUT|MODE_FAST);
}

Таймер с DMA:
Код:
static inline void tim_setup(){
    SET(nOE); // turn off output
    GPIOA->CRL |= CRL(6, CNF_AFPP|MODE_FAST);
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
    // 72MHz & 7ARR = 9MHz
    TIM3->PSC = 20000;
    TIM3->ARR = 7;
    TIM3->CCMR1 = TIM_CCMR1_OC1M; // PWM mode 2 (inactive->active)
    //TIM3->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM mode 1 (active->inactive)
    TIM3->CCER = TIM_CCER_CC1E; // output 1 enable
    TIM3->DIER = TIM_DIER_UDE; // enable DMA requests
    RCC->AHBENR |= RCC_AHBENR_DMA1EN;
    // memsize 32bit, periphsize 32bit, memincr, mem2periph, full transfer interrupt
    DMA1_Channel3->CCR = DMA_CCR_PSIZE_1 | DMA_CCR_MSIZE_1 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
    DMA1_Channel3->CMAR = (uint32_t)dmabuf;
    DMA1_Channel3->CPAR = (uint32_t)&GPIOA->BSRR;
    NVIC_EnableIRQ(DMA1_Channel3_IRQn);
}

Ну и передача данных:
Код:
static uint8_t blknum_curr = 0;
void TIM_DMA_transfer(uint8_t blknum){
    TIM3->CR1 = 0; // turn off timer
    transfer_done = 0;
    COLR_port->BSRR = dmabuf[0];
    DMA1_Channel3->CNDTR = SCREEN_WIDTH;
    DMA1_Channel3->CCR |= DMA_CCR_EN; // start DMA
    TIM3->CCR1 = 4; // 50% PWM
    TIM3->CR1 = TIM_CR1_CEN; // turn on timer
    blknum_curr = blknum;
}

void dma1_channel3_isr(){
    TIM3->CR1 |= TIM_CR1_OPM; // set one pulse mode to turn off timer after last CLK pulse
    DMA1_Channel3->CCR &= ~DMA_CCR_EN; // stop DMA
    while(TIM3->CNT < 7);
    SET(nOE); // clear main output
    ADDR_port->ODR = (ADDR_port->ODR & ~(ADDR_pin)) | (blknum_curr << ADDR_roll); // set address
    SET(LAT); // activate latch
    DMA1->IFCR = DMA_IFCR_CGIF3;
    transfer_done = 1;
    CLEAR(LAT);
    CLEAR(nOE); // activate main output
}

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 00:04:35

не-не-не, не сдаёмся! :) я посмотрел на видос ещё раз - там всё чуть сложнее получается
У Вас кагбэ две матрицы составные. И R1G1B1 - цвет точки на первой матрице, а R2G2B2 - на второй. Т.е. нужно строку делать из 64-х тактов CLK, а если надо один пиксел зажечь - ставить 101010 на R1R2G1G2B1B2. R1G1B1 N-я точка, R2G2B2 - N+64-я. Чуть сумбурно получилось, но я надеюсь, Вы поймёте, о чём я :)

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 00:18:08

И R1G1B1 - цвет точки на первой матрице, а R2G2B2 - на второй.

Нет, первый канал - строка из верхней половины, вторая - из нижней (на 16 строк ниже). Это я уже экспериментальным путем понял.
Иначе столбцы бы вообще не горели.

Здесь именно похоже на шум в стробе: иногда проскакивают "духи", а строки сдвигаются. Посмотрю завтра осциллограммы стробирующего импульса.

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 00:27:32

Нет, первый канал - строка из верхней половины, вторая - из нижней
ну, или так, да. А канал E адреса строк не используется? А он физически на землю притянут? Мошт, наводки какие ловит? По видосу такое ощущение, что 1 CLK лишний, что ли... Надо анализатором вешаться, и смотреть
UPD: чот я нипайму, а где CLK вообще в коде у Вас управляется?

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 00:45:25

Клок генерируется таймером - TIM3CH1 (ШИМ с заполнением 50%). По событию UEV таймера DMA отправляет очередную порцию данных цвета (через регистр BSRR), а после этого ШИМ-выход генерирует клок.

Re: Не могу найти документацию по RGB-LED модулю P4

Пн апр 19, 2021 23:29:09

Сейчас посмотрел осциллограмму, блок питания просто ужас что выдает на выходе! Вот, видимо, откуда и появились все эти мусорные точки. Поставил БП послабей (но не такой мусорный), уже почти никаких артефактов.
В общем, нужно тщательно фильтровать питание и таки спаять буфер, чтобы оно не пыталось "кормиться" от МК.

Добавлено after 8 hours 55 minutes 33 seconds:
В общем, решил проблему: распаял на макетке два буфера CD4050, а т.к. они всего лишь шестиканальные, 13-й канал (nOE) инвертировал на мосфете 2N7000 (с удивлением обнаружил, что хоть 7000 — самые поганые по силовым характеристикам, зато у них маленькая емкость затвора и они не заваливают фронты так, как более компактные мосфеты с меньшим Rdson).
Теперь никаких посторонних пикселей не вылезает. Правда, почему-то икран изредка мерцает. Непонятно, как это может быть, когда частота обновления кадров 77 в секунду (а сам кадр состоит из семи последовательных изображений - эдакий ШИМ на восемь уровней).
В ЖЖшке

Re: Не могу найти документацию по RGB-LED модулю P4

Ср апр 28, 2021 18:39:33

Сделал на этом модуле игры "змейка" и "тетрис" (пока в преальфа-стадии, надо там еще шрифт помельче нарисовать, чтобы надпись GAME over! Score:... влезала на экран, да и на бета-тестере — дочке — потренировать). Напишу в ЖЖ и выложу видео на тытрубу, как закончу.
Ответить