2016-12-17 4 views
0

J'utilise le LPC2368 pour communiquer avec un PC en utilisant USB CDC. Lorsque PC envoie la commande à LPC sur Bulk Out End Point 2, LPC2368 reçoit 4104 octets de UART qui est envoyé au PC via USB CDC Bulk IN Endpoint 2.USB CDC Bulk IN Endpoint Freeze

Sur PC, ces données sont considérées comme étant virtuelles. com port, ce qui me permet de voir les données (envoyées au PC) sur hypertermial.

Il existe certaines commandes pour lesquelles la réponse est inférieure à 64 octets. Après l'envoi de la commande pour obtenir ces 4104 octets, les 4014 octets sont reçus avec succès de l'UART et envoyés en boucle (pour la transmission en bloc, 64 octets seulement peuvent être envoyés en une fois) au PC.

Maintenant, si n'importe quelle commande est envoyée après avoir reçu les 4104 octets, aucune réponse n'est vue. Seulement, après avoir envoyé la commande deux fois j'obtiens la réponse.

Quelqu'un peut-il guider pour résoudre ce problème de l'USB?

Répondre

1

pour la transmission en vrac seulement 64 octets peuvent être envoyés en une seule fois

Oui, et la connexion « bloque » si votre dernière transaction est exactement 64 octets. La raison est une caractéristique peu connue des conduites en vrac qui traite des transactions consécutives de 64 octets (taille maximale des paquets) en tant que transaction unique plus importante. Tout paquet inférieur à la taille maximale des paquets terminera une transaction. Une correction est simple: si vous n'avez plus d'octets à transmettre après un paquet de 64 octets, transmettez simplement un zéro paquet. Oui, c'est un paquet ne contenant pas d'octets de données.

La plupart des codes d'exemple USB2UART n'implémentent pas ce correctif, car l'UART n'est généralement pas assez rapide pour remplir le fifo à 64 octets en premier lieu.

+0

Merci d'avoir répondu. J'étais en congé donc je ne pouvais pas revenir immédiatement. ** Tout paquet inférieur à la taille maximale du paquet finira une transaction. ** Donc, oui, j'envoie 64 paquets en boucle, 64 fois plus les 8 derniers octets du dernier paquet. ** juste transmettre un paquet zéro. Oui, c'est un paquet ne contenant pas d'octets de données **. Cela signifierait que ** USB_WriteEP (0x82, (unsigned char *) & Buffer [0], _0_); **; droite? –

+0

J'ai essayé le paquet de longueur zéro mais il ne répond pas jusqu'à ce que la commande soit envoyée deux fois. –

+0

"Raison est une fonctionnalité peu connue des conduites en bloc qui traite des transactions consécutives de 64 octets (taille maximale des paquets) en tant que transaction unique de plus grande taille." Je n'ai pas compris cette partie. Est-ce conforme à la spécification USB? Est-ce une fonctionnalité de tuyau en vrac selon les spécifications USB? S'il vous plaît laissez-moi savoir le si vous avez référence à la spécification sur cette limitation. – Shaibal