2 points par GN⁺ 2024-06-04 | 1 commentaires | Partager sur WhatsApp

Guide de développement de périphériques USB

Sommaire

  • Contexte
  • Qu’est-ce que l’USB ?
  • Les fils USB
    • Points d’attention concernant l’USB-C
    • Transmission des données via une paire différentielle
  • L’USB sur un PCB
  • Les différentes vitesses de l’USB
    • Brève remarque sur la vitesse au niveau du PCB
  • Couches protocole et logicielle
    • Classes de périphériques USB et manière dont l’hôte les utilise
  • Créer un périphérique de port série
    • Microcontrôleur STM32 et carte Nucleo
    • Configuration du port USB réel
    • Écriture du logiciel
    • Flashage et exécution
  • Conclusion

Contexte

  • Les périphériques USB sont utiles pour étendre les fonctionnalités d’un ordinateur.
  • Le but de cet article est de guider la création d’un périphérique USB de bout en bout.

Qu’est-ce que l’USB ?

  • L’USB est une norme industrielle pour l’échange de données et l’alimentation électrique.
  • L’USB est un bus série, où les bits sont transmis un par un.
  • L’USB ne se limite pas à une simple norme de connexion, il inclut aussi un protocole de communication.

Les fils USB

  • Une connexion USB 2.0 comporte 4 fils principaux :
    • Fil +5V : fournit l’alimentation de l’hôte vers le périphérique.
    • Fils D- et D+ : transmettent 1 bit sous forme de paire différentielle.
    • Fil GND : sert de masse.

Points d’attention concernant l’USB-C

  • L’USB-C peut être branché dans les deux sens.
  • L’USB-C n’indique ni la vitesse ni la version.

Transmission des données via une paire différentielle

  • Une paire différentielle utilise deux fils pour transmettre un bit.
  • Une paire différentielle est avantageuse pour éliminer le bruit de tension.

L’USB sur un PCB

  • Lors de l’ajout d’un connecteur USB sur un PCB, il faut conserver la même longueur pour la paire différentielle.
  • Les pistes de la paire différentielle doivent être proches l’une de l’autre.
  • Il faut maintenir une impédance spécifique.

Les différentes vitesses de l’USB

  • L’USB 2.0 peut fonctionner en full speed (12 Mbit/s) et en high speed (480 Mbit/s).
  • L’hôte et le périphérique négocient la vitesse lors de la connexion.

Brève remarque sur la vitesse au niveau du PCB

  • En full speed, les contraintes sur l’impédance et la longueur des pistes sont moins strictes.

Couches protocole et logicielle

  • L’USB fonctionne comme un réseau, avec différents endpoints et configurations.
  • L’hôte reconnaît et utilise les périphériques USB via des pilotes.

Classes de périphériques USB et manière dont l’hôte les utilise

  • Le système d’exploitation reconnaît différentes classes de périphériques USB.
  • Par exemple, les périphériques de stockage de masse ou les périphériques série.

Créer un périphérique de port série

  • Création d’un périphérique USB simple de port série.
  • Utilisation d’un microcontrôleur STM32 et d’une carte Nucleo.

Microcontrôleur STM32 et carte Nucleo

  • Utilisation de la carte NUCLEO-F103RB.
  • La carte se compose d’un programmateur et d’un microcontrôleur.

Configuration du port USB réel

  • Configuration du port USB et réglage du cavalier pour utiliser une alimentation externe 5V.
  • Configuration des broches PA12 et PA11 en USB_DP et USB_DM.
  • Ajout d’une résistance de 1.5 kΩ en pull-up sur la broche PA12.

Écriture du logiciel

  • Configuration du mode périphérique USB dans STM32CubeIDE.
  • Réglage en périphérique de port série pour qu’il soit reconnu par l’hôte.
  • Écriture du code pour allumer la LED dans la routine CDC_Receive_FS.

Flashage et exécution

  • Compilation du code et flashage sur la carte avec STM32CubeProgrammer.
  • Connexion de la carte à une alimentation externe 5V et contrôle de la LED via le port série.

Conclusion

  • Création d’un périphérique USB de port série de bout en bout.
  • Les nombreux morceaux de code boilerplate de STM32CubeIDE et sa configuration via interface peuvent être contraignants.
  • Utiliser un SoC basé sur Linux peut être une approche plus propre.

L’avis de GN⁺

  • Code boilerplate de STM32CubeIDE : une grande quantité de code boilerplate peut compliquer la revue de code.
  • Approche basée sur Linux : utiliser un SoC Linux permet des API plus standardisées et une séparation du code plus propre.
  • Impédance et longueur des pistes : pour les connexions USB haut débit, il faut prêter attention à l’impédance et à la longueur des pistes.
  • Avantages de la paire différentielle : la paire différentielle aide à éliminer le bruit de tension, ce qui permet une transmission de données plus stable.
  • Choix du microcontrôleur : il est important de choisir un microcontrôleur adapté au projet. Il existe de nombreuses options au-delà de STM32.

1 commentaires

 
GN⁺ 2024-06-04
Commentaires Hacker News
  • Avis sur l’utilisation des microcontrôleurs ST : Bon article sur l’usage de l’USB, mais centré sur les microcontrôleurs ST. Ces derniers temps, l’écosystème ESP32 offre une approche plug-and-play plus simple. Pour les débutants, utiliser un CI de contrôleur USB basique est plus adapté que de travailler à haute vitesse.

  • Expérience des tests de conformité USB : Lors de tests de conformité USB effectués il y a longtemps, il y avait beaucoup de problèmes avec le test du courant d’appel. Il est facile de se concentrer sur la conception numérique haute vitesse, mais dans les tests de conformité, les petits détails comptent.

  • Conseils liés à l’USB-C : Il faut connecter les broches CC aux résistances appropriées. En USB 2.0, le routage différentiel et l’impédance ne posent pas un gros problème. Il suffit de faire des connexions directes avec des longueurs similaires.

  • Proposition d’alternatives au STM32 : Si souder un processeur ARM est difficile, il peut être intéressant d’envisager un petit contrôleur ou l’utilisation de la bibliothèque VUSB. Si vous préférez une programmation de style Arduino, de nombreuses cartes peuvent être facilement utilisées comme périphériques USB.

  • ESP32 et méthodes de bidouillage à bas coût : J’utilise principalement l’ESP32, mais il est possible de créer un contrôleur personnalisé bon marché et robuste en réutilisant la carte de contrôle d’un clavier USB mis au rebut.

  • Prise en charge de la réception de plus de 64 octets sur STM32 : Question sur la manière de recevoir des trames de plus de 64 octets. Les réglages décrits dans le manuel de référence ne correspondent pas à des registres généraux, ce qui complique les choses.

  • Expérience d’écriture de code USB bare metal : Écrire du code USB bare metal sur un MCU est plus complexe que SPI ou I2C. Il vaut mieux exploiter au maximum le logiciel fourni par le fournisseur. Pour les transferts à haute vitesse, il faut utiliser des transferts bulk et vérifier les problèmes côté hôte.

  • Création d’un périphérique USB virtuel : Utilisation d’un Raspberry Pi pour créer un périphérique USB virtuel et le connecter à un PC. Il sert à émuler un appareil photo MTP afin de tromper un logiciel.

  • Question sur une carte de développement avec prise en charge de l’USB 3 : Je cherche à prototyper un récepteur de moniteur USB-C, mais il est difficile de trouver une carte suffisamment puissante pour recevoir du DisplayPort.

  • Coût d’utilisation de l’USB : L’USB n’est pas gratuit. Il faut payer des frais uniques de 6 000 $ pour obtenir un Vendor ID.