IMA2a4 2022/2023 P1

De Wiki de Projets IMA

Présentation générale

Objectifs

Conception, réalisation et programmation d’une clef USB réaliste.

Contexte

En bureau d’études PeiP systèmes embarqués [[1]] nous faisons réaliser des clefs USB aux élèves depuis 3 ans. Mais ces clefs sont très limitées en capacité, les mémoires utilisées, faciles à adresser, ne dépassant pas les quelques Mo. Le but de ce projet est de concevoir une clef USB de l’ordre de quelques Go avec une gestion de mémoire réaliste pour une durée de vie de la clef raisonnable.

Les mémoires flash de grande taille sont :

  1. généralement à accès parallèle et non série (comme les mémoires SPI utilisées en BE PeiP) ;
  2. sans aucun mécanisme de gestion de l’usure (comme les mémoires utilisées en BE PeiP) ;
  3. de type NAND, à savoir que l’on ne peut que transformer des 1 en 0, si l’on souhaite revenir sur des 1, il faut réinitialiser toute une page avec que des 1.

Mais surtout ces mémoires sont imparfaites :

  • des erreurs peuvent se produire dans certains blocs (quelques bits mais pas si rarement que cela) ;
  • des pages complètes peuvent ne plus pouvoir être réinitialisées (selon les mémoires les pages peuvent être réinitialisées 3000 à 10000 fois suivant les modéles).

Cahier des charges

En plus de la programmation USB de type « mémoire de masse » vous devrez implanter les dispositifs suivants :

  • une table pour repérer les pages hors services ;
  • un dispositif de correction d’erreur dans les blocs (vous utiliserez l’algorithme de hamming avec un nombre de bits adapté à la fois au taux d’erreurs de la mémoire et à la fois au nombres d’octets disponibles pour stocker ces bits de correction d’erreur) ;
  • un dispositif de réduction d’usure comptant le nombre de réinitialisation des pages et permettant de déplacer des blocs souvent modifiés vers d’autres adresses.

Il est fortement recommandé de simuler tous ces dispositifs sur un PC pour tester tous les éléments avant implantation dans le microcontrôleur.

Du coté matériel vous pourrez vous aider des schémas de clefs sur le Wiki des PeiP. Il est cependant conseillé de passer d’un ATMega16u2 à un ATMega32u4 pour disposer de plus d’E/S et de bus. En effet pour implanter les tables nécessaires au fonctionnement des dispositifs décrits ci-dessus, il est conseillé d’ajouter une mémoire SPI plutôt que d’essayer d’implanter les tables sur la mémoire flash principale.

Implantez aussi des points d’accès USB sur votre clef pour pouvoir obtenir des informations sur la gestion des blocs sur la clef :

  • lister les pages hors service ;
  • récupérer le nombre d’écritures pour des blocs donnés ;
  • récupérer le nombre d’erreurs pour des blocs donnés.

Ecrivez aussi le programme PC permettant de récupérer ces informations pour afficher des statistiques sur la clef.

Cahier des spécifications

Diagramme de Gantt prévisionnel

Partie électronique

La première version de la clé usb (type C) est équipée d'un Atmega32u4, elle a la capacité d'accueillir deux puces NAND d'une capacité jusqu'à 8Go chacune. La carte expose aussi les points de tests pour utiliser un cable usb 2.0 dans le cas d'un problème avec l'USB type C, trois LEDs (dont une uniquement pour signaler le status alimenté et deux contrôlables directement par le microcontrôleur), un bornier pour l'ISP (ne sera pas soudé par défaut) et d'un bornier pour du JTAG (ne sera pas soudé non plus par défaut). J'aurais aimé aussi inclure une sortie UART pour servir de console durant la phase de développement, cependant tous les pins sont utilisés sauf un.

Première version du schématique
Rendu 3D

Gerber : Fichier:Bgermond-gerber-v1.0.zip


Première version de la carte

Tous les composants ont été soudés sans problème en utilisant de la pâte à abraser basse température. La deuxième étape était de vérifier l'absence de court-circuit entre le 3.3V - GND ou 5V - GND et bonne nouvelle ! Il n'y en avait pas.

Plus qu'à brancher... et ça ne fonctionne pas !

Diagnostiquons : la led rouge (indicateur d'une tension 3.3V sur la carte) était éteinte et effectivement en utilisant le port type C, on ne retrouve pas de tension 5V sur VBUS. Il y a probablement soit un problème avec la soudure ou sinon c'est un problème durant la négociation de la tension d'alimentation, mais je ne suis pas allé plus loin dans le diagnostic.

En connectant un port USB sur les points de test USB2.0 (face du dessous) et en connectant à un ordinateur, la LED d'alimentation s'allume MAIS absolument rien sur l'USB...

Normal, j'ai oublié de rajouter les points de soudure pour relier la paire différentielle au microcontrôleur (présent sur la face avec microcontrôleur, qu'on appellera la face du dessus).

Première erreur sur ma carte : ne pas sous-estimer la propriété "étain-phobe" du masque, ils ne se connectent absolument pas facilement même s'ils sont à 0,6mm d'écart.

Après les avoir connectés, l'ordinateur ne détecte toujours rien. C'est encore normal, les deux pistes (D+ et D-) doivent passer par des résistances de 20Ω que j'ai placé en amont, je vais donc corriger cela tel que :

Bgermond-Fix-USB-resistance-20R.jpg

Et maintenant, il se passe quelque chose sur le pc :

[ 2236.443184] usb 3-4.1: new low-speed USB device number 49 using xhci_hcd
[ 2236.443724] usb 3-4.1: Device not responding to setup address.
[ 2236.651653] usb 3-4.1: Device not responding to setup address.
[ 2236.859181] usb 3-4.1: device not accepting address 49, error -71
[ 2236.859459] usb 3-4-port1: unable to enumerate USB device

Liens externes

Lien GitLab :

Présentation projet final :

Rapport final :