2013-01-02 3 views
2

J'ai écrit un programme simple (basé sur le tutoriel following) qui envoie des données d'une puce AVR (Attiny 2313) à l'ordinateur via un port USB, puisque l'appareil n'a pas de port USB intégré, j'ai utilisé la bibliothèque V-USB pour émuler un tel port via un logiciel.Interfaçage d'un périphérique libUSB alimenté par la bibliothèque V-USB pour AVR

Le périphérique fonctionne comme prévu, et je n'ai eu aucun problème pour l'interfacer avec C en utilisant la bibliothèque libusb, Cependant je veux y accéder avec Java, donc j'ai recherché une implémentation java de libusb.La seule bibliothèque J'ai réussi à mettre en place, et il a réussi à trouver l'usb sur le bus était "libusb-win32 wrapper".

Le seul problème est que le dispositif lève une exception lorsque je tente d'ouvrir

ch.ntb.usb.USBException: No USB endpoints found. Check the device configuration 
at ch.ntb.usb.Device.updateMaxPacketSize(Device.java:82) 
at ch.ntb.usb.Device.initDevice(Device.java:114) 

Comment peut-il être fixé? Y a-t-il une autre façon de le faire? une recommandation?

Voici le code qui lève l'exception

Device dev = USB.getDevice((short) 0x16c0, (short) 0x05dc); 
dev.open(1, 0, -1); 

ici est des données que je suis sur le dispositif viw USBView

Device Descriptor: 
bcdUSB:    0x0110 
bDeviceClass:   0xFF 
bDeviceSubClass:  0x00 
bDeviceProtocol:  0x00 
bMaxPacketSize0:  0x08 (8) 
idVendor:   0x16C0 
idProduct:   0x05DC 
bcdDevice:   0x0100 
iManufacturer:  0x01 
0x0409: "[email protected]" 
iProduct:    0x02 
iSerialNumber:  0x00 
bNumConfigurations: 0x01 

ConnectionStatus: DeviceConnected 
Current Config Value: 0x01 
Device Bus Speed:  Low 
Device Address:  0x03 
Open Pipes:    0 

Configuration Descriptor: 
wTotalLength:  0x0012 
bNumInterfaces:  0x01 
bConfigurationValue: 0x01 
iConfiguration:  0x00 
bmAttributes:   0x80 (Bus Powered) 
MaxPower:    0x32 (100 Ma) 

Interface Descriptor: 
bInterfaceNumber:  0x00 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x00 
bInterfaceSubClass: 0x00 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

related question la réponse, mais je ne pouvais pas comprendre ce qu'il faut changer , et si c'est lié à l'appareil, comment cela peut-il être fait avec un VUSB?

Répondre

2

La bibliothèque suivante ne prend pas en charge un périphérique sans point de terminaison et ne compte pas le point de terminaison de contrôle en tant que point de terminaison. Je résous cela en activant un autre point de terminaison que je n'utiliserai pas.

Pour activer un autre point final ouvrir le fichier suivant usbconfig.h dans le dossier V-USB et rechercher la ligne suivante et changer à 1.

#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 //default 0 

Maintenant, vous pouvez utiliser la commande point d'extrémité pour la communication à faible vitesse avec la fonction controlMsg().

ici vous pouvez voir (via USBView) que le dispositif a maintenant un point final d'interruption

Endpoint Descriptor: 
bEndpointAddress:  0x81 IN 
Transfer Type: Interrupt 
wMaxPacketSize:  0x0008 (8) 
bInterval:   0x0A 
+1

ah désolé, na pas lu votre commentaire sur mon post ... oui, ce fut le même problème pour moi. J'avais besoin d'activer un "vrai" point final, qui peut être trouvé par Java. mais si le point de terminaison existe, vous pouvez simplement utiliser le style controlmsg basé sur l'interruption ... – reox