Forum: Mikrocontroller und Digitale Elektronik Xmega CDC Example mit Seriennummerprefix?


von Noppi (Gast)


Lesenswert?

Hallöchen zusammen,

ich möchte gerne die bisherigen FTDI Chips ersetzen, bzw. umgehen da der 
dahintergeschaltete Prozessor (Xmega32A4U) sowieso USB hat.

Jetzt die Frage, wie das sauber geht, denn durchblicken, auch durch das 
ASF tue ich gerade noch überhaupt nicht.

Was ich brauche:
1. CDC virt. COM für einzelne Bytes die übertragen werden
2. ISR Steuerung, da die Loop nicht geblockt werden darf
3. Die PC Software von mir (VB geschrieben) sucht im WMI alle USB Geräte 
von "FTDI" und mit Prefix "PR" der Seriennummer, dann weiß er, dass es 
das Gerät ist und verbindet sich mit dem COM. Geht das jetzt auch? Wie 
kann ich eine Seriennummerprefix setzen? Hersteller ist dann ATMEL 
vermute ich.

Gibt es da ein Beispielcode vll?

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Noppi schrieb:
> 1. CDC virt. COM für einzelne Bytes die übertragen werden
> 2. ISR Steuerung, da die Loop nicht geblockt werden darf
> 3. Die PC Software von mir (VB geschrieben) sucht im WMI alle USB Geräte
> von "FTDI" und mit Prefix "PR" der Seriennummer, dann weiß er, dass es
> das Gerät ist und verbindet sich mit dem COM. Geht das jetzt auch? Wie
> kann ich eine Seriennummerprefix setzen? Hersteller ist dann ATMEL
> vermute ich.

Das alles musst du selbst im entsprechenden Descriptor in deiner 
µC-Software machen. Der ist von Hause aus nicht dafür eingestellt 
irgendeine Serielle Schnittstelle zu simulieren. Das musst du dem erst 
alles "beibringen".

- https://www.beyondlogic.org/usbnutshell/usb5.shtml

Und für die "Gegenstelle" einen passenden Trieber bereitzustellen der 
dein Gerät bedient ist noch mal eine andere Baustelle. Der FTDI-Treiber 
wird dein Gerät eventuell nicht so einfach akzeptieren und dir einen 
virtuellen COM-Port erzeugen. Du musst hier erheblich mehr selber "zu 
Fuß" machen als wenn du den FTDI verwendest.

von Noppi (Gast)


Lesenswert?

Irgend W. schrieb:
> Das alles musst du selbst im entsprechenden Descriptor in deiner
> µC-Software machen. Der ist von Hause aus nicht dafür eingestellt
> irgendeine Serielle Schnittstelle zu simulieren. Das musst du dem erst
> alles "beibringen".
Das weiß ich. Das Problem was ich habe ist die Umsetzung. Das Manuel 
finde ich dazu nicht aufschlüssig genug, mit anderen Schnittstellen 
(TWI, UART etc) war das nie ein Problem, aber USB ist zu umfangreich. 
Ich habe daher mal das ASF eingebunden, aber das ist so verwirrend 
zusammengebaut, das man da kaum durchsteigt.

> Und für die "Gegenstelle" einen passenden Trieber bereitzustellen der
> dein Gerät bedient ist noch mal eine andere Baustelle. Der FTDI-Treiber
> wird dein Gerät eventuell nicht so einfach akzeptieren und dir einen
> virtuellen COM-Port erzeugen. Du musst hier erheblich mehr selber "zu
> Fuß" machen als wenn du den FTDI verwendest.

=> Nein, den will ich auch nicht nehmen, das klappt so. Wenn ich das ASF 
lade findet er direkt unter COM26 den USB to Serial Converter. Passt.

von Stephan (Gast)


Lesenswert?

Noppi schrieb:
> aber das ist so verwirrend zusammengebaut, das man da kaum durchsteigt.

Sicher braucht "man" da mehr als eine Tasse Kaffee...
Aber eigentlich ist es ganz logisch strukturiert und kann dann auch 
Multi-HID/Composite/CDC parallel...

Dein Frage nochmal in Kurzform:
Du willst das angeschlossene Gerät (ATxxx) nach Emumerierung anhand 
einer Seriennummer identifizieren?

Schau Dir mal die udc.c an.
Da ist das schon vorgedacht und muss
a.) aktiviert werden: "USB_DEVICE_SERIAL_NAME" | 
"USB_DEVICE_GET_SERIAL_NAME_POINTER" und
b.) an Deine Bedürfnisse angepasst werden.

So sieht das bei uns aus (ASF 3.50.0.108)
1
//xxxxx,xx: DYNAMIC serialNumber callback
2
#if defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER
3
  #pragma message("UDC:DYNAMIC serialNumber callback")
4
  case 3:
5
    str_length = udc_callback_get_serialnumberLen();
6
    str = udc_get_string_serial_name();
7
    break;
8
#endif

udc_callback_get_serialnumberLen() (falls benötigt) und 
udc_get_string_serial_name() müssen natürlich ausimplementiert werden...

Deklaration in conf_usb.h. Implementierung an geeigneter Stelle in 
Deinem Code.

Die "Seriennummer" taucht dann im DeviceDesciptor als "iSerialNumber" 
auf...

von Thomas Z. (usbman)


Lesenswert?

Stephan schrieb:
> Die "Seriennummer" taucht dann im DeviceDesciptor als "iSerialNumber"
> auf...

aber nur dann wenn im Device Descriptor für ISerial auch was eingetragen 
ist (0x03 in deinem Beispiel)

von Max (Gast)


Lesenswert?

Hört endlich auf Datenverbindungen zum PC drahtgebunden zu entwickeln. 
USB ist von gestern.

von Jan (Gast)


Lesenswert?

Ich musste dafür extra einen USB-Treiber schreiben. Hat mich ne ganze 
Woche gekostet, da ich mich dazu auch erstmal in die technischen Details 
von USB einarbeiten musste.

Naja, dafür habe ich jetzt meinen eigenen USB-Treiber in Assembler.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.