Hallo Dieter,
wobei hier
Define USBvBus Portx.x // ein Port muss angegeben werden none nicht zulässig.
ein None noch zu überlegen wäre.
VBUS ist ja nur erforderlich sollte das Gerät auch Portable sein.
Ansonsten ist VBUS nicht umbedingt nötig.
Hier kannst Du auch mit
Code
repeat
until USBDEV_State = UsbDev_STATE_Configured;
warten ob das Device angestöpstelt wurde.
Das kommt nur wenn Windows den USB Treiber geladen hat und Setconfiguration aufgerufen wurde.
Der ganze Aufwand ist nur nötig da beim ersten Connect ja der EPOUT = RXbuffer neu verlinkt werden muss. Da der USB beim anstecken erst ein USB Reset macht und hier nur der Control Endpoint EP0 automatisch initialisiert wird.
Ohne einen gültigen RX Buffer bleibt der Xmega USB im Idle und es wird nichts empfangen.
Man kann sich das auch einfacher machen und Du sendest als erstes aus Deinen Host Prog einen Control Request womit Du dein Device neu initialisierst.
Code
Windows:
usb_control_msg(SelectedDev.hDev, USB_TYPE_VENDOR or USB_RECIP_DEVICE or USB_ENDPOINT_OUT, request, value, index,
nil, 0, 2000);
Code
Var
Header : tUSB_Request_Header;
{$Validate $}
Function myUSB_ControlRequest(bRequest : Byte; wValue : word) : boolean;
begin
Header:= USB_ReadHeader;
case Header.bmRequestType of
1 : if Header.wLength > 0 then
b:= $00;
USB_ControlSend(@b, 1); // irgendwas zum Host senden
return(true);
endif;
|
$40 : case bRequest of // Host to Dev
0 :USB_ControlSend(nil, 0);
USB_RxSetBuf(@RxBuf); // mein Device Init RX Buffer
return(true);
|
1 : if Header.wLength > 0 then // oder Board reset
USB_ControlSend(nil, 0);
mDelay(100);
HardWareReset;
endif;
|
endcase;
end;
Gruß
miparo