DMA Transfers

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

Reply to
Michael Dreschmann
Loading thread data ...

Warum nimmst Du nicht gleich einen M16C mit USB?

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.

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.

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

Reply to
Dirk Ruth

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.