Forum: Mikrocontroller und Digitale Elektronik STM32F4 wie DCMI Synchronisieren bei DMA Doublebuffer


von Peter (Gast)


Lesenswert?

Hallo,

ich lese Daten mit dem Kammerainterface (DCMI) ein.

Beim Starten der Auswertung warte ich logischerweise immer bis keine 
Daten anliegen (Framesignal aus), erst dann starte ich den Capture 
Modus.
Das muss ich machen weil der nur Pegel gesteuert ist.

Bis jetzt waren die Datenraten und Pausen so das ich bequem einen INT 
auf das Frameende setzten und den Empfang und den DMA neu starten 
konnte.
Fehlende Bytes konnte ich auch erkennen, weil der DMA nicht fertig war.

Jetzt aber werden die Pausen zwischen den Paketen zu kurz (Alt:10us 
neu:0,2us), die Daten Pakete brauchen ca. 40us zum einlesen.

Also habe ich einen DMA Doublebuffer eingebaut und
Nur jetzt finde ich keine Möglichkeit der Synchronisierung.
Gibt es da eine Möglichkeit?


Das Problem ist halt das mal ein paar Byte zuviel oder zuwenig ankommen.
Beides sind Fehler Situationen die ich mit meiner alten Methode abfangen 
konnte. In den Daten an sich gibt es leider keine Kennung oder CRC um 
hier was auszuwerten.


Gibt es einen Interrupt wenn der Datenpuffer gewechselt wird?
Ich finde den nicht.


VG, Peter

von Peter (Gast)


Lesenswert?

Also den Interrupt für den Pufferwechsel habe ich gefunden.
Nur brauche ich den nicht wirklich, ist aber auch gut das jetzt zu 
wissen.

Das andere Problem ist aber das was ich löschen muss.

VG, Peter

von Peter (Gast)


Lesenswert?

Hat wirklich keiner eine Idee?

von Patrick B. (p51d)


Lesenswert?

Ehm, verstehe ich das richtig, dass du das DCMI als paralleles Interface 
ohne Kamera brauchst?
Weil normalerweise übernimmt die Synchronisation des ganzen die Kamera 
und das DCMI. Du brauchst dann nur noch ein Frame-Interrupt, 
Line-Interrupt oder was auch immer auszuwerten.
Was machst du dann mit den Daten? Speichern oder auf ein Display oder 
gleich über RS232/USB weiter senden? Bei einem Display musst du nichtmal 
ein Interrupt nutzen (kannst direkt auf den Speicherbereich des Displays 
schreiben, da der STM32F4 ein Displaycontroller hat).

Ein paar zusätzliche Infos zu deinem Projekt wären sehr Hilfreich. Mit 
den aktuellen Infos kann man höchstens raten...

von Peter (Gast)


Lesenswert?

Es kommen halt Daten, CLK und Enable. Ist somit eine Art Parallele SPI.
Von der Technik her das selbe in grün wie eine Kamera.
Nur das Timing ist etwas schlimmer und es sind mehr Daten.

Ich kann Simulierte Daten senden lassen von denen ich den Aufbau kenne.
Darum kann ich erkennen wenn was nicht stimmt.
Im Normalfall ist der Aufbau der Daten nicht überprüfbar, ausser der 
festen Länge pro Paket. Aber es gibt Fehler Situationen wo halt mal was 
fehlt oder zu viel gesendet wird.

Die Daten werden über Ethernet weiter gesendet.

Bis jetzt hatte auch alles super geklappt, nur jetzt muss noch mehr 
übertragen werden. Da ich aber kaum Einfluss (Mode slow / fast) auf die 
Datenquelle habe muss ich mit den kürzeren Pausen zu recht kommen.

Und die Pausen sind halt das was mir Probleme bereitet.

Wie gesagt 0,2us sind etwas zu kurz um da mal eben mit einem INT 
vernünftig rein zukommen und alles nötige zu machen.

Der Frameende INT scheint nicht zu gehen zu mindestens hat anscheinend 
der DMA hin und wieder noch nicht den Speicher umgeschaltet.
Habe es schon mit warten probiert, hat nichts gebracht.


Da fällt mir gerade ein:
Kann man den Frame Pin zusätzlich als INT Quelle nehmen?
Dann versuche ich mal beim Starten einen Int zu erzeugen.

Das DCMI ist wirklich ein sch.... Teil: kein Counter, keine vernünftige 
DMA Fehler Synchronisation.

VG, Peter

von Patrick B. (p51d)


Lesenswert?

Ok, jetzt ist schon mehr klar.
Werden die HSYNC, VSYNC, auch irgendwie angesteuert? Wenn ja, dann musst 
du halt nur das Timing der DCMI-Schnittstelle einhalten (min Setup 
time,...), und schon könntest du Packete generieren. Es können bei 
keiner (einiger massen schlauen) Übertragung xyMByte pro Sekunde ohne 
Packete gesendet werden.

Ich hatte bei einer 1.3 Megapixel Kamera das ganze Bild mit ~15fps 
eingelesen (2 Bytes pro Pixel). Dieses Bild habe ich dann aufgeteilt 
(~50 Zeilen, da der DMA Counter "nur" 16Bit gross ist). Den 
DMA-Interrupt nutzte ich schlussendlich um die Zieladresse des DMA 
anzupassen. Konnte dies sogar ohne ASM umsetzten (einfach direkt auf die 
Register schreiben und wirklich nur das nötigste setzen). So gesehen 
sollten deine 0,2us reichen (was ja etwa 34 Takte sind). Die genaue 
Interrupt-Latenz must du halt aus dem Datenblatt raussuchen, und schon 
weisst du ob deine ISR zu lange ist.
Im schlimmsten Fall einfach auf asm wechseln.

Ein anderer Vorschlag ist, dass du dich mit dem Daten-Sender absprichst: 
Dann könntest du ~65kByte mit ~40MHz PXCLK übertragen werden. Dan 
hättest du in ca 20ms dieses Packet empfangen. Anschliessend könnte eine 
kleine Pause von 10us (zum Umschalten) locker genutzt werden.
Das Ethernet muss dann auch noch mit deiner Datenmenge nachkommen... 
(wie schiebst du diese dahin, was für ein Speicher hast du?).

Achja, sind deine Daten kontinuierlich oder einfach ne menge 
gespeicherte Messwerte?

von Peter (Gast)


Lesenswert?

So nach dem diesem super Wochenende kann ich jetzt wieder besser denken.

Also, die Daten kommen immer und die Pakete kann ich nicht ändern 
lassen.
Das einzige ist die maximale Samplerate (slow/fast) die ich beeinflussen 
kann.

Die Pakete haben auch nur 200Byte und werden mit maximal 8MHz (PXCLK) 
gesendet. H & V Sync sind parallel angeschlossen (== enable Leitung).

Das ganze ist eigentlich so was von harmlos, wenn die blöde kurze Pause 
nicht wäre, bzw die Hardware besser wäre.

An Assembler hatte ich auch schon gedacht, als Vorstufe hatte ich die 
ganzen CMSIS Funktionen schon ersetzt, aber wie Du schon erkannt hast 34 
Takte sind nicht wirklich viel. Besonders da ich mir nicht sicher bin 
das aus dem Flash der Code überhaupt so schnell ist, ein verschieben ins 
RAM wollte der Compiler nicht, die Anweisung hat der einfach ignoriert 
(mit einer entsprechenden Meldung).

Das Senden erfolgt in größeren Daten Paketen und sollte nicht auch noch 
ein Problem werden.
In der SLOW Version wurden die Daten noch nicht einmal um kopiert 
sondern beim einlesen habe ich die Adressen immer so verbogen das die 
ETH Pakete direkt von DCMI/DMA aufgebaut wurden.


Ich bin gerade dran beim Starten der Übertragung mir einen INT geben 
zulassen, dann habe ich genug Zeit alles zu bearbeiten.
Aber wie ich da auf Fehler reagieren kann ist mir noch ein Rätsel.
Wenn ich das Layout ändern könnte dann würde ich noch Counter auf die 
Leitungen setzen aber das ist jetzt nicht finanzierbar.

VG, Peter

von Peter (Gast)


Lesenswert?

So an Alle die auch mal dieses Problem haben.

Bei extrem kurzen Pausen zwischen den Daten:

Vergesst die Interrupts auf eine Flanke oder auf das Frameende bei DMA 
doublebuffer.
Das geht absolut nicht sauber!

Die Interrupts kommen zwar alle, aber der DMA hatte bei mir bei ungefähr 
10% noch nicht oder schon 2 mal den Buffer umgeschaltet (abfrage auf 
sein Flag). Warten war absolut keine Lösung, weil dann nichts mehr lief, 
ausser der Warteschleife.

Das einzige was geht ist ein DMA Int auf "Transfer fertig".
Der kommt immer sauber (parallel verglichen mit den anderen INTs).
Hatte mit der Stoppuhr auch grob nach gemessen, ob die Anzahl stimmen 
kann.

Das einzige blöde ist das man kaum überprüfen kann, ob die Daten 
Stimmen.
Zu mindestens ist das bei meinen Daten so der Fall (keine Start Kennung 
 kein CRC ...).
Aber auch wenn das eine Normale Kamera wäre würde ein Versatz von 
wenigen Bytes kaum auffallen, ausser bei einem Testbild mit 
entsprechenden Linien.

VG, Peter

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.