Hallo zusammen,
ich kämpfe gerade mit der Inbetriebnahme vom ASF Stack bzgl. USB CDC
beim XMEGA A4U. Aus einem anderen Thread habe ich einen super Link
gefunden:
http://asf.atmel.com/docs/latest/xmegaau/html/udi_cdc_quickstart.html
Der USB-Stack funktioniert prinzipiell auf meiner eigenen HW, weil im
Geräte-Manager der Virtuelle COM Port angezeigt wird.
Eine Sache kapiere aber unter den oben genannten Link nicht:
main ()
{
...
while(1)
{
if (my_flag_autorize_cdc_transfert)
{
udi_cdc_putc('A');
udi_cdc_getc();
}
}
}
Das Flag in der if-Abfrage my_flag_autorize_cdc_transfert wird über zwei
Callback-Funktion gesetzt bzw. gelöscht. Allerdings habe ich keine Idee
wie ich die conf_usb.h anpassen muss damit die Callback-Funktionen
aufgerufen werden.
Aktuell habe ich die Callback-Funktionen aus dem obigen Link in meinem
main.c -File reinkopiert. Allerdings werden diese nicht aufgerufen. Ich
bin mir sicher das der Fehler in der conf_usf.h liegt.
Hab' meine conf_usb.h wie folgt konfiguiert.
//! Interface callback definition
//#define UDI_CDC_ENABLE_EXT(port) true
//#define UDI_CDC_DISABLE_EXT(port)
#define UDI_CDC_RX_NOTIFY(port)
#define UDI_CDC_TX_EMPTY_NOTIFY(port)
#define UDI_CDC_SET_CODING_EXT(port,cfg)
#define UDI_CDC_SET_DTR_EXT(port,set)
#define UDI_CDC_SET_RTS_EXT(port,set)
#define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable()
extern bool my_callback_cdc_enable(void);
#define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable()
extern void my_callback_cdc_disable(void);
Leider komme ich aber einfach nicht in die
my_callback_cdc_enable-Funktion rein...
Irgendwelche Tipps?!
Danke,
Michael
Hallo zusammen,
im Anhang mein Projekt. Der USB-Port wird nicht zuverlässig erkannt. Und
in die callback Funktionen komme ich auch nicht rein.
Würde mich sehr freuen, wenn sich einer mal die Zeit nimmt und mir
weiterhilft.
Mit besten Grüßen,
Michael Bittner
//! Define it when the transfer CDC Device to Host is a low rate (<512000 bauds)
27
//! to reduce CDC buffers size
28
#define UDI_CDC_LOW_RATE
29
30
//! Default configuration of communication port
31
#define UDI_CDC_DEFAULT_RATE 115200
32
#define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1
33
#define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE
34
#define UDI_CDC_DEFAULT_DATABITS 8
35
//@}
36
//@}
37
38
39
/**
40
* USB Device Driver Configuration
41
* @{
42
*/
43
//@}
44
45
//! The includes of classes and other headers must be done at the end of this file to avoid compile error
46
#include"udi_cdc_conf.h"
47
#include"usb_handle.h"
Callbacks:
1
volatileboolmain_b_cdc_enable=false;
2
3
voidusb_handle_suspend_action(void)
4
{
5
6
}
7
8
voidusb_handle_resume_action(void)
9
{
10
11
}
12
13
boolusb_handle_cdc_enable()
14
{
15
main_b_cdc_enable=true;
16
returntrue;
17
}
18
19
voidusb_handle_cdc_disable()
20
{
21
main_b_cdc_enable=false;
22
}
Das enable Flag ist nach ASF Beispiel so verwendet (die solltest du dir
jedenfalls immer mal anschauen), leider funktioniert es nicht bzw. nicht
immer....
Meist läuft der interene USB Buffer beim Senden voll und das Programm
bleibt in der udi_cdc_write_buf hängen... WTF!
Da hilft es auch nicht dieses enable Flag zu benutzen...
-Vielleicht testweise die Callback-Funktion mit gleichen Parametern
(port) ausstatten (sollte aber egal sein da der Aufruf nur durch define
ersetzt wird)
-Zum Verhindern des Puffer-Überlaufs (=Sendefunktion hängt):
DTR-Signal auswerten und nur senden wenn aktiv (das Signal von der
PC-Software steuern). Ist besser als die CDC-Enable-Signale.
-Allgemeiner Tip falls es nicht geht oder am PC "USB-Gerät nicht
erkannt" kommt:
Vor dem USB-Anschalten den 32kHz-Oszillator deaktivieren (hilft
wirklich, kein Witz)
Äh ja also die letzten beiden Posts waren jetzt nur allgemeine
XMEGA-USB-Tips hab das spezielle Projekt nicht angeschaut deshalb k.A.
was zutrifft!
Trotzdem habe ich damals als ich mal sowas gemacht hab ewig dran
rumgebastelt bis es zuverlässig lief, vielleicht hilft es ja jemandem :)
@kderh danke für die Tipps... ich verwende auch schon seit einer ganzen
Weile die ASF... Habe einfach die Write Funktion so abgeändert, dass
diese nicht mehr im Endlos Loop hängt... find leider das Projekt nicht
mehr...
Was ich aber eigentlich in jedem Projekt mache, ist die read_buf
Funktion ändern... USB funktioniert nur mit 5 MBit auf dem 8 Bitter,
wenn man die buf Funktionen nimmt und nicht jedes Zeichen einzeln
holt... leider ist die ASF Funktion dafür total dämlich geschrieben...
die wartet nämlich immer bis die erhoffte Anzahl Zeichen eingetroffen
ist... wieder mal -> WTF...
Wer sich das ersparen möchte, schreibt die einfach so um:
(geht sicher noch optimaler)
Die Funktion funktioniert natürlich nun komplett anders... also holt bis
max buffer alles raus und gibt immer die geholten Zeichenanzahl als
return zurück...
Grüße
Basti
Hallo zusammen,
bin leider heute nicht mehr dazugekommen weiter an der USB-Schnittstelle
zu basteln. Aber das nächste Wochenende ist nah :-).
@Basti:
In Deiner conf_usb.h kommt folgende Define zweimal vor:
#define UDI_CDC_ENABLE_EXT(port) usb_handle_cdc_enable()
Absicht?
Wie sieht bei Dir die Datei-Struktur aus. Sind Deine Callback-Funktionen
in
usb_handle.h definiert?
Bei mir werden die Callback-Funktionen gar nicht erst angesprungen. Die
Callback-Funktionen habe ich einfach in main.c unten angehängt.
VG,
Michael
Jetzt wo du es sagst...
Aber die sind ja gleich definiert... da ists egal...
Würde den unteren Teil mit dem extern raus schmeißen... da ich, wie du
schon recht hast, die extern schon in der usb_handle.h bekannt gemacht
habe und in der usb_handle.c abarbeite...
Das kannste dir sparen, wenn du die in der main.h hast und das extern in
die conf_usb.h bringst... wie oben gezeigt...
Grüße
Basti
Hallo zusammen,
nachdem ich jetzt (endlich) mal wieder für mein Projekt Zeit gefunden
habe, muss ich langsam resigniert bzgl. dem ASF-USB Stack aufgeben.
Sobald ich die callback Funktionen mit in mein Programm aufnehme wird
meine HW nicht mehr von Windows richtig erkannt. Folglich habe ich auch
keine virtuelle COM-Schnittstelle, dafür ein nicht erkanntes Device im
Geräte-Manager.
Wenn ich überhaupt keine eigene callback Funktion implementiere und
einfach nur Zeichen über die USB-Schnittstelle sende, dann funktioniert
dies zumindest. Allerdings, wenn ich den USB-Stecker abstecke und dann
wieder einstecke, dann wird meine HW auch nicht mehr richtig vom PC
erkannt.
Also langsam habe ich das Gefühl, der Stack ist der letzte Schrott oder
ich bin zu blöd. Über Tipps wäre ich sehr dankbar.
VG,
Michael
PS: Wie einfach ist das alles mit FTDI