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
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