USB11-Interface

Das Interface wird mit einem auf 18 Bit Breite konfigurierten Blockram realisiert. Ein Port des Blockrams ist mit dem Systembus des SpartanMC verbunden und das zweite Port mit dem USB-Interface. Das Modul hat keine I/O-Register. Die Komunikation erfolgt nur durch Daten lese und schreib Zugriffe in diesen Blockram. Jeder der installierten Endpunkte kann einen Interrupt auslösen, wenn der Host Daten von einem IN-Endpunkt (Tx) gelesen hat oder wenn der Host Daten auf einen OUT-Endpunkt (Rx) abgelegt hat. Das Interface kann maximal 6 Endpunkte realisieren. An den drei erzeugten Signale ist nur noch folgende externe Beschaltung notwendig:

USB-Anschluss
Der 1,5K Widerstand(external link) zieht D+ bei Disc=1 auf 3,3V wodurch das Interface im FULL-Speed Mode angemeldet wird.

Speicherorganisation

Die Basiadresse des USB Modul liegt oberhalb des Arbeitsspeichers der Konfiguration.

Die Adressen (Offset) 0x000 bis 0x07f des DMA-Speichers sind für die Konfiguration des USB-Interfaces reserviert. Im verbleibenden Bereich (0x080 bis 0x3ff) befinden sich 28 Datenspeicher mit je 32 Worten (64 Bytes). Sie werden je nach Konfiguration den Endpunkten zugeordnet. Bei deaktiviertem Double Buffering sind die Puffer aufeinander folgend den Endpunkten 0 bis 15 zugeordnet. Der Bereich ab 0x280 bleibt unbenutzt. Ist Double Buffering aktiviert werden in aufsteigender Reihenfolge jedem der Endpunkte 0 bis 13 zwei Puffer zugeordnet. Enpunkt 14 und 15 kann nicht verwendet werden! Siehe Adresstabelle. Die aktuelle Implementierung der Hardware kann nur maximal 6 Endpunkte verwalten!

Konfigurations- und Statusregister

Offset Register Bemerkung
0x00 ep0c1 Globales Kommandoregister 1
0x01 ep0c2 Globales Kommandoregister 2
0x02 ep1c Kommandos für Endpunkt 1
0x03 ep1s Status vom Endpunkt 1
0x04 ep2c Kommandos für Endpunkt 2
0x05 ep2s Status vom Endpunkt 2
0x06 ep3c Kommandos für Endpunkt 3
0x07 ep3s Status vom Endpunkt 3
0x08 ep4c Kommandos für Endpunkt 4
0x09 ep4s Status vom Endpunkt 4
0x0a ep5c Kommandos für Endpunkt 5
0x0b ep5s Status vom Endpunkt 5
.. ..
0x1e ep15c Kommandos für Endpunkt 15
0x1f ep15s Status vom Endpunkt 15
0x20 glob globales Steuerregister

Die aktuelle Implementierung unterstützt nur 6 Endpunkte!

Descriptoren (read only)

Offset Bemerkung
0x21 Device Descriptor
0x2a Configuration Descriptor
0x68 Language Descriptor
0x6a String Descriptor describing manufacturer
0x73 String Descriptor describing product
0x7c String Descriptor describing serial number

Puffer

Offset Puffer Bemerkung EP ohne double buffering EP mit double buffering
0x080 data00 Puffer 0 für 64 Byte 0 0 (0)
0x0a0 data01 Puffer 1 für 64 Byte 1 0 (1)
0x0c0 data02 Puffer 2 für 64 Byte 2 1 (0)
0x0e0 data03 Puffer 3 für 64 Byte 3 1 (1)
.. ..
0x260 data15 Puffer 15 für 64 Byte 15 7 (1)
.. ..
0x3e0 data27 Puffer 27 für 64 Byte - 13 (1)


Die aktuelle Implementierung unterstützt nur 6 Endpunkte! Die Anordnung der Bytes in den Puffern kann mit dem Parameter NOGAP verändert werden. Mit NOGAP=0 werden die Bytes in der 9 Bit Anordnung des SpartanMC abgelegt. Diese Anordnung ist für die Übertragung von Zeichenketten sinnvoll. Sollen 16 Bit Werte vom SpartanMC in dem DMA-Puffer abgelegt werden, dann müssen die Byte im 8 Bit Abstand in das 18 Bit Wort eingetragen Werden. Diese Anordnung der Bytes wird mit NOGAP=1 eingestellt.

Lesen eines 16 Bit Wortes aus einem Puffer mit NOGAP=0 oder NOGAP=1
// lesen 16 Bit
	unsigned int wert16;
#if	SB_USB11_0_NOGAP == 0
	unsigned int i;
	unsigned int j;
	i	= USB11_0_DMA->data02[0];
	// 2 SpMC Byte zu 16 Bit zusammen fassen
	j	= i & 0x3fe00;
	i	= i & 0x000ff;
	j	= j >> 1;
	wert16	= j | i;
#else
	wert16	= USB11_0_DMA->data02[0];
#endif


Schreiben eines 16 Bit Wortes in einen Puffer mit NOGAP=0 oder NOGAP=1
// schreiben 16 Bit
	unsigned int wert16;
#if	SB_USB11_0_NOGAP == 0
	unsigned int k;
	unsigned int l;
	k =  wert16;
	// 16 Bit in der SpMC Bytanordnung in k bilden
	l = k & 0x3ff00;
	k = k & 0x000ff;
	l = l << 1;
	k = l | k;
	USB11_0_DMA->data01[0] = k;
#else
	USB11_0_DMA->data01[0] = wert16;
#endif

Bitbelegung der Register

epXc Register

Bit Bezeichnung Bedeutung
6-0 size Anzahl zu sendender BytesWert mit 0x3f maskieren (0 entspricht 64 Byte)
10-7 reserviert
11 bufsel Auswahl des aktiven Puffers bei double buffering. 0=Unterer Puffer, 1=Oberer Puffer (im Speicherbereich)
12 in Tx Endpunkt zum Senden von Daten zum Host 1=Endpunkttyp IN, sonst 0
13 out Rx Endpunkt zum Empfangen von Daten von Host 1=Endpunkttyp OUT, sonst 0
14 control Steuerinformationen des Interface 1=Endpunkttyp CONTROL, sonst 0
15 mode Datentransfer 1=synchron, 0=asynchron
16 intr enable Interrupt 1=Interrupt enable, 0=Interrupt disable
17 en enable (HOST darf lesen bzw. schreiben) EP IN: 1=Puffer enhällt Daten, EP OUT: 1=Puffer leer


epXs Register (read only)

Bit Bezeichnung Bedeutung
6-0 Anzahl empfangender Bytes
17-7 not used

Globales Steuerregister

Bit Bezeichnung Bedeutung
0 iep00 Impuls setzt Interrupt EP 0 zurück
.. ..
15 iep15 Impuls setzt Interrupt EP 15 zurück
16 ep0ie enable EP0 Interrupt
17 en enable USB-Interface

usb_init.c(external link) zur Vorinitialisierung der USB DMA Puffer.

usb.h und usb11.h(external link) mit der Struktur der DMA-Puffer.

Externe Dokumentationen

USB11 bei Open Cores(external link)

WEB-Seiten mit Informationen zur Funktion des USB

http://www.sprut.de/electronic/interfaces/usb/usb.htm(external link)
http://www.usb.org/home(external link)
http://de.wikipedia.org/wiki/Universal_Serial_Bus(external link)
http://www.beyondlogic.org/usbnutshell/usb1.htm(external link)
http://mandalex.manderby.com/u/usb.php(external link)
Offene Fragen

* Ggf. Zusammenlegung der epXc- und epXs-Register (Pufferinhalt)





SpartanMC