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

PriZraK

Участник
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Загрузка данных в EMMC

    Приветствую! Ситуация следующая: имеется плата, где МК (STM32H747) связан с ПЛИС, в которую нужно грузить битстрим из внешней флеш-памяти. На ПЛИСе для загрузки висит QSPI NOR, на контроллере же при этом распаяна микросхема EMMC. В общем, хочу попробовать загрузить битстрим в ПЛИС с помощью МК, используя память EMMC, но не знаю, как запихнуть туда битстрим... Можно ли через ST-Link закинуть данные напрямую в EMMC (не нашёл, где это делается в Utility)? Если нет, то каким образом ещё туда можно загрузить данные?
  2. Да, там несложно: один параметр в инициализации изменить нужно. Правда, почти все тайминги DSI также меняются... Запрашивал пример инициализации (сишный код). Там во всех структурах фигурирует название rockchip (типа rockchip.cmd_delay, rockchip.cmd_type, rockchip.dsi_id и т.д.). Может, конечно, они так шифруются... Но тут есть один момент. Производитель сказал, что в ближайшее время этот дисплей собираются обновлять. И в новой версии как раз будут менять контроллер...
  3. PH (Packet Header) зависит от типа передаваемого пакета (либо Short, либо Long). Если Short, то включает Data ID и сами данные. Всего в Short может быть до 9 байт. Если Long, в PH пишется Data ID и КОЛИЧЕСТВО передаваемых байт в PD (Packet Data). PD (Packet Data) используется в длинных посылках (Long Packets). Это просто массив передаваемых байт. Здесь могут быть как конфигурационные данные, так и поток пикселей. PF (Packet Footer) - 16-битный CRC. Добавляется в конце длинных посылок.
  4. Хм... а что собственно должно произойти? Скорость на шине просядет? Делаю вот так (изображение копируется из flash в sdram): lcd_picture(0, 720, 0, 1280, address_sdram); for (uint32_t i = 0; i < sizeof(HD_IMAGE) / 4; i++) { ((uint32_t*) (address_sdram + sizeof(HD_IMAGE)))[i] = ((uint32_t*)HD_IMAGE)[i]; } Всё норм.
  5. Вот он - COM50H5N03ULC. Числа для инициализации из даташита. Контроллер какой-то из Rockchip (точно не вычитывается). https://datasheet4u.com/datasheet-pdf/ORTUS/COM50H5N03ULC/pdf.php?id=1259015
  6. В общем, дисплей заработал. Основная проблема была именно в инициализации (пришлось даже с производителем пообщаться). Конфигурируем по DSI, изображение выводится через LTDC-функции, т.к. LTDC сам пинает DSI host. Т.е. "синхронизировать поток данных в режиме Video mode" (мой вопрос выше) не нужно. Оно само синхронизируется при правильной настройке. Пример инициализации: // 1_SETEXTC: DAT[0] = 0xFF; DAT[1] = 0x83; DAT[2] = 0x94; HAL_DSI_LongWrite(&hdsi, 0x00, 0x39, 0x03, 0xB9, DAT); // 2_SETPOWER: DAT[0] = 0x7C; DAT[1] = 0x00; DAT[2] = 0x24; DAT[3] = 0x06; DAT[4] = 0x01; DAT[5] = 0x10; DAT[6] = 0x10; DAT[7] = 0x26; DAT[8] = 0x2E; DAT[9] = 0x1D; DAT[10] = 0x1D; DAT[11] = 0x57; DAT[12] = 0x12; DAT[13] = 0x01; DAT[14] = 0xE6; DAT[15] = 0xE2; HAL_DSI_LongWrite(&hdsi, 0x00, 0x39, 0x10, 0xB1, DAT); // 3_SETDISP: DAT[0] = 0x00; DAT[1] = 0xC8; DAT[2] = 0x04; DAT[3] = 0x04; DAT[4] = 0x00; DAT[5] = 0x66; HAL_DSI_LongWrite(&hdsi, 0x00, 0x39, 0x06, 0xB2, DAT); // 4_INVOFF: HAL_DSI_ShortWrite(&hdsi, 0x00, 0x05, 0x20, 0x00); // 5_MADCTL: HAL_DSI_ShortWrite(&hdsi, 0x00, 0x15, 0x36, 0x00); ... Пример вывода изображения: HAL_LTDC_SetAddress(&hltdc, address, 0); // address - начало массива изображения. Например, в SDRAM bank 2 значение address находится в диапазоне: 0xD0000000 - 0xD3FFFFFF HAL_LTDC_SetWindowSize_NoReload(&hltdc, 720, 1280, LTDC_LAYER_1); HAL_LTDC_SetWindowPosition(&hltdc, 0, 0, LTDC_LAYER_1); Работает нормально (без видимых дефектов), но предел frame rate около 36 Гц. Если дать выше, изображение начинает "плыть". Это ограничение именно со стороны DSI host (там максимум pixel clock со стороны LTDC - 41,5 МГц при 24-битном соединении с DSI). Думаю, можно и Full HD подрубить герц на 15... Пример изображений:
  7. Думаю, как-то неправильно передаю данные. После конфигурации, которая происходит в LP state, нужно ли перезапускать DSI, т.к. данные должны передаваться именно в HS state? Или DSI сам определит по data type в HAL_DSI_LongWrite, что идёт pixel stream? Например, data type 0x3E соответствует Packed Pixel Stream, 24-bit RGB, 8-8-8 Format. В общем, кто-нибудь работал в режиме Video mode по DSI? Буду рад любому совету.
  8. Этот дисплей может работать и с двумя лейнами. В диапазон клока я попадаю (40 - 425 MHz DSIclk). Если правильно понимаю, то клок будет зависеть от фреймрейта. 60 Гц на STM32H747, конечно, не получить, но на кадров 30 рассчитывать можно.
  9. Приветствую! Имеется HD-дисплей (720x1280 Portrait) с интерфейсом DSI. Работает в режиме Video mode. Цепляюсь к нему с помощью STM32H747. Инициализацию провожу в LP state, как того требует даташит. Какой-то обмен проходит (смотрю осциллом), но вывести хоть что-то на дисплей не получается :( тестовый паттерн не работает (HAL_DSI_PatternGeneratorStart), изображение из буфера не выводится, закраска хотя бы небольшой области не происходит... в примерах нигде не видел разрешения больше, чем WVGA (800x480). HD вообще реально вывести? Как правильно синхронизовать поток данных в режиме Video mode? Я так понимаю, что это неверно: HAL_DSI_ShortWrite(&hdsi, 0x00, 0x01, 0x00, 0x00); // Начало вертикального участка HAL_DSI_ShortWrite(&hdsi, 0x00, 0x11, 0x01, 0x00); // Конец вертикального участка HAL_DSI_ShortWrite(&hdsi, 0x00, 0x21, 0x00, 0x00); // Начало горизонтального участка HAL_DSI_ShortWrite(&hdsi, 0x00, 0x31, 0x01, 0x00); // Конец горизонтального участка HAL_DSI_LongWrite(&hdsi, 0x00, 0x3E, 0xCFFF, 0x00, PICT); // Передача данных Хотя я пробовал по-разному, в том числе и через DMA2D (как в примерах) - безрезультатно :(
  10. STM32H743 FMC и PSRAM

    Полная шина данных - 32 провода. 64 тут нельзя...
  11. STM32H743 FMC и PSRAM

    Да, действительно, при 64-битном сборе данных пропускная способность удваивается, т.е. примерно 250 Мбит/с. Наверное, это максимум.
  12. STM32H743 FMC и PSRAM

    ПЛИС подключена как PSRAM. Интересует скорость обмена данными между микроконтроллером (STM32H743) и ПЛИС по параллельной шине. Как ни странно, но оказалось наоборот: до 50 МГц младшая часть данных приходит неправильная (0xFFFF), а после 50 (сейчас вообще гонит на 240 МГц) - всё правильно. Разве? FMC main features: 8-, 16-, or 32 bit wide data bus (из мануала). Мне не совсем понятно, что у PSRAM с BURST. Как я понял, его тут нет, но AXI у FMC 64-битная, т.е. за раз можно передать две 32-битные посылки. Или нет? А так пока скорость получается около 125 Мбит/с.
  13. STM32H743 FMC и PSRAM

    Такое ощущение, что не учитываю какое-то смещение в STM, т.к. с ПЛИС данные уходят правильные (смотрю встроенной илой). По адресу 0: отправляю 0x0000FFFF - приходит 0x0000FFFF. По адресу 1: отправляю 0x12345678 - приходит 0x12340000. По адресу 2: отправляю 0x87654321 - приходит 0x87655555. По адресу 3: отправляю 0xABCCBA00 - приходит 0xABCCFFFF. По адресу 4: отправляю 0x0000FFFF - приходит 0x0000FFFF.
  14. STM32H743 FMC и PSRAM

    Приветствую! Подключаю к H743 PSRAM, используя FMC (NOR/PSRAM/SRAM 1 Bank 1). Согласно мануалу данный PSRAM будет использовать следующее пространство адресов: 0x60000000-0x63FFFFFF. Шина полная, режим синхронный. FMC тактируется от PLL1Q (120 МГц, делитель для CLK равен 8), настраиваю из куба: /** Perform the SRAM1 memory initialization sequence */ hsram1.Instance = FMC_NORSRAM_DEVICE; hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE; /* hsram1.Init */ hsram1.Init.NSBank = FMC_NORSRAM_BANK1; hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; hsram1.Init.MemoryType = FMC_MEMORY_TYPE_PSRAM; hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_32; hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_ENABLE; hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW; hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE; hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE; hsram1.Init.WriteBurst = FMC_WRITE_BURST_ENABLE; hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY; hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE; hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE; /* Timing */ Timing.AddressSetupTime = 15; Timing.AddressHoldTime = 15; Timing.DataSetupTime = 255; Timing.BusTurnAroundDuration = 15; Timing.CLKDivision = 8; Timing.DataLatency = 2; Timing.AccessMode = FMC_ACCESS_MODE_A; Все сигналы выходят (CLK, данные, адрес, управление), но данные приходят не те... Синхронный режим описан следующим образом (в качестве PSRAM использую ПЛИС): ... SIGNAL adr_0 : STD_LOGIC_VECTOR(25 downto 0) := X"600000" & "00"; SIGNAL adr_1 : STD_LOGIC_VECTOR(25 downto 0) := X"600001" & "00"; SIGNAL adr_2 : STD_LOGIC_VECTOR(25 downto 0) := X"600002" & "00"; SIGNAL adr_3 : STD_LOGIC_VECTOR(25 downto 0) := X"600003" & "00"; SIGNAL ADDRESS_int : STD_LOGIC_VECTOR(25 downto 0) := (others => '0'); SIGNAL DATA_int : STD_LOGIC_VECTOR(31 downto 0) := (others => 'Z'); ... DATA_OUT: process (CLK) begin if falling_edge (CLK) then if (NE1 = '0') then if (NL = '0') then ADDRESS_int <= ADDRESS; else if (NOE = '0') then if (state = '0') then if (ADDRESS_int = adr_1) then DATA_int <= X"12345678"; elsif (ADDRESS_int = adr_2) then DATA_int <= X"87654321"; elsif (ADDRESS_int = adr_3) then DATA_int <= X"ABCDEF00"; else DATA_int <= X"FFFF0000"; end if; else if (ADDRESS_int = adr_1) then DATA_int <= X"11111111"; elsif (ADDRESS_int = adr_2) then DATA_int <= X"BBBBBBBB"; elsif (ADDRESS_int = adr_3) then DATA_int <= X"CCCCCCCC"; else DATA_int <= X"0000FFFF"; end if; end if; else DATA_int <= (others => 'Z'); end if; end if; else DATA_int <= (others => 'Z'); end if; end if; end process DATA_OUT; Сигнал "state" - нажатие кнопки со стороны ПЛИС. Данные кидаю в UART: DAT[0] = *(uint32_t*)0x60000000; DAT[1] = *(uint32_t*)0x60000004; DAT[2] = *(uint32_t*)0x60000008; DAT[3] = *(uint32_t*)0x6000000C; DAT[4] = *(uint32_t*)0x60000010; DAT[5] = *(uint32_t*)0x60000014; snprintf(UART_DATA, 39, "Data: \n\r%X\n\r", DAT[0]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); snprintf(UART_DATA, 39, "%X\n\r", DAT[1]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); snprintf(UART_DATA, 39, "%X\n\r", DAT[2]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); snprintf(UART_DATA, 39, "%X\n\r", DAT[3]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); snprintf(UART_DATA, 39, "%X\n\r", DAT[4]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); snprintf(UART_DATA, 39, "%X\n\r", DAT[5]); HAL_UART_Transmit(&huart1, (uint8_t*)UART_DATA, strlen(UART_DATA), 1000); Приходит следующее: 0xFFFF, 0, 0x5555, 0xFFFF, 0xFFFF, 0xFFFF. При этом реакции на "state" нет (всегда одно и то же). Полагаю, что есть какой-то рассинхрон... либо я что-то не так делаю с адресами. Кстати, я не использую сигнал WAIT, но вроде и без него должно заработать. И ещё не понимаю, как BURST задать. Настройка вроде есть, а количество где задаётся? В общем, наверняка кто-то стыковал STM с ПЛИС по параллельной шине. Буду рад любому совету.
×
×
  • Создать...