USB2.DLL
Version 1.3

Ein einfaches Programmierinterface für den Cypress Cy7c68013 USB2.0 Controller.

 

Available Languages:

  Index
 
^ Was ist USB2.DLL?
  USB2.DLL ist eine einfache Programmierschnittstelle für den USB2.0 Controller CY7C68013 und dem "USB HighSpeed Interface V2.0" der Firma Braintechnology. Sie lässt sich praktisch von jeder Programmiersprache aus ansprechen und kann viel Zeit bei der Realisierung von usb2.0 Projekten sparen, da man sich nicht in das komplexe Thema der USB-Programmierung einarbeiten muss.

Das Produkt befindet sich momentan noch in der Entwicklung, weswegen im Moment noch nicht alle geplanten Funktionen realisiert sind. Das bringt andererseits den Vorteil, dass sie noch in den Entwicklungsprozess eingreifen und sinnvolle Funktionen vorschlagen können, die Ihnen fehlen.

 

^ Zum USB HighSpeed Interface Modul V2.0 & V2.5 von Braintechnology
 

Die Usb2Dll wird mit Hilfe des Usb2.0 Interfaces von Braintechnology entwickelt. Dieses Interface ist Ideal um eigene Entwicklungen im USB2.0 Sektor zu realisieren. 

Pinbelegung des Modules:
 
Version 2.0   Version 2.5
   

 

Anschlüsse:

Anschluss Beschreibung
PortA
PortB
PortD
3 Frei Programmierbare IO-Ports mit jeweils 8 IO-Leitungen. Die Portleitungen arbeiten mit 3.3V-Pegeln.
PortB ist ein 8-Bit Datenbus, wenn das Parallelinterface im 8-Bit Modus aktiviert ist. Sollte es im 16-Bit Modus aktiviert sein, so ist PortB das niederwertige und PortD das höherwertige Byte.
Die IO-Leitungen sind 5V-Tolerant und können max. 4mA Strom liefern (=IOL und IOH).
SCL
SDA
i2c Interface zum Anschluss von EEProms, LC-Displays, i2c portexpander oder anderer i2c-Hardware. Der für i2c nötige Pullup-Widerstand ist bereits auf dem Interface integriert. Der interne EEProm ist ebenfalls direkt mit diesem Bus verbunden.
+3.3V
+5V
GND
Spannungen zur Versorgung ihrer Zielschaltung. Sie werden direkt aus dem USB-Bus bezogen.
CTL0
CTL1
CTL2
Frei definierbare Ausgänge, die nur für das Parallelinterface genutzt werden können.
RDY0
RDY1
Frei definierbare Eingänge, die nur für das Parallelinterface genutzt werden können.
IFCLK Wenn das Parallelinterface aktiviert ist, dient dieser Anschluß entweder zum einspeisen eines externen Taktes, zu dem die Daten synchron ausgegeben werden, oder es wird Der Takt des Busses ausgegeben. Weitere informationen befinden sich in dem Abschnitt Parallelport-Funktionen.
CLKOUT Liefert einen Takt von 48MHz (Arbeitsfrequenz des USB-Controllers)
/WAKEUP  

 

^ Installation
  Um die USB2.DLL benutzen zu können muss der ezusb-Treiber der Firma Cypress installiert sein. Er lässt sich von der Seite der Firma Cypress, oder Braintechnology herunterladen.

Die Dll muß sich in dem Suchpfad für ddls befinden. Das ist entweder das Systemverzeichnis des Rechners, oder das Verzeichnis, in dem sich das Programm befindet, das die dll nutzt.

Eine Registrierung mit Hilfe von regsvr32 ist nicht nötig, da es sich nicht um eine activex-dll handelt.

 

^ Generelles zur DLL
  Jede Funktion der Dll besitzt einen Rückgabewert vom Typ Boolean. Ist er TRUE, so war das Ausführen der Funktion erfolgreich. Ist er FALSE, so ist ein Fehler aufgetreten. Die Fehlerquelle kann mit den Funktionen UsbGetError und UsbGetErrorStringByNr ermittelt werden.

Fast jede Funktion besitzt DevNum als Aufrufparameter. Er muß die Nummer des anzusprechenden USB-Interfaces beinhalten. Das erste angeschlossene Interface besitzt die Nummer 0, das zweite die Nummer 1, ...

Ist nur ein Interface angeschlossen, so muß man 0 übergeben.

 

^ Beispiele
 

Im Moment gibt es 2 Beispiele, die den Zugriff auf die Funktionen verdeutlichen:

pardemo:

Dieses Programm demonstriert die Programmierung des Parallel-interfaces. Nach dem Start muss der Button Initialize Parallel Interface gedrückt werden. Ein Klick auf den Button Write! schreibt die in dem Edit-Feld angegebene Anzahl von Bytes auf dem Parallel Interface.

Hinweis: Das Demo arbeitet mit Parallelmodus 4.

i2cdemo:

Hiermit können Werte in das interne EEProm gelesen und geschrieben werden. Außerdem kann die Geschwindigkeit des i2c-Busses gewählt werden. 

Zum Schreiben eines Wertes muß man die Felder Address und Value füllen und auf Write klicken.

Zum Lesen eines Wertes aus dem EEProm trägt man die Adresse der Speicherzelle in das Feld Address ein und klickt auf Read. Der gelesene Wert wird dann im Feld Value angezeigt.

iodemo:

Mit Hilfe des Programms können sie sich die Zustände der IO-Leitungen anzeigen
lassen und manipulieren.
Dazu wird jede IO-Leitung durch 3 Elemente visualisiert:

  • Eine "Zahl", die bei jedem anklicken zwischen 0 und 1 wechselt. Sie dient dazu den logischen Zustand der IO-Leitung zu setzen. Änderungen wirken sich lediglich aus, wenn die Portleitung als Ausgang geschaltet ist.
  • Einen Pfeil, der die aktuelle Richtung der jeweiligen IO-Leitung anzeigt. Zeigt der Pfeil nach links, so ist die IO-Leitung ein Eingang, zeigt er nach rechts, so ist sie ein Ausgang.
  • Eine "Leuchtdiode", die den aktuellen Zustand der IO-Leitung anzeigt.

 

^ Header und Includes für diverse Programmiersprachen
 

Der Ordner Includes enthält Includes und teilweise Beispiele für Programmiersprachen wie Microsoft Visual Basic, Delphi und Microsoft Visual C++

Wer die DLL in andere Programmiersprachen einbinden will, zu denen keine Includes vorliegen findet hier die Beschreibung der für Aufruf- und Rückgabeparameter verwendeten Datentypen:

 

Datentyp Grösse in Byte signed/unsigned Beschreibung
boolean 1 - Ein boolean enthält den Wert 1 (=true) oder 0 (=false)
byte 1 unsigned Ein vorzeichenloser Wert mit dem Wertebereich 0-255
word 2 unsigned Ein vorzeichenloser Wert mit dem Wertebereich 0-65535
pchar 4 - Zeiger auf einen Nullterminierten String (wie in C verwendet)
pointer 4 - Ein untypisierter Zeiger

Befindet sich das Schlüsselwort "Var" vor einem Parameter, so wird ein Zeiger auf den Wert übergeben. Es entspricht dem Operator "*" in C, bzw. dem Schlüsselwort "byRef" in Visual Basic.

 

^ Latenzzeiten und Geschwindigkeit
  Aufgrund des bei USB zugrundeliegenden Protokolles können unabhängige Datentransfers lediglich innerhalb von Frames, bzw. Microframes (USB2) initiiert werden. Für USB1.1 hat dies eine Latenzzeit von ca. 1ms, für USB2 ca. 1/8ms zufolge. Anwendungen, die eine möglichst niedrige Latenzzeit erfordern sind also auf die Benutzung einer USB2 Schnittstelle angewiesen.

Bei dem Programmieren sollte man sich der erwähnten Latenzzeiten bewusst sein. Es ist ineffizient grössere Datenmengen in "kleinen Stücken" zu übertragen.

// Beispiel 1:
for i := 0 to 63 do
  UsbParOut(0, @Buffer[i], 1); // Sendet 1 Byte über den Parallelbus

// Beispiel 2:
UsbParOut(0, @Buffer, 64); // Sendet 64 Byte über den Parallelbus

Während die Übertragung in Beispiel 1 ca. 8ms (USB2) dauert, so benötigt der Transfer in Beispiel 2 nur noch ca. 1/8 ms.

 

  Funktionen der DLL
    Allgemeine Funktionen
^     UsbInit
  function UsbInit(DevNum : Byte) : Boolean;

Initialisiert das durch DevNum spezifizierte USB-Interface. Der Initialisierungsvorgang programmiert die aktuellste Firmware in den Controller und ist somit zur weitergehenden Kommunikation zwingend notwendig. Die Routine wartet so lange, bis das Gerät neu enumeriert wurde (normalerweise ca. 1.5 Sekunden). Dies vermeidet Fehler, die durch zu frühe Ansteuerung des Interfaces auftreten können.

Das Interface wird nicht exklusiv geöffnet, das heisst mehrere Programme können gleichzeitig auf den USB-Controller zugreifen. Deswegen ist auch kein "Schliessen" der DLL nötig.

 

^     UsbGetError
  function UsbGetError : Byte;

Ist ein Fehler während der Kommunikation mit dem Interface aufgetreten, so liefert diese Funktion die Fehlernummer zurück. Ist der zurückgegebene Wert 0, so ist kein Fehler aufgetreten. Nach dem Auslesen des Fehlerspeichers, wird er zurückgesetzt. 

 

^     UsbGetErrorStringByNr
  function UsbGetErrorStringByNr(ErrNr : Byte; var PString : PChar) : boolean;

Wird in ErrNr die durch UsbGetError übermittelte Fehlernummer übergeben, so wird in PString ein Zeiger auf die Fehlermeldung in Klartext zurückgegeben. Aus Kompatibilitätsgründen wird hier mit PChars gearbeitet und nicht mit Strings. Ein PChar ist ein Nullterminierter String, wie er z.B. in C benutzt wird.

 

^     UsbSetLicense
 

function UsbSetLicense(Filename : PChar) : boolean;

Wird diese Funktion nicht ausgeführt und in dem Parameter Filename kein Dateiname einer gültigen Lizenzdatei angegeben, handelt es sich nur um eine Demoversion. In der Demoversion erscheint etwa alle 10 Minuten ein Fenster.

 

^     UsbCheckSpeed
 

function UsbCheckSpeed(DevNum : Byte; var Speed : Byte) : boolean;

Gibt in Speed den Wert 0 oder 1 zurück. Speed = 0 wird zurückgegeben, wenn der USB-Controller an einem USB1.1, Speed = 1, wenn der Controller an einem USB2 Bus betrieben wird.

 

^     UsbOpen
 

function UsbOpen(DevNum : Byte) : boolean;

Normalerweise wird beim Ausführen jeder Funktion das Gerät automatisch geöffnet und geschlossen. Dies bringt natürlich einen kleinen Geschwindigkeitsverlust, allerdings auch den Vorteil, das mehrere Applikationen gleichzeitig auf das Gerät zugreifen können.
Mittels dieser Funktion lässt sich das Gerät exklusiv öffnen. Dadurch entfällt der erwähnte (minimale) Geschwindigkeitsverlust. Allerdings muss nach dem Beenden der Applikation dafür gesorgt werden, dass die Funktion UsbClose aufgerufen wird.

Wer diese Funktion einsetzt, sollte sie direkt nach der Funktion UsbInit aufrufen.

 

^     UsbClose
 

function UsbClose(DevNum : Byte) : boolean;

Schliesst das Gerät, wenn es mittels UsbOpen geöffnet wurde. Wird UsbOpen nicht benutzt, so ist auch der Aufruf von UsbClose nicht erforderlich.

 

^     UsbCheckSpeed
 

function UsbCheckSpeed(DevNum : Byte; var Speed : Byte) : boolean;

Gibt in Speed den Wert 0 oder 1 zurück. Speed = 0 wird zurückgegeben, wenn der USB-Controller an einem USB1.1, Speed = 1, wenn der Controller an einer USB2 Schnittstelle betrieben wird.

 

^     UsbGetVersion
 

procedure UsbGetVersion(VersionStr : PChar);

Gibt in VersionStr die Versionsnummer der aktuell benutzten DLL zurück. VersionStr muss auf einen Speicherbereich von 16 Byte oder mehr zeigen.

 

^   IO Funktionen
^     UsbSetIOState
  function UsbSetIOState(DevNum, LineNum, State : Byte) : boolean;

Setzt eine einzelne IO-Leitung auf High (State=1) oder Low (State=0). An LineNum muß die Nummer der IO-Leitung übergeben werden. Die Zuordnung ist folgendermassen:

LineNum IO-Leitung   LineNum IO-Leitung   LineNum IO-Leitung
0 PortA.0   8 PortB.0   16 PortD.0
1 PortA.1   9 PortB.1   17 PortD.1
2 PortA.2   10 PortB.2   18 PortD.2
3 PortA.3   11 PortB.3   19 PortD.3
4 PortA.4   12 PortB.4   20 PortD.4
5 PortA.5   13 PortB.5   21 PortD.5
6 PortA.6   14 PortB.6   22 PortD.6
7 PortA.7   15 PortB.7   23 PortD.7
 

Damit sich diese Änderung auch an der IO-Leitung auswirkt, muss mittels UsbSetIODir oder UsbSetPortDir die IO-Leitung als Ausgang programmiert werden.

 

^     UsbSetIODir
  function UsbSetIODir(DevNum, LineNum, State : Byte) : boolean;

Setzt die Richtung einer IO-Leitung auf Ausgang (State=1) oder Eingang (State=0). Nach dem Initialisieren des Interfaces sind alle IO-Leitungen als Eingang geschaltet. 

Die Zuordnung von LineNum zu den IO-Leitungen entspricht der von UsbSetIOState.

 

^     UsbGetIOState
  function UsbGetIOState(DevNum, LineNum : Byte; var State : Byte) : boolean;

Liefert in State den Zustand einer IO-Leitung zurück. Ist er High, so wird State=1, ist er Low, so wird State=0 zurückgeliefert. 

Die Zuordnung von LineNum zu den IO-Leitungen entspricht der von UsbSetIOState.

 

    Port Funktionen
^     UsbSetPortState
  function UsbSetPortState(DevNum, PortNum, State : Byte) : boolean;

Setzt einen der 3 Ports auf den durch State übergebenen Zustand. An PortNum muß die Nummer der Portleitung übergeben werden. Die Zuordnung ist folgendermassen:

 

PortNum Port
0 PortA
1 PortB
2 PortD

Ist ein Bit von State 1, so wird der entsprechende Port-Pin High geschaltet. 

Damit sich diese Änderung auch an den IO-Leitungen auswirkt, müssen mittels UsbSetIODir oder UsbSetPortDir  die relevanten Portleitungen als Ausgang programmiert werden.

 

^     UsbSetPortDir
  function UsbSetPortDir(DevNum, PortNum, Dir : Byte) : boolean;

Setzt die Richtungen der Portleitungen des durch Portnum ausgewählten Ports. 

Ist ein Bit High, so wird die entsprechende IO-Leitung zu einem Ausgang, sonst ein Eingang.

Die Zuordnung von PortNum zu den IO-Leitungen entspricht der von UsbSetPortState

 

^     UsbGetPortState
  function UsbGetPortState(DevNum, PortNum : Byte; var State : Byte) : boolean;

Liefert den Zustand des durch Portnum spezifizierten Ports zurück. 

Die Zuordnung von PortNum zu den IO-Leitungen entspricht der von UsbSetPortState.

 

    i2c-Bus Funktionen
^     UsbI2CSetSpeed
  function UsbI2CSetSpeed(DevNum, Speed : Byte) : boolean;

Setzt die Geschwindigkeit des i2c-interfaces. Wird Speed=0 übergeben, so arbeitet das i2c-interface mit 100khz. Speed=1 schaltet das i2c-Interface auf 400khz.

 

^     UsbI2CWriteByte
  function UsbI2CWriteByte(DevNum, SlaveAddr, Data : Byte) : boolean;

Schreibt das Byte Data an das i2c-Device mit der Slaveadresse SlaveAddr.

Bitte beachten: Hat das anzusprechende i2c-device z.B. die Adresse 0xA0, so müssen Sie an diese und sämtliche andere i2c-Funktionen 0x50 übergeben, d.h. eine um 1 bit nach rechts verschobene Adresse (SlaveAddr >> 1).

 

^     UsbI2CWriteBytes
  function UsbI2CWriteBytes(DevNum, SlaveAddr, Length : Byte; P : Pointer) : boolean;

Schreibt den Datenblock, auf den der Pointer P zeigt mit der Länge Length an das i2c-Device mit der Slaveadresse SlaveAddr.

 

^     UsbI2CReadByte
  function UsbI2CReadByte(DevNum, SlaveAddr : Byte; var Data : Byte) : boolean;

Ließt ein einzelnes Byte von dem i2c-Device mit der Slaveadresse SlaveAddr. Der gelesene Wert wird an Data übergeben.

 

^     UsbI2CReadBytes
  function UsbI2CReadBytes(DevNum, SlaveAddr, Length : Byte; PData : Pointer) : boolean;

Ließt einen Datenblock mit der Länge von Length Bytes von dem i2c-Device mit der Slaveadresse SlaveAddr.

 

^     UsbI2CWriteAndReadBytes
  function UsbI2CWriteAndReadBytes(DevNum, SlaveAddr, WriteLen, ReadLen : Byte; PWrite, PRead : Pointer) : boolean;

Schreibt den Datenblock, auf den der Pointer PWrite zeigt mit der Länge WriteLen an das i2c-Device mit der Slaveadresse SlaveAddr. Nach dem Schreibvorgang wird direkt eine Anzahl von ReadLen Bytes von dem selben i2c-Device gelesen. Die gelesenen Daten werden in den Buffer auf den der Pointer PRead zeigt abgelegt.

 

    i2c-EEProm Funktionen
^     UsbEEpWriteByte
  function UsbEEpWriteByte(DevNum : Byte; Addr : Word; Data : Byte) : boolean;

Schreibt das Datenbyte Data an Adresse Addr des internen EEProms.

 

^     UsbEEpWriteBytes
  function UsbEEpWriteBytes(DevNum : Byte; Addr : Word; Length : Byte; PData : Pointer) : boolean;

Schreibt den Datenblock auf den der Pointer PData zeigt mit der Länge von Length Bytes an Adresse Addr des internen EEProms.

 

^     UsbEEpReadByte
  function UsbEEpReadByte(DevNum : Byte; Addr : Word; var Data : Byte) : boolean;

Ließt ein einzelnes Datenbytes von Adresse Addr des internen EEProms. Der gelesene Wert wird in Data zurückgegeben.

 

^     UsbEEpReadBytes
  function UsbEEpReadBytes(DevNum : Byte; Addr : Word; Length : Byte; PData : Pointer) : boolean;

Ließt einen Datenblock mit der Länge von Length Bytes von dem Internen EEProm. Die gelesenen Daten  werden in den Speicher geschrieben, auf den PData zeigt.

 

^     UsbEEpSetAddr
 

function UsbEEpSetAddr(DevNum, SlaveAddr : Byte) : boolean;

Setzt die zu benutzende i2c-slaveadresse des internen EEProms.

Die Adressen der 2 verschiedenen USB2-Module von Braintechnology sind:

 

Modul Slaveadresse
USB HighSpeed Interface Modul V2.0 0x50
USB HighSpeed Interface Modul V2.5 0x51

Sollten Sie das neue Modul von Braintechnology (V2.5) einsetzen, müssen Sie vor Benutzung von EEprom-Funktionen die Funktion folgendermassen aufrufen:

UsbEEpSetAddr(0, $51);

 

    Parallelport-Funktionen
^     Generelle Informationen zum Parallelbus
 

Das Parallelinterface ist recht flexibel. Das geht so weit, dass man als Firmware-Programmierer den Ablauf von Schreib- und Lesezyklen mit seinen Steuerleitungen geradezu "malen" kann.
Zukünftige Versionen werden ein Programm enthalten mit dem sie die Funktionsweise des Parallelbusses selber definieren können. Es erstellt einen Datenblock den sie mit Hilfe der Funktion UsbParInitUsingArray an den USB Controller übermitteln. Das Programm befindet sich momentan in der Testphase. Sollten sie Interesse an einem Test haben, melden Sie sich (siehe Kontakt)!
Ansonsten können Sie einen der 10 vordefinieren Parallelbus-Modi nutzen.

Mit Hilfe des Parallelbusses sind Sie in der Lage grosse Datenmengen schnell zu übertragen. Unabhängig von dem gewählten Modus unterliegt er gewissen Eigenschaften. Im Detail sind dies:

  • Werden mehr als 512 Byte mittels UsbParOut() oder UsbParIn() übertragen, so werden die Daten in maximal 512 Byte grossen Blöcken übertragen. Beispiel:
    UsbParOut(0, @Buffer, 25); // Überträgt einen zusammenhängenden 25 Byte grossen Datenblock
    UsbParOut(0, @Buffer, 512); // Überträgt einen zusammenhängenden 512 Byte grossen Datenblock
    UsbParOut(0, @Buffer, 1500); // Überträgt zwei 512 Byte grosse Datenblöcke und einen 476 Byte grossen Datenblock
  • Wird die USB2DLL in Zusammenhang mit einer USB1.1 Schnittstelle benutzt, so werden die Daten zu 64 Byte (statt 512 Byte) grossen Datenblöcken zusammengefasst und übertragen.
  • Auch der Parallelbus unterliegt den im Abschnitt Latenzzeiten und Geschwindigkeit erwähnten Latenzzeiten. UsbParOut und UsbParIn besitzen eine Latenzzeit von ca. 1/8ms (USB1.1: 1ms).

Innerhalb von Datenblöcken werden die einzelnen Datenworte zeitlich äquidistant übertragen. Die Abstände zwischen den Datenblöcken, in denen keine Daten übertragen werden, hängen von dem verwendeten Parallelbusmodus ab.

Deshalb werden Anwendungen die auf äquidistante Datenübertragung >512 Byte angewiesen sind einen FIFO benötigen.

 

^     UsbParInit
 

function UsbParInit(DevNum, mode :Byte) : boolean;

Initialisiert das Parallelinterface mit einem der vordefinierten Modi (mode). Eine Initialisierung ist zwingend notwendig um Daten über das Parallelinterface ein- oder auszugeben. 

Folgende Modi sind implementiert:

mode Taktquelle Busbreite Max. Übertragungsgeschwindigkeit (Burst Datenrate)
0 Intern 8 Bit  48 MB/s
1 Intern 16 Bit  96 MB/s
2 Extern 8 Bit  =IFCLK
3 Extern 16 Bit  =IFCLK*2
4 Intern 8 Bit  4.8 MB/s
5 Intern 16 Bit  9.6 MB/s
6 Extern 8 Bit  IFCLK/10
7 Extern 16 Bit  IFCLK/5
8 - 8 Bit Aufgrund des Handshakings abhängig von der angeschlosenen Hardware
9 - 16 Bit Aufgrund des Handshakings abhängig von der angeschlosenen Hardware

 

^    
Mode 0-3
 
mode = 0:

Mode 0 ist ein sehr schneller (48MHz) 8 Bit breiter Datenbus. Mit ihm kann man eine Burst-Datenrate von 48MB/s, bzw. eine durchschnittliche Datenrate von etwa 23 MB/s (abhängig von der Rechnergeschwindigkeit) erreichen.

Folgende Anschlüsse werden für den Bus genutzt:

Anschluss Beschreibung
PortB Bidirektionaler 8-Bit Datenbus
CTL0 /Wen: Ein Low-Aktives Write-Enable Signal, dass während eines Schreibvorganges aktiviert (/Wen=0) wird.
CTL1 /Ren: Ein Low-Aktives Read-Enable Signal, dass während eines Lesevorganges aktiviert (/Ren=0) wird.
CTL2 /OE: Output Enable (Low-Aktiv). Dient zum aktivieren der Bustreiber der anzusteuernden Hardware. /OE=0 muß den Treiber aktivieren.
RDY0 /EF: Empty Flag. Signalisiert dem usb-Controller, dass Daten gelesen werden sollen. Wird diese Leitung während eines Lesevorganges auf Low gezogen, so wird er solange angehalten, bis sie wieder HI wird. 
RDY1 /FF: Full Flag. Signalisiert dem usb-Controller, dass Daten geschrieben werden sollen. Wird diese Leitung während eines Schreibvorganges auf Low gezogen, so wird er solange angehalten, bis sie wieder HI wird. 
IFCLK liefert einen zum Bus synchronen 48MHz Takt. Bei einem Schreibvorgang muss ihre Hardware die Daten bei einer fallenden Flanke speichern. Bei einem Lesevorgang muss bei einer steigenden Flanke das zu übertragende Byte anliegen.


mode = 1:

Entspricht mode 0 mit dem Unterschied, dass es sich hier um einen 16 Bit Bus handelt. PortB ist das niederwertige, PortD das höherwertige Byte. Burst-Datenrate: 96 MB/s. 


mode = 2:

Entspricht mode 0. IFCLK ist hier jedoch ein Eingang an dem man ein externes Taktsignal im Bereich von 5 - 48MHz einspeisen muss. Der Bus arbeitet dann Synchron zu diesem Takt.


mode = 3:

Entspricht mode 2 mit dem Unterschied, dass es sich hier um einen 16 Bit Bus handelt. PortB ist das niederwertige, PortD das höherwertige Byte. 


^    
Mode 4-7
 
mode = 4:

Ein Parallelbus mit /RD, /WR und /OE Leitungen, wie er z.B. bei Mikroprozessorbussen üblich ist. Burst-Datenrate: 4.8MB/s.

Folgende Anschlüsse werden für den Bus genutzt:

Anschluss Beschreibung
PortB Bidirektionaler 8-Bit Datenbus
CTL0 /RD Ein Low-Aktives Read-Signal. /RD=0 ließt ein Datenbyte von dem Bus.
CTL1 /WR Ein Low-Aktives Write-Signal. /WR=0 schreibt ein Datenbyte auf den Bus.
CTL2 /OE Ist dieses Signal Low, so müssen die Ausgangstreiber der anzusteuernden Hardware aktiviert werden um bei dem folgenden /RD Signal Daten lesen zu können.
RDY0 /EF Empty Flag. Die Funktionsweise entspricht der von mode 0.
RDY1 /FF Full Flag. Die Funktionsweise entspricht der von mode 0.


mode = 5:

Eine 16-Bit Version von mode 4. PortB ist das niederwertige, PortD das höherwertige Byte. Burst-Datenrate: 9.6MB/s.


mode = 6:

Entspricht mode 4. IFCLK ist hier jedoch ein Eingang an dem man ein externes Taktsignal im Bereich von 5-48MHz einspeisen muss. Der Bus arbeitet dann Synchron zu diesem Takt. Ein Schreibzyklus wird in 10 Taktzyklen des IFCLK Signales vollzogen.


mode = 7:

Entspricht mode 6 mit dem Unterschied, dass es sich hier um ein 16 Bit Bus handelt. PortB ist das niederwertige, PortD das höherwertige Byte. 


^    
Mode 8-9
 

Mode 8 und 9 wurden implementiert um auf einfache Art- und Weise Datenaustausch über den Parallelbus mit einem Microcontroller zu realisieren. Dazu können I/O-Leitungen eines Microcontrollers einfach 1:1 mit dem Datenbus und Handshakeleitungen des USB Controllers verbunden werden.
Ein Handshaking Mechanismus stellt eine erfolgreiche Datenübertragung sicher.

Mode 8 realisiert einen 8 Bit breiten Datenbus, Mode 9 einen 16 Bit breiten Datenbus.

Folgende Anschlüsse werden für den Bus genutzt:

Anschluss Beschreibung
PortB Bidirektionaler 8-Bit Datenbus (Mode 9: Niederwertiges Datenbyte des 16 Bit Datenbusses)
PortD Nur in Mode 9: Höherwertiges Datenbyte des 16 Bit Datenbusses
CTL0 =STROBE (Ausgang)
CTL1 =DIR (Ausgang)
RDY0 =ACK (Eingang)

Das schreiben eines Bytes (z.B. UsbParOut(0, @Buffer, 1);) funktioniert folgendermassen:

  • DIR=1
  • Zu übertragendes Datenbytes wird auf den Datenbus gelegt und der Treiber aktiviert
  • STROBE=0
  • Warten, bis ACK=0
  • STROBE=1
  • Datenbus wird in den Tristate-Zustand geschaltet
  • Warten, bis ACK=1

Lesen eines Bytes (z.B. UsbParIn(0, @Buffer, 1);):

  • DIR=0
  • STROBE=0
  • Warten, bis ACK=0
  • Datum wird vom Datenbus gelesen
  • STROBE=1
  • warten, bis ACK=1
  • DIR=1

Im Ruhezustand besitzen die Leitungen folgende Zustände:

  • STROBE=1
  • DIR=1
  • ACK=1 (muss in dem Programm ihres Microcontroller sichergestellt werden)

 

Eine Routine zum Datentransfer in dem anzuschliessenden Microcontroller könnte zum Beispiel folgendermassen ablaufen:

if (STROBE == 0) {                   // vom PC wird ein Datentransfer initiiert
    if (DIR == 0) {                  // Der PC will Daten lesen (UsbParIn)
        Zustand des Datenbusses = Datum;
        Datenbus auf Ausgang schalten;
        ACK = 0;
        while (STROBE == 0);         // Warten, bis STROBE = 1
        Datenbus auf Eingang schalten (Tristate);
        ACK=1;
    } else {                         // Der PC will Daten schicken (UsbParOut)
        Datum = Zustand des Datenbusses;
        ACK = 0;
        while (STROBE == 0) ;        // Warten, bis STROBE = 1
        ACK = 1;
    }
}

Der Datenbus muss im Controller folgendermassen initialisiert werden:

  • Datenbus auf Eingang schalten (Tristate)
  • STROBE und DIR als Eingang initialisieren
  • ACK als Ausgang, Zustand Hi (1)


^     UsbParInitUsingArray
 

function UsbParInitUsingArray(DevNum, Data : Pointer) : boolean; 

Initialisiert das Parallelinterface mit Hilfe eines 152 Byte großen Arrays. Falls Sie spezielle Anforderungen an den Parallelbus haben, die durch die oben beschriebenen Standard-Modi nicht abgedeckt sind, so können wir den Bus nach Ihren Anforderungen gestalten und schicken Ihnen einen 152 Byte großen Datenblock zu, den Sie mit Hilfe dieser Funktion aktivieren. Ein zusätzlicher Aufruf der Funktion UsbParInit darf dann nicht erfolgen.

Momentan wird eine Anwendung entwickelt, mit der Sie selber die Funktionsweise des Parallelbusses definieren und diesen Datenblock erstellen können. Sie befindet sich momentan in der Testphase und wird vorraussichtlich in der nächsten Version enthalten sein.

Unter "normalen" Bedingungen werden Sie diesen Befehl jedoch nicht aufrufen müssen.


^     UsbParOut
 

function UsbParOut(DevNum : Byte; Data : Pointer; Len : Word) : boolean; 

Gibt eine Anzahl von Len Datenworte auf dem Parallelbus aus. Data ist ein Zeiger auf einen Datenblock der die zu übermittelnden Daten enthält.

Beispiele:

Befindet sich das Parallelinterface im 8 Bit Modus und es sollen 768 Bytes übermittelt werden:

UsbParOut(0, @Daten, 768);

Befindet sich das Parallelinterface im 16 Bit Modus und es sollen 768 Bytes (=384 Words) übermittelt werden:

UsbParOut(0, @Daten, 384);


^     UsbParIn
 

function UsbParIn(DevNum : Byte; Data : Pointer; Len : Word) : boolean; 

Liesst Len Datenworte von dem Parallelbus ein. Data ist ein Zeiger auf einen Datenblock, der mit den gelesenen Daten gefüllt wird.

Beispiele:

Befindet sich das Parallelinterface im 8 Bit Modus und es sollen 768 Bytes gelesen werden:

UsbParIn(0, @Daten, 768);

Befindet sich das Parallelinterface im 16 Bit Modus und es sollen 768 Bytes (=384 Words) gelesen werden:

UsbParIn(0, @Daten, 384);


^     UsbGetRdyState
 

function UsbGetRdyState(DevNum : Byte; var Rdy : Byte) : boolean; stdcall;

Liefert in Rdy den Zustand der RDYx-Leitungen Zurück (RDY0, RDY1, etc.).

Der Zustand von Bit 0 entspricht dem von RDY0, Bit1 RDY1, ...


^ Problemlösungen
   
Art des Problemes Mögliche Ursache/Lösung
  • Jegliche Kommunikation mit dem Controller ist erfolglos.
Höchstwahrscheinlich wurde der EZUSB-Treiber nicht, bzw. nicht korrekt installiert.

Nach dem Anschliessen des Interface Boards V2, bzw. des Cypress FX2 Controllers muss der in dem Bild markierte Eintrag im Gerätemanager erscheinen.
 
Befindet sich vor diesem Eintrag ein gelb hinterlegtes Ausrufungszeichen oder fehlt er ganz, so installieren Sie den EZUSB Treiber neu. Er lässt sich unter www.braintechnology.de  herunterladen.
 

  • Die Latenzzeiten sind trotz Verwendung einer USB2 Interface Karte recht hoch (>=1ms)
Dieses Problem tritt auf, wenn der Gerätemanager keinen Enhanced Host Controller (EHCI) aufweisst (siehe Bild). Der von der USB2DLL angesprochene usb2 Controller wird dann lediglich als low speed device erkannt. Sollte kein Enhanced Host Controller zu finden sein müssen sie evtl. die usb2 Treiber neu installieren.

 

 
Für den Betrieb einer usb2 Schnittstellenkarte unter Windows XP ist die Installation des Service Pack 1 oder höher notwendig (Siehe Microsoft Knowledge Base Artikel Q312370).
 

 

^ Geplante Erweiterungen
 
  • Programmierung von Beispielen und Includes für Visual C++, LabView und Java
  • Programmierung von Eventsteuerung, die bestimmte Programmteile nach dem Auftreten von Hardwareinterrupts ausführt (z.B. Drücken eines an dem Interface angeschlossenen Tasters)
  • ...und vieles anderes

 

^ Versionsgeschichte
 
Version Änderungen
1.4.2
  • Die Renumerierung wurde komplett entfernt. Sie führte teilweise zu dem Problem, dass die Funktion UsbInit nicht korrekt funktionierte und Anwendungen erst nach dem 2. Starten korrekt funktionierten.
  • Parallebus-modi 0 und 1 reagierten nicht wie beschrieben auf die /EF und /FF Eingänge
  • Funktion UsbParInitUsingArray und i2c-routinen funktionierte nicht korrekt
  • Funktionen UsbEEpSetAddr, UsbGetVersion und UsbGetRdyState hinzugefügt.
1.3
  • Neue Parallelbus modi 8 und 9, die ein Handshaking zur Kommunikation mit Microcontrollern implementieren
  • Neue Funktionen: UsbOpen & UsbClose
  • hinzufügen der Abschnitte "Problemlösungen", "Latenzzeiten und Geschwindigkeit" und "Generelle Informationen zum Parallelbus"
  • PortD der Abbildung des Braintechnology-Modules war verkehrt herum beschriftet
  • Modus 4-7: Wurde die Leitung /EF während eines Lesevorganges kurz auf low gezogen, so war keine weitere Übertragung möglich.

 

1.2
  • UsbI2cRead- und UsbEepRead Funktionen lieferten falsche Daten, wenn lediglich 1 Byte gelesen wurde.
1.1
  • 16 Bit Interface Modi funktionierten nicht korrekt.
  • Highspeed/Lowspeed Erkennung funktionierte auf einigen Systemen nicht korrekt.
  • UsbInit-Funktion wartet nun solange, bis nach Programmierung der Firmware das Gerät neu enumeriert wurde.
  • Die Unterstützung mehrerer USB2 Module war fehlerhaft.
1.0
  • Die DLL ist nun vollständig USB1.1 kompatibel, das heißt sämtliche Funktionen funktionieren mit einem Controller, der an einem USB1.1 Interface betrieben wird. Zu beachten ist allerdings, dass die Übertragungsraten wesentlich langsamer sind als bei dem Betrieb an einem USB2 interface.
  • Neue Funktionen: UsbCheckSpeed und Usbi2cWriteAfterRead.
  • Fehler in der Funktion UsbGetErrorStringByNr behoben und Aufrufparameter geändert.
0.7
  • Modi 0-3 des Parallelinterfaces funktionierten nicht korrekt. Fehler behoben.
0.6
  • Funktionen um parallele Einleseroutine UsbParIn erweitert. 
0.51
  • Version 0.5 programmierte die Firmware nicht korrekt. Der Fehler wurde in dieser Version behoben.
0.5
  • Implementation von Parallelport-Funktionen
0.4
  • Aufrufparameter der alten Routinen komplett aus Transparenzgründen überarbeitet (Datentypen und Benennung geändert).
  • Neue Funktionen zum parallelen Zugriff auf die Ports des Controllers.
  • Implementation von i2c und EEProm Routinen.
  • Komplette Überarbeitung der Firmware
  • Dokumentation neu geschrieben
  • Neue Beispielapplikation für die neuen i2c-eeprom Funktionen (i2cdemo)
0.31
  • Fehler bei der automatischen Programmierung der Firmware behoben, der dazu führte, dass die Demoapplikation die IO-Leitungszustände erst nach dem 2. Programmstart anzeigte.
0.30
  • Erste veröffentliche Version.

 

^ Kontakt
  Dieses Produkt wird von Kai Goßner im Auftrag von Braintechnology entwickelt. 
Dadurch, dass sich dieses Produkt noch in der Entwicklung befindet, würden wir uns
sehr über Vorschläge und Fehlerbeschreibungen freuen.

Email:
Braintechnology: Info@Braintechnology.de
Kai Gossner: webmaster@elektronikseiten.de

WWW:
www.braintechnology.de
^