AP7000 USB Host
 
Home

Hier geht es um den Versuch dem Atmel AVR32 AP7000 einen
USB Host zu verpassen
.


Da der AP7000 nur einen USB Device Controller mitbringt ist der
Controller wirklich nur halb so schön wie er sein könnte.

Den AP7000 habe ich in Form eines CPU Boards ( Link ) , bei diesem
Board ist leider der EBI nicht nach aussen geführt (Das gleiche Problem
haben auch die vielen NGW100 Besitzer).

Deswegen scheiden Klassiche USB Host Controller mit Memory Mapped IO aus.
In folgenden Thread ( Link  ) kam die Idee auf einen solchen USB Host Controller per SPI ( Link ) an den AP7000 zu bringen.

Es viel die Entscheidung den NXP ISP1160 ( Link )  als Host Controller zu verwenden und mit Hilfe eines kleinen Xilinx CPLDs ( Link ) das SPI Interface nachzubilden.

Die Wahl viel auf den ISP1160 wegen dem überschaubaren Linux Treiber und der USB2.0 (Fullspeed 12Mbit) Unterstützung.
Desweiteren ist der ISP1160 , neben dem CPLD, bei Katalogversendern (z.b. Reichelt) problemlos zu beschaffen.

Für den ersten Versuch habe ich eine einfache , einseitige Leiterplatte entworfen, die werder Schutzbeschaltung noch irgendwelchen anderen Luxus beinhaltet. Zum nachbau ist das also nicht zu empfehlen :-)

Der Schaltplan ist hier zu finden :

gh_usb_rev_a1.pdf

Und Fertig aufgebaut :

 

 

 

In dem oben genannten Thread hat sich ein Mitstreiter gefunden, Udo S. hat den bestehenden Schaltplan in ein Erweiterungsboard für eine OEM-Variante des Grasshopper Boards übernommen. Bei seinem Schaltplan sind die Schutzbeschaltungen enthalten.

 

Zum CPLD :

Das verwendete CPLD von Xilinx besitzt 72 Makrozellen , im ersten Versuch sind von diesen 72 Makrozellen 51 belegt.

 

Das Interface zum AP7000 besteht aus insgesamt 6 Leitungen. Davon werden 5 für das SPI Interface ( MISO,MOSI,SCK,SEL0,SEL1) benötigt. Die übrige Leitung ist ein aufbereitetes IRQ Signal vom USB Host Controller. Da das Grasshopper Board keine EXTINT Leitungen nach aussen hat (grmpf) kann man nur GPIOs als IRQ missbrauchen. Die PIO Unit des AP7000 besitzt dazu einen Pin Change IRQ für jeden GPIO. Die Aufgabe des CPLDs ist hierbei die Level Triggerd IRQ Leitung vom USB Host Controller zu einem Pin Change IRQ "kompatiblen" Signal aufzubereiten.

Im CPLD sind zwei Shift Register vorhanden die über SEL0 und SEL1 ausgewählt werden. MISO,MOSI und SCK teilen sich beide Shift Register. Das erste Shiftregister (SEL0) ist für die Daten zuständig welche vom ISP1160 gelesen oder geschrieben werden sollen. Das zweite Shift Register macht  das Timing für den Parallelbus zum ISP1160. Dazu zieht man SEL1 auf 0 und schiebt 16 Bit in MOSI. Nur die ersten 5 Bit dieses Telegramms werden ausgewertet und jedes Bit ist einem Pin des Parallelbus Interfaces zugeordnet (RW,RD,A0,CS und Reset). Sobald die ersten 5 Bits empfangen sind werden die Daten aus dem ersten Shift Register (SEL0) auf D0..D15 gelegt um die Setup Zeiten einzuhalten, mit den nachfolgenden Clocks an  SCK und den Daten (SEL1) wird das Buszyklus durchgeführt. Nach 14 SCK Zyklen wird der Buszyklus beendet und RW,RD,CS und Reset gehen wieder auf 1. A0 wird dort mit Absicht ausgelassen , der ISP1160 benötigt ein spezielles Timming wenn A0 sich ändert.  

Wenn man vom ISP1160 Daten lesen will wird das ganze in der umgekehrten Reihenfolge gemacht. Erst das SEL1 Shift Register mit Read Zyklus Laden und danach mit dem SEL0 Shift Register die Daten abholen. 

Hier ist der momentane Stand des CPLDs :

AP7KUSB.zip (ISE 10.1 Projekt als Zip)