Binome2020-4 : Différence entre versions

De Wiki de bureau d'études PeiP
m
 
(50 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 6 : Ligne 6 :
 
= Composants utilisés =
 
= Composants utilisés =
 
== Composants clés ==
 
== Composants clés ==
* Microcontrôleur : <br> ESP32-S2 (package WROVER 4MB) <br style="clear: both;"/> [[File:Firefly-serenity-usb-flash-drive.jpg|left|200px]]<br style="clear: both;"/>
+
[[File:ESP32_S2.png|right|200px]]
* Mémoire : <br> MT29F8G
+
* Microcontrôleur : ESP32-S2 (package WROVER 4MB)
 +
** dispose d'une interface Wi-Fi Station + Point d'accès
 +
** dispose de ports I2S (entrée et sortie)
 +
** dispose d'une interface USB.
 +
* Mémoire : MT29F8G
 +
<br style="clear: both;"/>
 +
 
 
== Autres ==
 
== Autres ==
 +
[[File:SPH0645LM4H.png|200px|right]]
 
* Régulateur : LDO (3.3V)
 
* Régulateur : LDO (3.3V)
 
* Boutons pour la programmation
 
* Boutons pour la programmation
 
* Microphone : SPH0645LM4H (communiquant en I2S)
 
* Microphone : SPH0645LM4H (communiquant en I2S)
 +
<br style="clear: both;" />
  
 
= Révisions =
 
= Révisions =
Ligne 17 : Ligne 25 :
 
== Rev 1 ==
 
== Rev 1 ==
 
Version la plus simple de la clé, ne pouvant que servir de disque avec accès à distance.
 
Version la plus simple de la clé, ne pouvant que servir de disque avec accès à distance.
 +
 
[[File:Rev1_Schematic.png|schéma]]
 
[[File:Rev1_Schematic.png|schéma]]
[[File:Rev1_PCB_Front.png|Face avant]]
+
 
[[File:Rev1_PCB_Back.png|left|Face arrière]]
+
{| style="float: left; height: 160px; margin-left:0.2em; border: 1px solid #bbb;"
 +
| style="border: 1px solid #bbb;" valign="middle" |[[File:Rev1_PCB_Front.png|Face Avant]]
 +
| style="border: 1px solid #bbb;" valign="middle" |[[File:Rev1_PCB_Back.png|Face Arrière]]
 +
|}
 +
 
 
<br style="clear: both;"/>
 
<br style="clear: both;"/>
Gerber : [[File:Rev1_PCB.zip]]
+
Gerber : [[File:Rev1_PCB.zip]] <br>
 
Abandonnée pour la Rev 2 le 25/01
 
Abandonnée pour la Rev 2 le 25/01
 
<br style="clear: both;"/>
 
<br style="clear: both;"/>
 +
 
== Rev 2 ==
 
== Rev 2 ==
 
Ajout d'un microphone et d'une LED de statut. (Ainsi qu'un magnifique logo)
 
Ajout d'un microphone et d'une LED de statut. (Ainsi qu'un magnifique logo)
 
[[File:Rev2_Schematic.png|left]]
 
[[File:Rev2_Schematic.png|left]]
[[File:Rev2_PCB_Front.png|thumb|left|Face avant]]
+
{| style="float: left; height: 160px; margin-left:0.2em; border: 1px solid #bbb;"
[[File:Rev2_PCB_Back.png|thumb|left|Face arrière]]
+
| style="border: 1px solid #bbb;" valign="middle" |[[File:Rev2_PCB_Front_2.png|Face Avant]]
 +
| style="border: 1px solid #bbb;" valign="middle" |[[File:Rev2_PCB_Back.png|Face Arrière]]
 +
|}
 
<br style="clear: both;"/>
 
<br style="clear: both;"/>
Gerber
+
Gerber : [[File:Rev2_PCB.zip]] <br>
Version actuelle
+
Version actuelle :
 
<br style="clear: both;"/>
 
<br style="clear: both;"/>
 +
 +
{| style="float: left; height: 160px; margin-left:0.2em; border: 1px solid #bbb;"
 +
| style="border: 1px solid #bbb;" valign="middle" |[[File:cle_avant.jpg|Face Avant|400px]]
 +
| style="border: 1px solid #bbb;" valign="middle" |[[File:cle_arriere.jpg|Face Arrière|400px]]
 +
|}
 +
 +
<br style="clear: both;"/>
 +
 +
=Programmation=
 +
 +
Le code est disponible à cette adresse : https://github.com/SheepKnight/projet-BE <br>
 +
On retrouve une bibliothèque de lecture de la nand : nand.h et nand.c, où chaque variable de type décrit l'état des broches selon l'action effectuée auprès de la mémoire (envoi de commande, d'adresse, de donnée,...) et qui <br>
 +
Le fichier msc_disk.c décrit toutes les fonctions appelées par TinyUSB, la bibliothèque qui gère les communications USB, et fait apparaître l'ESP32 en tant que Mass Storage Class. On y retrouve les callbacks appelés en cas de lecture d'un bloc, demande si la mémoire est prête,...
 +
Pour lier tout ça se trouve le main.c, où sont écrites toutes les fonctions du serveur HTTP, ainsi que les initialisations des serveurs DHCP, du point d'accès Wi-Fi, et d'initialiser les GPIO en tant qu'entrée ou sorties.
 +
 +
 +
La bibliothèque que nous avons écrite se base sur une fonction set_pins_state, qui prend en paramètre une structure appelée interface.
 +
Cette structure peut contenir l'état de toutes les broches selon l'état qu'on veut décrire (envoi d'une commande, lecture de données...)
 +
Les diverses fonctions nand_ telles que nand_reset, nand_read_id, ... ne font qu'englober successivement plusieurs set_pins_state pour rentrer dans de conditions décrites par la datasheet.
 +
Sur le bus peut être lu/écrit un octet via les fonctions read_bus et write_bus. Pour appeler ces fonctions, il faut s'assurer de changer la direction du bus avec la fonction set_bus_direction.
 +
 +
==Explications==
 +
 +
===Environnement de développement===
 +
Pour programmer l'ESP32S2 nous utiliserons [https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/ l'ESP-IDF].
 +
Celui-ci est disponible pour Linux, Mac et Windows.
 +
 +
===Téléversement vers la carte===
 +
Afin de téléverser le programme vers la carte, il faut tout d'abord la passer en mode programmation lorsque celle-ci boot. Pour ce faire le GPIO 0 doit être relié au 0V lors du démarrage. Le bouton SW2 de notre carte est prévu à cet effet. <br style="clear: both;"/>
 +
Il faut donc maintenir enfoncé SW2 pour passer le GPIO 0 à 0V, puis appuyer succinctement sur le SW1 (qui est le reset de la carte) pour la redémarrer. Une fois fait on peut relâcher SW2. La carte est en mode programmation. <br style="clear: both;"/>
 +
Il existe deux moyens pour téléverser son programme une fois compilé : <br>
 +
*Via une interface série FTDI, à connecter aux Test Points comme ceci : <br>
 +
{| |- style="font-size: 87%; text-align: center; margin-left:0.2em; border: 1px solid #bbb;"
 +
| valign="center" | Clé USB
 +
| valign="center" | TP3
 +
| valign="center" | TP4
 +
| valign="center" | TP2
 +
| valign="center" | TP1
 +
|- style="font-size: 87%; text-align: center;"
 +
| valign="center" | FTDI
 +
| valign="center" | GND
 +
| valign="center" | 3V3
 +
| valign="center" | RX
 +
| valign="center" | TX
 +
|}<br>
 +
Nous avons conçu une plateforme de programmation imprimée en 3D pour simplifier la procédure :<br>
 +
[[File:rig_stl.png|left|250px]]
 +
<br style="clear: both;"/>
 +
* Directement via le port USB en le programmant par [https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/api-guides/dfu.html DFU] (plus simple)
 +
 +
==Debug mémoire==
 +
 +
Lors de la programmation de la clé USB, nous avons rencontré des problèmes de communication avec la mémoire. Pour pouvoir analyser les signaux, nous avons développé une version breakout de notre clé USB, afin d'y connecter un analyseur logique (Hantek6022BL)
 +
 +
La datasheet de la puce est disponible [https://drive.google.com/file/d/1-Ri5bXHbGSctdOXFNLgbktU8UNHmUoxk/view?usp=sharing Ici]<br>
 +
La documentation du standard ONFI 2.1 utilisé par la NAND est disponible [https://drive.google.com/file/d/1cH_m-KeQBQLJiud7_JiVO7ihypyvS-w_/view?usp=sharing Ici]
 +
 +
 +
===Breakout de la mémoire===
 +
Un PCB breakout de la Nand MT29F8G compatible pour Breadboards a été conçu : il est disponible ici [[File:nand_breakout.zip]]. Dans notre cas, il a été fabriqué au sein des locaux de Polytech. [[File:breakout.png|left|250px]]<br style="clear: both;"/>[[File:fab_breakout.jpg|left|250px]]<br style="clear: both;"/>
 +
Assemblé avec un module [https://www.amazon.fr/Espressif-ESP32-S2-Saola-1M-Carte-de-d%C3%A9veloppement/dp/B087T2NTD6/ref=sr_1_3?dchild=1&keywords=esp32-s2&qid=1618154099&sr=8-3 ESP32-S2 Saola 1M] sur une breadboard, on obtient le montage suivant : <br style="clear: both;"/>
 +
[[File:debug_board.jpg|left|650px]]<br style="clear: both;"/>
 +
 +
===Analyse des signaux===
 +
Le code rédigé était d'abord testé sur la clé. Cependant, suite à des blocages, une analyse des signaux était nécessaire. En effet, nous n'arrivions pas à envoyer des commandes à la clé (Latch d'écriture lorsque signal montant selon la datasheet, mais descendant selon la réalité).
 +
{| |- style="font-size: 87%; text-align: center; margin-left:0.2em; border: 1px solid #bbb;"
 +
| valign="center" | Cannel 0
 +
| valign="center" | Write Protect (Inversé)
 +
|-
 +
| valign="center" | Cannel 1
 +
| valign="center" | Write Enable (Inversé)
 +
|-
 +
| valign="center" | Cannel 2
 +
| valign="center" | Address Latch Enable
 +
|-
 +
| valign="center" | Cannel 3
 +
| valign="center" | Command Latch Enable
 +
|-
 +
| valign="center" | Cannel 4
 +
| valign="center" | Chip Enable (Inversé)
 +
|-
 +
| valign="center" | Cannel 5
 +
| valign="center" | Read Enable (Inversé)
 +
|-
 +
| valign="center" | Cannel 6
 +
| valign="center" | VCC
 +
|-
 +
| valign="center" | Cannel 7
 +
| valign="center" | Ready/[Busy (Inversé)]
 +
|-
 +
| valign="center" | Cannel 8-15
 +
| valign="center" | IO0-7
 +
|}
 +
[[File:debug_signal.png|right|650px]] <br style="clear: both;"/>
 +
 +
==Envoi de diverses commandes==
 +
 +
===Reset===
 +
Cette opération ne consiste qu'à envoyer la commande FF et d'attendre que le signal R/B# Repasse à haut. <br>
 +
 +
[[File:nand_reset.png|center|450px]]
 +
 +
===Erase===
 +
 +
Cette commande permet d'effacer un bloc de la mémoire : il faut envoyer la commande 60 et l'adresse du bloc (3 octets), puis la commande D0.
 +
 +
[[File:nand_erase.png|center|450px]]
 +
 +
===Write===
 +
 +
On envoie la commande 80, l'adresse de la page qu'on souhaite modifier (5 octets), puis les données. On clôture l'écriture de la page par la commande 10. On se soucie ensuite de l'état de la mémoire en lui demandant son statut avec la commande 70, et en lisant un octet où chaque bit correspond à une information. (page 70 de la datasheet)<br>
 +
 +
[[File:nand_write0.png|center|450px]]<br>
 +
[[File:nand_write1.png|center|450px]]<br>
 +
[[File:nand_write2.png|center|450px]]<br>
 +
 +
===Read===
 +
 +
Afin de lire les données écrites, il faut envoyer la commande 00, l'adresse que l'on souhaite lire (5 octets) et la commande 30, suivie par des cycles de lecture. <br>
 +
 +
[[File:nand_read.png|center|450px]]<br>
 +
 +
=Wi-Fi=
 +
 +
La clé génère un point d'accès sécurisé, auquel peuvent se connecter jusqu'à 5 clients. La clé a un serveur HTTP sur son port 80 auquel on peut se connecter, via l'ip '''192.168.4.1'''<br style="clear: both;"/>
 +
 +
[[File:wifiAP.jpg|center|450px]]<br>
 +
 +
Il y a diverses interfaces Web pour accéder à certaines fonctionnalités :
 +
 +
==Contrôle de la LED==
 +
 +
'''192.168.4.1/led_on''' et '''192.168.4.1/led_off''' permettent d'allumer et d'éteindre la LED verte.<br>
 +
[[File:wifiAP.gif|center|450px]]<br>
 +
 +
==Lecture de l'id de la mémoire==
 +
'''192.168.4.1/nand_info''' nous sert l'identifiant de la mémoire NAND.<br>
 +
4f4e4649 est bien l'identifiant attendu selon la page 52<br>
 +
[[File:web_id.png|center|450px]]<br>
 +
 +
==Debug de la mémoire==
 +
'''192.168.4.1/debug_nand''' a 3 fonctions. Le premier appel efface un bloc à une certaine adresse. Le deuxième écrit une phrase à cette même adresse. Le troisième lit le bloc écrit à l'appel 2.
 +
 +
=Problématiques=
 +
 +
Nous n'avons malheureusement pas pu compléter le cahier des charges que nous nous étions imposés. Voici les points qui ont pêché.
 +
 +
==Mémoire==
 +
 +
Nous n'avons pu écrire/lire sur la mémoire NAND. Des valeurs (toujours les mêmes au même endroit) sont toujours retournées par la clé mais ne correspondent pas aux données écrites. La clé se présente tout de même comme une clé USB une fois branchée, il est juste impossible de la formater.
 +
 +
==Micro==
 +
 +
Par faute de temps, nous n'avons pu implémenter la fonctionnalité de microphone I2S.
 +
 +
Cependant, l'interface de contrôle WiFi fonctionne, la clé se présente bien comme un périphérique de stockage USB une fois branchée, et nous arrivons à établir une communication avec la mémoire NAND.

Version actuelle datée du 12 mai 2021 à 15:54

Introduction

Au cours de ce BE, nous (Albin Mouton et Jérémy Verschoore de la Houssaye) avons décidé de concevoir une clé USB disposant d'une mémoire de 8Go, pouvant se connecter à un réseau WiFi, afin de permettre un accès à distance de son contenu.
De plus nous espérons pouvoir ajouter une fonctionnalité microphone, permettant d'enregistrer l'utilisateur (à son insu ?)

Composants utilisés

Composants clés

ESP32 S2.png
  • Microcontrôleur : ESP32-S2 (package WROVER 4MB)
    • dispose d'une interface Wi-Fi Station + Point d'accès
    • dispose de ports I2S (entrée et sortie)
    • dispose d'une interface USB.
  • Mémoire : MT29F8G


Autres

SPH0645LM4H.png
  • Régulateur : LDO (3.3V)
  • Boutons pour la programmation
  • Microphone : SPH0645LM4H (communiquant en I2S)


Révisions

Rev 1

Version la plus simple de la clé, ne pouvant que servir de disque avec accès à distance.

schéma

Face Avant Face Arrière


Gerber : Fichier:Rev1 PCB.zip
Abandonnée pour la Rev 2 le 25/01

Rev 2

Ajout d'un microphone et d'une LED de statut. (Ainsi qu'un magnifique logo)

Rev2 Schematic.png
Face Avant Face Arrière


Gerber : Fichier:Rev2 PCB.zip
Version actuelle :

Face Avant Face Arrière


Programmation

Le code est disponible à cette adresse : https://github.com/SheepKnight/projet-BE
On retrouve une bibliothèque de lecture de la nand : nand.h et nand.c, où chaque variable de type décrit l'état des broches selon l'action effectuée auprès de la mémoire (envoi de commande, d'adresse, de donnée,...) et qui
Le fichier msc_disk.c décrit toutes les fonctions appelées par TinyUSB, la bibliothèque qui gère les communications USB, et fait apparaître l'ESP32 en tant que Mass Storage Class. On y retrouve les callbacks appelés en cas de lecture d'un bloc, demande si la mémoire est prête,... Pour lier tout ça se trouve le main.c, où sont écrites toutes les fonctions du serveur HTTP, ainsi que les initialisations des serveurs DHCP, du point d'accès Wi-Fi, et d'initialiser les GPIO en tant qu'entrée ou sorties.


La bibliothèque que nous avons écrite se base sur une fonction set_pins_state, qui prend en paramètre une structure appelée interface. Cette structure peut contenir l'état de toutes les broches selon l'état qu'on veut décrire (envoi d'une commande, lecture de données...) Les diverses fonctions nand_ telles que nand_reset, nand_read_id, ... ne font qu'englober successivement plusieurs set_pins_state pour rentrer dans de conditions décrites par la datasheet. Sur le bus peut être lu/écrit un octet via les fonctions read_bus et write_bus. Pour appeler ces fonctions, il faut s'assurer de changer la direction du bus avec la fonction set_bus_direction.

Explications

Environnement de développement

Pour programmer l'ESP32S2 nous utiliserons l'ESP-IDF. Celui-ci est disponible pour Linux, Mac et Windows.

Téléversement vers la carte

Afin de téléverser le programme vers la carte, il faut tout d'abord la passer en mode programmation lorsque celle-ci boot. Pour ce faire le GPIO 0 doit être relié au 0V lors du démarrage. Le bouton SW2 de notre carte est prévu à cet effet.
Il faut donc maintenir enfoncé SW2 pour passer le GPIO 0 à 0V, puis appuyer succinctement sur le SW1 (qui est le reset de la carte) pour la redémarrer. Une fois fait on peut relâcher SW2. La carte est en mode programmation.
Il existe deux moyens pour téléverser son programme une fois compilé :

  • Via une interface série FTDI, à connecter aux Test Points comme ceci :
Clé USB TP3 TP4 TP2 TP1
FTDI GND 3V3 RX TX

Nous avons conçu une plateforme de programmation imprimée en 3D pour simplifier la procédure :

Rig stl.png


  • Directement via le port USB en le programmant par DFU (plus simple)

Debug mémoire

Lors de la programmation de la clé USB, nous avons rencontré des problèmes de communication avec la mémoire. Pour pouvoir analyser les signaux, nous avons développé une version breakout de notre clé USB, afin d'y connecter un analyseur logique (Hantek6022BL)

La datasheet de la puce est disponible Ici
La documentation du standard ONFI 2.1 utilisé par la NAND est disponible Ici


Breakout de la mémoire

Un PCB breakout de la Nand MT29F8G compatible pour Breadboards a été conçu : il est disponible ici Fichier:Nand breakout.zip. Dans notre cas, il a été fabriqué au sein des locaux de Polytech.
Breakout.png

Fab breakout.jpg

Assemblé avec un module ESP32-S2 Saola 1M sur une breadboard, on obtient le montage suivant :

Debug board.jpg

Analyse des signaux

Le code rédigé était d'abord testé sur la clé. Cependant, suite à des blocages, une analyse des signaux était nécessaire. En effet, nous n'arrivions pas à envoyer des commandes à la clé (Latch d'écriture lorsque signal montant selon la datasheet, mais descendant selon la réalité).

Cannel 0 Write Protect (Inversé)
Cannel 1 Write Enable (Inversé)
Cannel 2 Address Latch Enable
Cannel 3 Command Latch Enable
Cannel 4 Chip Enable (Inversé)
Cannel 5 Read Enable (Inversé)
Cannel 6 VCC
Cannel 7 Ready/[Busy (Inversé)]
Cannel 8-15 IO0-7
Debug signal.png

Envoi de diverses commandes

Reset

Cette opération ne consiste qu'à envoyer la commande FF et d'attendre que le signal R/B# Repasse à haut.

Nand reset.png

Erase

Cette commande permet d'effacer un bloc de la mémoire : il faut envoyer la commande 60 et l'adresse du bloc (3 octets), puis la commande D0.

Nand erase.png

Write

On envoie la commande 80, l'adresse de la page qu'on souhaite modifier (5 octets), puis les données. On clôture l'écriture de la page par la commande 10. On se soucie ensuite de l'état de la mémoire en lui demandant son statut avec la commande 70, et en lisant un octet où chaque bit correspond à une information. (page 70 de la datasheet)

Nand write0.png

Nand write1.png

Nand write2.png

Read

Afin de lire les données écrites, il faut envoyer la commande 00, l'adresse que l'on souhaite lire (5 octets) et la commande 30, suivie par des cycles de lecture.

Nand read.png

Wi-Fi

La clé génère un point d'accès sécurisé, auquel peuvent se connecter jusqu'à 5 clients. La clé a un serveur HTTP sur son port 80 auquel on peut se connecter, via l'ip 192.168.4.1

WifiAP.jpg

Il y a diverses interfaces Web pour accéder à certaines fonctionnalités :

Contrôle de la LED

192.168.4.1/led_on et 192.168.4.1/led_off permettent d'allumer et d'éteindre la LED verte.

WifiAP.gif

Lecture de l'id de la mémoire

192.168.4.1/nand_info nous sert l'identifiant de la mémoire NAND.
4f4e4649 est bien l'identifiant attendu selon la page 52

Web id.png

Debug de la mémoire

192.168.4.1/debug_nand a 3 fonctions. Le premier appel efface un bloc à une certaine adresse. Le deuxième écrit une phrase à cette même adresse. Le troisième lit le bloc écrit à l'appel 2.

Problématiques

Nous n'avons malheureusement pas pu compléter le cahier des charges que nous nous étions imposés. Voici les points qui ont pêché.

Mémoire

Nous n'avons pu écrire/lire sur la mémoire NAND. Des valeurs (toujours les mêmes au même endroit) sont toujours retournées par la clé mais ne correspondent pas aux données écrites. La clé se présente tout de même comme une clé USB une fois branchée, il est juste impossible de la formater.

Micro

Par faute de temps, nous n'avons pu implémenter la fonctionnalité de microphone I2S.

Cependant, l'interface de contrôle WiFi fonctionne, la clé se présente bien comme un périphérique de stockage USB une fois branchée, et nous arrivons à établir une communication avec la mémoire NAND.