Jump to content

    

STM32F407 и FSMC проблемы

Добрый день.

Сделали небольшую плату на базе видеоконтроллера EPSON S1D13746, управление и посылка данных идёт в параллельном 8-битном режиме, в качестве хоста отладочная плата STM32F4-discovery и её FSMC.

 

p0.jpg.963516cda590f0253090b891d04e7b4f.jpg

 

Микросхема инитится нормально, марка чипа, его ревизия и конфигурация считываются верно (через внутренние регистры S1D13746  [00h], [02h]).

Видеорежим  также устанавливается корректно - размер входного буфера 400x240, формат RGB 3:3:2, TV композит,  выходной буфер 400x240, смещения по X,Y: =0.

Проблемы возникают при записи в видеопамять. Часть данных почему-то пропускаются, из-за этого вертикальные полосы перекручиваются.

Если циклически перезаписывать, то полосы будут плыть.

 

p1.jpg.c7e4ca8f212b9d4ac0ed3a9d31c56d16.jpg

 

А должны быть ровные вертикальные полосы.

Пытался играться с параметрами FSMC, вставлять задержки, уменьшать тактовую частоту STM32 - не помогает (улучшения были, но идеально ровных полос добиться не удалось).

 

Подозреваю что :

1) неверно выставлены тайминги FSMC

2) шумные линии  портов STM32

3) недопустимо малый Data Hold (данные должны писаться по нарастанию (фронту)   строба записи WR)

4) данные должны записываться в микросхему бурстами - с опущенным CS, а я подозреваю что CS в STM32 дёргается каждую запись байта

5) звон в линиях шины.  Плата видеоконтроллера соединена к STM32 длинным проводом.  Если нужны резисторы 33-47 Ом, то где?  возле STM или S1D13746 ?

 

p2.jpg.ae52cbba621e93ccafae877d10162cbe.jpg

 

Ранее игрался с многими LCD, также подлключал - проблем с бОльшим числом LCD не было.

Как побороть ?

 

Код инита GPIO и FSMC:

 

Spoiler

#include "STM32F4.h"

void GPIO(void)
{
 GPIO_InitTypeDef gpio;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE,ENABLE);

 //TV
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); // D0
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); // D1
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource0 ,GPIO_AF_FSMC); // D2
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource1 ,GPIO_AF_FSMC); // D3
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource7 ,GPIO_AF_FSMC); // D4
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource8 ,GPIO_AF_FSMC); // D5
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource9 ,GPIO_AF_FSMC); // D6
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); // D7
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); //A16 => D/C
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource7 ,GPIO_AF_FSMC); //NE1 => !CS
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource4 ,GPIO_AF_FSMC); //NOE => !RD
 GPIO_PinAFConfig(GPIOD,GPIO_PinSource5 ,GPIO_AF_FSMC); //NWE => !WR

 gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_11|GPIO_Pin_14|GPIO_Pin_15;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_100MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);

 gpio.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_100MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOE,&gpio);

 //TV !RS B11
 gpio.GPIO_Pin=GPIO_Pin_11;
 gpio.GPIO_Mode=GPIO_Mode_OUT;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOB,&gpio);

 //LED ORANGE
 gpio.GPIO_Pin=GPIO_Pin_13;
 gpio.GPIO_Mode=GPIO_Mode_OUT;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);

 //LED GREEN
 gpio.GPIO_Pin=GPIO_Pin_12;
 gpio.GPIO_Mode=GPIO_Mode_OUT;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);
}

void FSMC(u8 as,u8 ah,u8 ds)
{
 FSMC_NORSRAMTimingInitTypeDef fsmcTiming;
 FSMC_NORSRAMInitTypeDef fsmc;

 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);

 fsmcTiming.FSMC_AddressSetupTime=as;
 fsmcTiming.FSMC_AddressHoldTime=ah;
 fsmcTiming.FSMC_DataSetupTime=ds;
 fsmcTiming.FSMC_BusTurnAroundDuration=0;
 fsmcTiming.FSMC_CLKDivision=0;
 fsmcTiming.FSMC_DataLatency=0;
 fsmcTiming.FSMC_AccessMode=FSMC_AccessMode_A;

 fsmc.FSMC_Bank=FSMC_Bank1_NORSRAM1;

 fsmc.FSMC_DataAddressMux=FSMC_DataAddressMux_Disable;

 fsmc.FSMC_MemoryType=FSMC_MemoryType_SRAM;

 fsmc.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_8b;

 fsmc.FSMC_BurstAccessMode=FSMC_BurstAccessMode_Disable;

 fsmc.FSMC_WaitSignalPolarity=FSMC_WaitSignalPolarity_Low;

 fsmc.FSMC_WrapMode=FSMC_WrapMode_Disable;
 fsmc.FSMC_WaitSignalActive=FSMC_WaitSignalActive_BeforeWaitState;

 fsmc.FSMC_WriteOperation=FSMC_WriteOperation_Enable;

 fsmc.FSMC_WaitSignal=FSMC_WaitSignal_Disable;
 fsmc.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;

 fsmc.FSMC_ExtendedMode=FSMC_ExtendedMode_Disable;
 fsmc.FSMC_WriteBurst=FSMC_WriteBurst_Disable;

 fsmc.FSMC_ReadWriteTimingStruct=&fsmcTiming;
 fsmc.FSMC_WriteTimingStruct=&fsmcTiming;

 FSMC_NORSRAMInit(&fsmc); 
 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);
}

 

 

Код инита видеоконтроллера S1D13746:

 

Spoiler

#include "Type.h"

#include "S1D13746.h"

#include "Picture.h"

#define TV_IN_WIDTH  400
#define TV_IN_HEIGHT 240

#define TV_POSITION_X 0
#define TV_POSITION_Y 0

#define TV_OUT_WIDTH  400
#define TV_OUT_HEIGHT 240

#define TV_I8  (*(IO  u8*)0x60000000) /* порт команд (индекс) */
#define TV_D8  (*(IO  u8*)0x60010000) /* порты аргументов (данные) */
#define TV_D16 (*(IO u16*)0x60010000)
#define TV_D32 (*(IO u32*)0x60010000)

#define TV_RST(x) GPIO_##x##Bits(GPIOB,GPIO_Pin_11)

void delay_ms(volatile u32 d)
{
 d*=45000; //-OSize -O3 @168 MHz
 while(d--);
}

void TV_Reset(void) //сброс
{
 TV_RST(Set);
 delay_ms(100);
 TV_RST(Reset);
 delay_ms(100);
 TV_RST(Set);
 delay_ms(100);
}

void TV_Out8(u8 i,u8 d)  //запись в регистр
{
 TV_I8=i;
 TV_D8=d;
}

u8 TV_In8(u8 i) //чтение из регистра
{
 TV_I8=i;
 return TV_D8;
}

void TV_VSync(void)
{
 while((TV_In8(REGEC_NDP_CONTROL)&0x10)==0x10); //ждём пока входной буфер освободится
 while((TV_In8(REGEC_NDP_CONTROL)&0x20)==0x00); //ждём когда пойдёт обратный ход луча
}

#define BLACK   0x00
#define BLUE    0x03
#define GREEN   0x1C
#define CYAN    0x1F
#define RED     0xE0
#define MAGENTA 0xE3
#define YELLOW  0xFC
#define WHITE   0xFF

const u8 C[8]={BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,YELLOW,WHITE}; //массив цветов

void TV_Line(void) //вертикальные полоски
{
 TV_I8=REGA0_MEM_PORT_0;                                       //reg[A0h] - memory port
 for(u32 i=0;i<TV_IN_WIDTH*TV_IN_HEIGHT;i++)TV_D8=C[(i/50)&7]; //записываем в видеопамять (адрес увеличивается на 1 с каждой записью) 400/8=50
}

void TV_Init(void)
{
 TV_Out8(REG20_PLL_MDIVIDER,27-1);                   //27 MHz/27=1 MHz - используем кварц 27 МГц
 TV_Out8(REG2A_PLL_4,54-1);                          //1 MHz*54=54 MHz
 TV_Out8(REG2C_CLOCK_SRC,0x07);                      //fdds=PLL/2=27 MHz ftiming=PLL/2=27 MHz SYSCLK=PLL=54 MHz
 TV_Out8(REG2E_POWER_SAVE,0x00);                     //disable sleep & standby

 while((TV_In8(REG20_PLL_MDIVIDER)&0x80)!=0x80);     //wait PLL lock

 TV_Out8(REG4E_TV_DDS_1,0x00);                       //ftiming=27 MHz fdds=27 MHz
 TV_Out8(REG40_TV_DISPLAY,0x08);                     //NTSC M, Composite, no VBI
 TV_Out8(REG9E_DAC_REFERENCE,0x03);                  //IREF enable, VREF enable

 TV_Out8(REG60_INPUT_FORMAT,0x30);                   //YCbCr Offset, RGB 3:3:2
 TV_Out8(REG62_SPECIAL_FX,0x20);                     //static, double buffer disable, background image,pixel correction disable, transparent disable, 0 deg. rotation

 TV_Out8(REG64_WIN_HEIGHT_0,(u8)TV_IN_HEIGHT);       //Input Height
 TV_Out8(REG66_WIN_HEIGHT_1,(u8)(TV_IN_HEIGHT>>8));

 TV_Out8(REG68_WIN_WIDTH_0,(u8)TV_IN_WIDTH);         //Input Width
 TV_Out8(REG6A_WIN_WIDTH_1,(u8)(TV_IN_WIDTH>>8));

 TV_Out8(REG82_OUT_XSTART_0,(u8)TV_POSITION_X);
 TV_Out8(REG84_OUT_XSTART_1,(u8)(TV_POSITION_X>>8)); //Position X

 TV_Out8(REG86_OUT_YSTART_0,(u8)TV_POSITION_Y);
 TV_Out8(REG88_OUT_YSTART_1,(u8)(TV_POSITION_Y>>8)); //Position Y

 TV_Out8(REG8A_OUT_HEIGHT_0,(u8)TV_OUT_HEIGHT);      //Output Height
 TV_Out8(REG8C_OUT_HEIGHT_1,(u8)(TV_OUT_HEIGHT>>8));

 TV_Out8(REG8E_OUT_WIDTH_0,(u8)TV_OUT_WIDTH);        //Output Width
 TV_Out8(REG90_OUT_WIDTH_1,(u8)(TV_OUT_WIDTH>>8));

 TV_Out8(REGEC_NDP_CONTROL,0x2E);                    //ebable TE pin and VSync mode

 TV_Out8(REG80_DISPAY_MODE,0x04);                    //TV enable
}

int main(void)
{
 GPIO();
 FSMC(2,2,4);
 TV_Reset();
 TV_Init();
 while(1)
 {
  TV_VSync();
  TV_Line();
  delay_ms(100);
 }
}


 

 

 

 

Edited by __inline__

Share this post


Link to post
Share on other sites

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

Причем от количества полосок также зависит.

 

//const u8 C[8]={BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,YELLOW,WHITE};
//const u8 C[8]={BLACK,BLUE,BLACK,BLUE,BLACK,BLUE,BLACK,BLUE};
const u8 C[8]={GREEN,BLUE,GREEN,BLUE,GREEN,BLUE,GREEN,BLUE};

void TV_Line(void)
{
 TV_I8=REGA0_MEM_PORT_0;

 for(u32 i=0;i<TV_IN_WIDTH*TV_IN_HEIGHT;i++)
 {
  TV_D8=C[(i/(TV_IN_WIDTH/8))%8]; //вертикальные полосы
 }
}

 

Если брать такие цвета:

Quote

const u8 C[8]={BLACK,BLUE,BLACK,BLUE,BLACK,BLUE,BLACK,BLUE};

То будет нормально:

p3.jpg.a8aa5100ff501528a32f32e30aa48491.jpg

А если так:

Quote

const u8 C[8]={GREEN,BLUE,GREEN,BLUE,GREEN,BLUE,GREEN,BLUE};

То опять всё едет:

p4.jpg.c682b5c00a089bfd52e004ad77e14901.jpg

 

В каком направлении рыть?

Edited by __inline__

Share this post


Link to post
Share on other sites

раз синхронизация едет в зависимости от данных, то видимо определённые линии данных что-то наводят на клоки.

вместо проводов возьмите шлейф с достаточным количеством земляных линий особенно с обоих сторон от клока,

и OSPEEDR поменьше выставить, чтобы фронты помедленее были.

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

Share this post


Link to post
Share on other sites
2 hours ago, _pv said:

раз синхронизация едет в зависимости от данных, то видимо определённые линии данных что-то наводят на клоки.

вместо проводов возьмите шлейф с достаточным количеством земляных линий особенно с обоих сторон от клока,

и OSPEEDR поменьше выставить, чтобы фронты помедленее были.

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

Да, вы оказались правы.   Проблема была в наводках.  Поставил OSPEEDR  = 2 МГц на все линии (D0..D7,  WR, RD, CS, D/C, RESET) - всё заработало правильно с такими характеристиками:

Quote

CPU CLK=168 МГц

FSMC CLK=168 МГц

 fsmcTiming.FSMC_AddressSetupTime=2
 fsmcTiming.FSMC_AddressHoldTime=0
 fsmcTiming.FSMC_DataSetupTime=5

Особо критичными  к наводкам оказались стробы чтения и записи RD,WR:

//D0..D3
 gpio.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_14|GPIO_Pin_15;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);

 //D4..D7
 gpio.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOE,&gpio);

 //!CS D/C 
 gpio.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_11;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);

 //!RD !WR
 gpio.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
 gpio.GPIO_Mode=GPIO_Mode_AF;
 gpio.GPIO_Speed=GPIO_Speed_2MHz;
 gpio.GPIO_OType=GPIO_OType_PP;
 gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOD,&gpio);

И это меня огорчает. Так как 2 МГц сильно режут  скорость . 

 

Есть ли способ ускориться?   К примеру поставить резисторы на линиях? И что за шлейф с земляными линиями?  Использую цыетные макароны с "мамами" на концах.

 

Ещё момент,  STM32 питается от 3 В ровно,  а видео-плата от 3.3 В.  Могут ли из-за этого быть проблемы на шине?   Подтягивающие резисторы на линиях исправят ситуацию?

 

 

 

Edited by __inline__

Share this post


Link to post
Share on other sites
29 минут назад, __inline__ сказал:

И что за шлейф с земляными линиями?

Видимо имелся в виду плоский кабель с чередующими линиями "сигнал"-"GND". Т.е. - нечётные - сигнальные, чётные - GND.

Share this post


Link to post
Share on other sites

ну для данных не обязательно прям через одну землю пускать, данные уж как-нибудь устаканятся к моменту защелкивания. хотя хуже от этого конечно не будет.

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

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

помимо удлиннения фронтов линий данных, чтобы они на стобы меньше наводили, можно на стробы повесить небольшую ёмкость ~100пФ или даже больше, пока у stm32 силёнок будет хватать её раскачать на заданной частоте (стробам для этого скорость фронтов в OSPEEDR можно и повысить). Эти 100пФ емкостную же наводку от соседей соответственно поделит.

А вот когда повысите частоту и "звенеть" в линии строба начнёт не зависимо от данных, можно туда со стороны STM32 последовательно Ом 50 воткнуть.

Share this post


Link to post
Share on other sites

Надо поставить буферную микросхему на данные и клоки. Резисторы до и после - по вкусу.

Я так 40МГц видео гонял на 50см через шлейф.

 

А плывёт всё - потому что производители МК и ЦСП не делают ре-синхронизацию по строчной и кадровой в своих IP...

Share this post


Link to post
Share on other sites

Спасибо всем ответившим.  Позже попробую поиграться ещё с шиной FSMC.  

 

На всякий случай добавлю, что данные передаются через FSMC по 8-битной шине (i8080), а не как в LTDC.   Тоесть контроллер передаёт исключительно байты данных, и делать он может в любое время (желательно во время VBlank, такую возможность тоже проверил).  Тоесть развёрткой занимается видео-чип S1D13746  со своего внутреннего буфера (двойная буферизация также есть!) .

 

Протестировал на различных эффектах (задаются коэффициентами матричного фильтра 3x3, типа шейдер???):

 

Муары и чёрные полосы  на ТВ - из-за съёмки на цифровую камеру.

 

orig.thumb.jpg.7bfa3f0afc4ae507e30043c7439147e7.jpgsharpn.thumb.jpg.c0992fcf8b0f51a64e99dbc9a7ac0285.jpg

sepia.thumb.jpg.3c42ff1ef88989def223b3b20b9b5c03.jpgsketch.jpg.b49661e8715ee41a78641c78a22d74e7.jpg

emboss.thumb.jpg.6408b980ba127eb8adad2f595fc2ab35.jpgedge.thumb.jpg.910d70d3a806070609f9ebfc36c6a591.jpgbump.jpg.ca5df6bd8cd11ba6587ab089da6ad1ee.jpg

 

eee.thumb.jpg.0bbaab3164e72a3bab59dd81fce52ff3.jpg

 

 

+ цвет прозрачности

+ отдельные окна (поверх экрана)

 

 

 

Edited by __inline__

Share this post


Link to post
Share on other sites

Проделал опыт.  Стробу записи выставил OSPEEDR  =100 МГц.  Остальные линии оставил 2 МГц.  Кадр стало сильно кривить, что и ожидалось.  Далее разлепил провод строба отдельно от всех - проверил:  кривить стало меньше.   Дальше  надел ферритовую втулку возле платы видеоконтроллера - кадр встал ровно.

 

Интересно, если взять не STM32F407, а другие контроллеры типа C6745 или Blackfin, то там тоже будут шумы?   Или независимо от типа процессора, из-за хреновых трасс - макарон, висящих в воздухе без земляной подложки будут наводки?   Всё-же проводники с переменным током висящими в воздухе без земли хорошо излучают и наводят кросс-толки в соседних.

 

В релизной плате естественно будут трассы с 50 Ом (обеспечится толщиной проводника и расстоянием до земляного полигона).

 

Видео работы видеоконтроллера  S1D13746  в действии:   https://www.youtube.com/watch?v=BTvHQIGyZ54

Edited by __inline__

Share this post


Link to post
Share on other sites

Продолжил эксперименты.

 

Добавлял на стробы близко в видео-плате конденсаторы на землю 331 пФ, 100 пФ, 33 пФ, 22 пФ, 11 пФ.   Большие ёмкости до 33 пФ заваливают обмен данными вообще, чип даже не инитится.  А малые ёмкости ничего не дают.  Попутно заметил, что если второй вывод конденсатора подключить не к GND, а сжать пальцами, то обмен данными будет великолепным!

 

Удалось поставить OSPEEDR  =100 МГц   абсолютно всем линиям (D0-D7, !RD, !WR, D/C, !CS)  и ко входам видео-платы напаять резисторы 470 Ом - 1,5 кОм - всё отлично работает.  

Удалось укоротить времянки на 33% (на 1/3).

 

Есть подозрение, что либа плата дискавери звенит, либо звенит питание с USB компа, либо радио- клавиатура и мышь сбивают ))

 

 

 

Edited by __inline__

Share this post


Link to post
Share on other sites

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

Эти ваши китайские проводки для макеток бывают с очень хреновым качеством обжима...

Share this post


Link to post
Share on other sites
17 hours ago, esaulenka said:

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

Эти ваши китайские проводки для макеток бывают с очень хреновым качеством обжима...

Кастомизирую обжимы сам вручную. Все контакты заходят с трением. А также звоню тестером все линии. На счёт земли надо попробовать.

 

Меня устраивает вариант к которому я пришёл - резисторы 200 Ом - 1 кОм возле контактов видео-платы. Не глючит и времянки ускорил.

В релиз пойдёт одна плата - где будет распаяно всё и соединено кратчайшим путём и Z ~ 50 Ом.

 

Вот что вышло:

 

tv2.jpg.3d93b00eb7b1bb9dfe76c8b14e0916df.jpg

 

 

Spoiler

 

 

Исходники программы:

 

S1D13746 Demo.rar

 

Keil ARM 4.74

 

 

Таблица соединений:

 

Connect.gif.eff84a7ab41da0e1f8b87f4429f852ef.gif

 

Результат:

 

birds256x192.thumb.png.530387cdc7f1b5b5162870c03a83f944.png

Edited by __inline__

Share this post


Link to post
Share on other sites
On 9/15/2019 at 3:11 AM, esaulenka said:

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

Эти ваши китайские проводки для макеток бывают с очень хреновым качеством обжима...

 

Укоротил питание и GND насколько возможно.  Вышло так (питание: провода со скотчем):

 

1.thumb.jpg.aab7f853670ec96df81332d1e46fda38.jpg

 

Общая картина такая:

 

2.jpg.c8f179027b90765c0e656f5d51663689.jpg

 

Были времянки FMC такие:

  AttSpaceTiming.SetupTime     = 0;
  AttSpaceTiming.WaitSetupTime = 8;
  AttSpaceTiming.HoldSetupTime = 0;
  AttSpaceTiming.HiZSetupTime  = 0;

 

Стали такими:

  ComSpaceTiming.SetupTime     = 0;
  ComSpaceTiming.WaitSetupTime = 3;
  ComSpaceTiming.HoldSetupTime = 0;
  ComSpaceTiming.HiZSetupTime  = 0;

 

Причём  исправно работает и на  GPIO_SPEED_FREQ_VERY_HIGH !!!

 

Вышло 144 кадра в секунду (это "грязный" FPS вместе с логикой игры) - 256x256 2 байта на точку:

https://www.youtube.com/watch?v=mRE5ak_Qw5g

 

Попутно растянул на весь экран (VSync включен, принудительно60 FPS):

https://www.youtube.com/watch?v=HTyDnkViiIE

 

3.jpg.f7eb54ef8d64f581a0bd0cb67e44bfa7.jpg

 

Не могу сообразить как посчитать байтовую скорость (байт в секунду).   В даташите на STM32H743 не совсем понятно написано, какие времянки надо считать с +0 , с +1 и с +2:

 

4.jpg.ecf447a10a334f700c0e9a026c8e146c.jpg

 

5.jpg.3082dce54a06d0ca62d179445bdb618d.jpg

 

И что идёт уже сюда: ?

  ComSpaceTiming.SetupTime    
  ComSpaceTiming.WaitSetupTime
  ComSpaceTiming.HoldSetupTime
  ComSpaceTiming.HiZSetupTime 

 

Как посчитать байтовую скорость (байт в секунду) ?

 

Edited by __inline__

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
10 минут назад, __inline__ сказал:

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

Никто не понял вопроса: что именно нужно считать??? и по каким исходным данным? Сформулируйте вопрос яснее. Так, как будто задаёте его другому человеку, а не самому себе. :wink:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this