2013-08-05 1 views
2

En utilisant l'exemple Keil USB HID, j'ai finalement réussi à obtenir l'enregistrement de mon périphérique qui utilise un LPC2148 dans Windows; l'exemple USB HID a nécessité quelques réglages. J'utilise la méthode de transfert d'interruption. J'utilise USBlyzer pour renifler mes transferts de données USB.LPC2148 Envoi/Réception de données USB

Sur le côté Windows, j'utilise actuellement une bibliothèque C# USB (http://www.codeproject.com/Articles/18099/A-USB-HID-Component-for-C) pour me connecter à mon appareil. Mon objectif pour tester le transfert de données est d'envoyer un octet à l'appareil pour qu'il effectue une opération mathématique triviale (comme l'ajout de 2) et renvoie la nouvelle valeur pour que je puisse vérifier que les calculs ont été effectués correctement et les données a été envoyé et reçu correctement. À l'heure actuelle, il est énuméré, mais j'ai des problèmes à obtenir le LPC2148 pour envoyer/recevoir des données. J'ai trouvé cet article (http://www.keil.com/forum/19713/) qui a expliqué comment envoyer des données à l'hôte.

Il avait le code suivant:

usbuser.c

#if USB_CONFIGURE_EVENT 
void USB_Configure_Event (void) { 
    if (USB_Configuration) {     /* Check if USB is configured */ 
     GetInReport(); 
     USB_WriteEP(0x81, &InReport, sizeof(InReport)); 
    } 
} 
#endif 

void USB_EndPoint1 (DWORD event) { 

    switch (event) { 
     case USB_EVT_IN: 
     GetInReport(); 
     USB_WriteEP(0x81, &InReport, sizeof(InReport)); 
    break; 
    } 
} 

J'ai utilisé cette technique, mais a trouvé plusieurs problèmes: 1. Il envoie en continu et très rapide alors que je ne veux que pour envoyer des données après il reçoit un octet de données et je veux seulement qu'il envoie une fois. 2. Il semblerait que GetInReport ne faisait rien parce que dans ma méthode avec ce nom je l'avais mise à jour InReport avec une variable qui était constamment incrémentée de 1. Mais dans mes données reçues elle restait toujours la valeur par défaut et ne changeait jamais. 3. Ce code n'a pas de place pour recevoir des données de l'ordinateur.

Répondre

1

Essayez de changer votre point final recevoir d'interruption en mode en vrac dans « usbdesc.c » comme suit:

/* Endpoint, HID Interrupt In */ 
USB_ENDPOINT_DESC_SIZE,   /* bLength */ 
USB_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */ 
USB_ENDPOINT_IN(1),    /* bEndpointAddress */ 
//USB_ENDPOINT_TYPE_INTERRUPT,  /* bmAttributes */ 
USB_ENDPOINT_TYPE_BULK, //--Here 
WBVAL(0x0004),      /* wMaxPacketSize */ 
........... 
+0

J'avais l'impression à mes besoins Interrompre est la meilleure méthode de transfert. Je crois que j'ai trouvé un autre couple de liens sur la façon d'ajouter des conclusions finales. Mon plus gros problème maintenant est mon USB se connecte parfois et ne se comporte pas correctement quand il le fait. –