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. :(