2012-04-19 3 views
1

J'utilise le C8051F320 et base mon firmware sur l'exemple de firmware HID (par exemple, BlinkyExample).comprendre les tampons doubles

Les rapports d'entrée et de sortie ont chacun une longueur de 64B (un seul paquet de 64B).

J'ai activé l'ADC et l'ai défini pour 10kSps. Chaque interruption ADC, un échantillon est stocké dans un tableau. Lorsque suffisamment d'échantillons sont prélevés pour remplir un paquet, un paquet IN est envoyé.

Le logiciel envoie un rapport indiquant au microprogramme le nombre de rapports à renvoyer.

1) L'exemple de microprogramme utilise EP1, qui a 128B. Il divise l'EP en IN et OUT, 64B chacun.

Le micrologiciel supprime le premier échantillon de chaque rapport d'entrée à 10kSps. A 5kSps ça fonctionne bien. 2) J'ai modifié EP1 pour qu'il y ait un double tampon, mais il ne fait que 32 secondes maintenant. Quoi qu'il en soit, le streaming de milliers de rapports IN avec des données 10kSps fonctionne très bien (confirmé par FFT de l'onde sinusoïdale échantillonnée dans le logiciel).

3) J'ai modifié le firmware pour utiliser EP2, car il a un total de 256B, ce qui donne 64B en cas de fractionnement et de double buffering. A) Encore une fois, à 10 kps, le premier échantillon de chaque paquet est supprimé. Pourquoi? Il fonctionne bien à 5kSps.

En fait, je n'arrive pas à visualiser comment la double mise en mémoire tampon fonctionne. Si la fréquence d'échantillonnage est plus rapide que le taux de transfert HID, les FIFO déborderont malgré tout, n'est-ce pas? Comment le double tampon aide-t-il? Mais il semble que pour que le double tampon soit efficace, la taille des paquets doit être réduite de moitié.

b) Lors de la commutation des références de EP1 à EP2, je suis tombé sur ce code dans F3xx_USB0_Standard_Requests.c: DATAPTR = (unsigned char *) & ONES_PACKET ;. Définir un char * = l'adresse d'un caractère * ne me semble pas correcte. Je l'ai modifié pour DATAPTR = (unsigned char *) ONES_PACKET; Peu importe, il semble n'y avoir aucune différence. Que font les zéros et les tableaux?

Répondre

0

exemple HID firmware

HID utilise endpints type d'interruption, qui transfère les données au plus une fois par trame, ou une fois par 1 ms - selon votre descripteur HID, il peut être beaucoup plus lent . Cela donne un débit de données net d'environ 64000 octets/sec.

Une fois que vous avez besoin de transférer plus de données, utilisez des points de terminaison globaux ou isochrones.