Forum: Digitale Signalverarbeitung / DSP / Machine Learning Blackfin: Spikes beim Umkonfigurieren der Timer


von Sebastian B (Gast)


Lesenswert?

Hi,

ich versuche schon recht erfolgreich mit dem PPI eines BF537 ein TFT LCD 
anzusteuern. Um die noetige lange Schwarzschulter nach dem VSYNC-Puls zu 
erzeugen benutze ich einen Interrupt der das PPI voruebergehend 
deaktiviert. VSYNC erzeuge ich mit einem eigenen Timer, PPI laeuft mit 
einem Framesync.

Beim Umkonfigurieren des Timers in der ISR bekomme ich immer wieder 
kurze Spikes die das Signal versauen. So sieht mein Code im Moment aus:
1
EX_INTERRUPT_HANDLER(ppi_dma0_isr) 
2
{
3
  uint16_t status = *pDMA0_IRQ_STATUS;
4
  
5
  *pDMA0_IRQ_STATUS |= DMA_DONE;    // acknowledge interrupt
6
7
  if((status & DMA_DONE) && !(status & DMA_RUN)) 
8
  {
9
    // DMA workload done
10
    
11
    *pTIMER_DISABLE = TIMDIS0|TIMDIS2;
12
    *pPPI_CONTROL &= ~PORT_EN;
13
    *pDMA0_CONFIG &= ~DMAEN;
14
    ssync();
15
    
16
    // generate V Front Porch
17
    *pTIMER1_CONFIG = CLK_SEL|TIN_SEL|IRQ_ENA|PULSE_HI|PERIOD_CNT|PWM_OUT;
18
    *pTIMER1_PERIOD = TFT_V_FRONT_PORCH * TFT_LINE;
19
    *pTIMER1_WIDTH  = *pTIMER1_PERIOD;
20
    *pTIMER_ENABLE = TIMEN1;
21
  }
22
  ssync();
23
}

Wie kann ich das besser machen?

Sebastian

von Strubi (Gast)


Lesenswert?

Hallo Sebastian,

ich weiss leider kein Heilmittel zu deinem Problem, aber es ist relativ 
"gefaehrlich", den PPI innerhalb der DMA IRQ service routine an & 
abzuschalten, da er noch ein kleines Hardware-FIFO enthaelt. Heisst, 
wenn der DMA0 IRQ auftritt, ist zwar der DMA-Transfer vorbei, aber 
womoeglich noch was im FIFO, wenn du den PPI deaktivierst.
Im Prinzip sollte es nicht noetig sein, den PPI abzuschalten. Bin mir 
aber noch nicht ganz sicher, ob ich richtig verstanden habe, wie dein 
TFT gefuettert werden will. Normalerweise muesste es ansich reichen, die 
HSYNC und VSYNC timings mit den Timern per PPI_FS1 / PPI_FS2 zu 
generieren, ohne "Gated clock".

Um den dauernden Datenfluss zu gewaehrleisten, kann man dann verkettete 
Descriptor-Listen benutzen - und schreibt immer in den Pingpong-Puffer, 
der grade "offline" ist (also nicht ge DMA't wird). Dann ist der IRQ 
service handler eigentlich kaum noch noetig, bzw. nur noch relevant, 
wenn man der Grafikapplikation den aktuell gezeichneten Puffer mitteilen 
will.

Schoene Gruesse,

- Strubi

von Sebastian B. (sfreak) Benutzerseite


Lesenswert?

Hi,

mein Problem mit dem Timing war blos die lange Pause, die nach dem VSYNC 
noetig ist. Die kann ich soweit ich das sehe nicht mit dem PPI erzeugen, 
da es das PPI_DELAY (oder wie es hiess) Register nur fuer die Zeilen 
gibt.

Aber mit dem PPI abschalten hast du recht. Auch DMA muesste ich 
eigentlich an lassen koennen wenn ich mein Descriptor-Array etwas 
aufbohre. Es sollte ja eigentlich reichen wenn ich den PPI_FS1 Timer 
abschalte. Werde das mal ausprobiere, wird aber ein Paar Tage dauern bis 
ich wieder dazu komme.

Ich benutze im Moment PPI mit einem Framesync und DMA mit einem 
Descriptor-Array das einen Eintrag fuer jede Bildzeile enthaelt. Die 
VSYNC-Pulse und ein Data Enable-Signal erzeuge ich mit weiteren TImern.

Sebastian

von Strubi (Gast)


Lesenswert?

Hi Sebastian,

wuerde in dem Fall mal PPI mit zwei Framesyncs probieren, da sollte man 
relativ grosszuegige Timings auf dem PPI_FS1 generieren koennen..
Die Anwendungen, die ich so bisher kenne, benutzen dafuer dann 2D-DMA 
und jeweils nur 2 Deskriptoren fuer die 2 Bildpuffer 
("ping-pong"-Verfahren).
Heisst allerdings, PPI_FS2 muss dann den Zeilen-Sync (HBlank) machen.
Weiss nicht, ob das bei deiner HW so anwendbar ist, aber vielleicht 
hilft's ja doch weiter.

Gruss,

- Strubi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.