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:
Der 1,5K Widerstand

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 Bytes | Wert 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
zur Vorinitialisierung der USB DMA Puffer.
usb.h und usb11.h
mit der Struktur der DMA-Puffer.
Externe Dokumentationen
USB11 bei Open Cores
WEB-Seiten mit Informationen zur Funktion des USB
http://www.sprut.de/electronic/interfaces/usb/usb.htm

http://www.usb.org/home

http://de.wikipedia.org/wiki/Universal_Serial_Bus

http://www.beyondlogic.org/usbnutshell/usb1.htm

http://mandalex.manderby.com/u/usb.php

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