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