DMA Transfers

M

Michael Dreschmann

Guest
Hallo,

in einem Projekt möchte ich den USB Controller USBN9604 mit einem M16C
Microcontroller verbinden. Um möglichst grossen Datendurchsatz zu
erhalten würde ich gerne das DMA Feature des USBN nutzten.
Ich vermute, das Prinzip welches hinter DMA steckt, ist allgemein denn
ich habe die Signale DRQ und /DACK auch schon bei vielen anderen
Devices gesehn, so dass mir vermutlich auch eine allgemeine Antwort,
welche sich nicht direkt auf den USBN bezieht, weiterhilft.

Der M16C besitzt einen DMA Controller, welcher (durch ein externes
Signal veranlasst) eine bestimmte Anzahl Bytes von einer fixen Adresse
zu einer fortlaufenden Adresse "bewegen" kann.
Von meiner bisherigen Vorstellung her würde ich das DRG Signal des
USBN als externes Signal für den DMA Controller verwenden, ihn also
starten, wenn der USBN einen DMA Transfer requestet. Als fixe Adresse
würde ich dem DMA Controller den IO-Port des USBN geben und als
fortlaufende Adresse einen freien Bereich im RAM.
Nun habe ich es aus dem Datenblatt des USBN so verstanden, dass wenn
dieser per DRQ Signal einen DMA Transfer requestet, der DMA Controller
dies mit einem Low auf dem /DACK Signal bestätigt, dann die "bestimmte
Anzahl Bytes" überträgt und erst dann /DACK wieder auf high setzt.
Jetzt weiss ich aber nicht, wie ich mit dem M16C dieses /DACK Signal
generieren soll.
Im Datenblatt zum USBN steht auch, dass das /CS Signal high bleiben
muss, wenn /DACK low ist, also ein DMA Transfer im Gange ist.
Nun habe ich mir überlegt, /DACK während eines DMA Transfers quasi als
/CS Ersatz zu benutzten. D.h. ich hätte neben den normalen IO-Adressen
für den USBN, welche durch ein low auf /CS signalisiert werden noch
eine DMA Adresse welche /DACK auf low setzt. Allerdings würde das
bedeuten, dass /DACK nach jedem Byte welches übertragen wurde wieder
high wird, da das Byte ja an einer anderen Stelle im RAM geschrieben
bzw. gelesen werden muss und nicht erst nachdem ein kompletter DMA
Transfer beendet ist.
Würde das so funktionieren oder gibt es da eine andere Methode?
Man könnte natürlich auch dafür sorgen, dass /RD bzw /WR nur low
werden, wenn die DMA Adresse für den USBN anliegt, allerdings müsste
dann /DACK immernoch irgendwie für den DMA Transfer auf low gesetzt
werden.

Wäre super, wenn mir da jemand einen Tipp geben könnte, wie ich das
lösen kann.

Cu, Michael
 
On Wed, 30 Jul 2003 16:33:33 GMT, michaeldre@gmx.de (Michael
Dreschmann) wrote:

Hallo,

in einem Projekt möchte ich den USB Controller USBN9604 mit einem M16C
Microcontroller verbinden. Um möglichst grossen Datendurchsatz zu
erhalten würde ich gerne das DMA Feature des USBN nutzten.
Ich vermute, das Prinzip welches hinter DMA steckt, ist allgemein denn
ich habe die Signale DRQ und /DACK auch schon bei vielen anderen
Devices gesehn, so dass mir vermutlich auch eine allgemeine Antwort,
welche sich nicht direkt auf den USBN bezieht, weiterhilft.
Warum nimmst Du nicht gleich einen M16C mit USB?


Der M16C besitzt einen DMA Controller, welcher (durch ein externes
Signal veranlasst) eine bestimmte Anzahl Bytes von einer fixen Adresse
zu einer fortlaufenden Adresse "bewegen" kann.
Von meiner bisherigen Vorstellung her würde ich das DRG Signal des
USBN als externes Signal für den DMA Controller verwenden, ihn also
starten, wenn der USBN einen DMA Transfer requestet. Als fixe Adresse
würde ich dem DMA Controller den IO-Port des USBN geben und als
fortlaufende Adresse einen freien Bereich im RAM.
Nun habe ich es aus dem Datenblatt des USBN so verstanden, dass wenn
dieser per DRQ Signal einen DMA Transfer requestet, der DMA Controller
dies mit einem Low auf dem /DACK Signal bestätigt, dann die "bestimmte
Anzahl Bytes" überträgt und erst dann /DACK wieder auf high setzt.
Jetzt weiss ich aber nicht, wie ich mit dem M16C dieses /DACK Signal
generieren soll.
Ein Port Pin??
Du könntest DRQ auf einen INT Port legen und in dessen Routine einen
Port-Pin steuern für /DACK, danach den DMA-Transfer starten, wenn der
fertig ist, löst er einen IRQ aus und dann /DACK wieder hoch.

Im Datenblatt zum USBN steht auch, dass das /CS Signal high bleiben
muss, wenn /DACK low ist, also ein DMA Transfer im Gange ist.
Nun habe ich mir überlegt, /DACK während eines DMA Transfers quasi als
/CS Ersatz zu benutzten. D.h. ich hätte neben den normalen IO-Adressen
für den USBN, welche durch ein low auf /CS signalisiert werden noch
eine DMA Adresse welche /DACK auf low setzt. Allerdings würde das
bedeuten, dass /DACK nach jedem Byte welches übertragen wurde wieder
high wird, da das Byte ja an einer anderen Stelle im RAM geschrieben
bzw. gelesen werden muss und nicht erst nachdem ein kompletter DMA
Transfer beendet ist.
Würde das so funktionieren oder gibt es da eine andere Methode?
Man könnte natürlich auch dafür sorgen, dass /RD bzw /WR nur low
werden, wenn die DMA Adresse für den USBN anliegt, allerdings müsste
dann /DACK immernoch irgendwie für den DMA Transfer auf low gesetzt
werden.
Ist mir zu kompliziert, was Du da meinst.
Du kannst die CS- Signale im M16C ausschalten (Chip select control
register),die funktionieren dann als normale Ports-Pins.


Wäre super, wenn mir da jemand einen Tipp geben könnte, wie ich das
lösen kann.
Eine andere Möglichkeit ist die Verwendung verschidener Adressen.

Bsp.
Du nimmst einen Adressbereich, in dem z.B. CS0 aktiv ist für den
normalen Datentransfer. Für DMA nimmst Du einen Adressbereich, in dem
dann CS1 aktiv ist. Kannst dann halt im oberen Bereich einige Adressen
nicht verwenden, hängt also davon ab, was noch an Deinem Controller
hängt.


Tschö
Dirk
 

Welcome to EDABoard.com

Sponsor

Back
Top