Forum: Mikrocontroller und Digitale Elektronik XMEGA 16-bit DMA Burst Transfer für Display Parallel Bus


von Felix H. (masterq)


Lesenswert?

Hallo,
ich habe ein kleines Problem und mir fällt nichts mehr ein.
Folgendes ist die Situation:
Ich habe ein Display mit einem 16bit Parallel-Datenbus.
Das Display ist an einem XMega128a1u angeschlossen. Wenn die Daten 
anliegen muss ein eine steigende Flanke am WR Pin des Displays gelesen 
werden

Derzeitig übertrage ich die Daten regulär per CPU.

Da mir das aber nicht effizient genug ist möchte ich die Daten lieber 
mit Hilfe des DMACs übertragen.

Dazu möchte ich einen Timer so programmieren das er WR Pin toggelt und 
dann den DMA controller anstösst neue Daten zu übertragen. Ich habe 
selbiges schon einmal mit einem 8Bit Datenbus gemacht und erzielte ein 
sehr gutes Ergebnis. Dort konnte ich einfach die Ziel Adresse 
unverändert lassen.
Das Problem ist jedoch das jetzt eine Ausgabe auf 2 Ports nötig ist. 
Wenn diese sequenziell im Speicher liegen würden, wäre das kein Problem, 
dann liesse sich dies durch ein 2 Byte burst Transfer bewerkstelligen. 
Dies ist leider nicht der Fall.
Die einzige Lösung die mir bisher eingefallen ist, ist folgende:

Ich Kopiere die Daten in 2 Byte Blöcken mittels DMA burst Transfer 
irgendwo im Speicher ab. Sobald die Bytes angekommen sind benutzte ich 2 
weitere DMA Kanäle um die von dem Abgeschlossenen Burst-Transfer 
getriggert werden um jeweils eines der Bytes in das richtige IO-Register 
weiter zu leiten.

Das müsste funktionieren ist mir aber wirklich zu umständlich. Aber ich 
kann möchte noch nicht akzeptieren das es keine andere Lösung geben 
soll.

Meine guten Ideen die ich nicht realisieren konnte:
Am besten wäre es wenn man diese Ports einfach irgendwie so Remappen 
könnte das die OUT-Register sequenziell im Speicher liegen.
Oder den DMAC so zu manipulieren das er immer nur jedes zweite Byte 
liest. Dann liesse sich das mit 2 DMA-Kanälen ermöglichen.

Vielen Dank für eure Hilfe

PS: Ich habe natürlich auch schön darüber nachgedacht ein extra Latch zu 
nutzen das ich über einen weiteren Timer triggere. So das ich dann alle 
Daten auf ein PORT Register kopieren kann. Aber ich möchte ungerne eine 
weitere Platine ätzen, ausserdem gefallen mir die Latenzen nicht. :(

von Felix H. (masterq)


Lesenswert?


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.