Programmeur d'EEPROM en MicroPython
Bonjour Amis Maker,
Fin juin, je publiais l'article "Lecture d'une EEPROM avec MicroPython", le premier pas en vue de remplacer les UV EPROM 27512 (64 Kio) du projet de rétro-ingénierie Z80.
Après 15 jours, j'ai enfin réussi à écrire/flasher ma première EEPROM avec un contenu prédéfini ! :-))))))))))
25/07/2023 : mise-à-jour
Je n'aurais jamais cru que flasher une EEPROM puisse être aussi frustrant.
- La lecture fonctionne impeccablement
- L'écriture à fonctionné mais est-ce vraiment fiable (c'est que j'ai des EEProm qui ont chauffées un peu trop a mon goût).
- L'effacement n'a jamais démontré un bon fonctionnement... pourtant c'est assez simple à mettre en oeuvre.
Je me suis pourtant penché sérieusement sur les différents diagrammes. J'en viens à me demander ce que je raté d'essentiel.
Enfer et damnation!
Créer un programmeur d'EEPROM sous MicroPython
La carte du dernier article à fait l'objet d'un premier round de production pour tester le concept.
Créer mon propre programmateur d'EEPROM 27C512 et le faire fonctionner sous MicroPython avec un Raspberry-Pi Pico c'est quand même un sacré défis.
Adaptation de la carte release r1 vers schéma r3 |
C'est que la programmation de l'EEPROM réclame une gestion précise des signaux... sinon, cela ne fonctionne simplement pas!
Schéma du programmateur d'EEPROM (source ici) |
write_eeprom.py
Le script d'exemple write_eeprom.py suis donc scrupuleusement (autant que faire se peu) les opérations permettant d'écrire un bloc de donnée de 1Ko dans l'EEPROM.
A savoir, les 4 étapes préconisées:
- Effacer l'EEPROM
- Vérifier que la totalité de l'EEPROM est à 0xFF
- Programmation de la totalité de l'EEPROM
- Relecture de la totalité de l'EEPROM
Au final, après relecture j'obtiens le contenu attendu depuis l'EEPROM:
0x0000 : 20 20 5F 5F 20 20 20 20 20 20 5F 20 20 20 20 0D : __ _ . 0x0010 : 6F 27 27 29 7D 5F 5F 5F 5F 2F 2F 20 20 20 20 0D : o'')}____// . 0x0020 : 20 60 5F 2F 20 20 20 20 20 20 29 20 20 20 20 0D : `_/ ) . 0x0030 : 20 28 5F 28 5F 2F 2D 28 5F 2F 20 20 20 20 20 0D : (_(_/-(_/ . 0x0040 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0050 : 2C 2D 2E 5F 5F 5F 2C 2D 2E 20 20 20 20 20 20 0D : ,-.___,-. . 0x0060 : 5C 5F 2F 5F 20 5F 5C 5F 2F 20 20 20 20 20 20 0D : \_/_ _\_/ . 0x0070 : 20 20 29 4F 5F 4F 28 20 20 20 20 20 20 20 20 0D : )O_O( . 0x0080 : 20 7B 20 28 5F 29 20 7D 20 20 20 20 20 20 20 0D : { (_) } . 0x0090 : 20 20 60 2D 5E 2D 27 20 20 20 20 20 20 20 20 0D : `-^-' . 0x00A0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x00B0 : 20 20 20 7C 5C 7C 5C 20 20 20 20 20 20 20 20 0D : |\|\ . 0x00C0 : 20 20 2E 2E 20 20 20 20 5C 20 20 20 20 20 20 0D : .. \ . 0x00D0 : 6F 2D 2D 20 20 20 20 20 5C 5C 20 20 20 20 2F 0D : o-- \\ /. 0x00E0 : 20 76 5F 5F 2F 2F 2F 5C 5C 5C 5C 5F 5F 2F 20 0D : v__///\\\\__/ . 0x00F0 : 20 20 20 7B 20 20 20 20 20 20 20 20 20 20 20 0D : { . 0x0100 : 20 20 20 20 7B 20 20 7D 20 5C 5C 5C 7B 20 20 0D : { } \\\{ . 0x0110 : 20 20 20 20 3C 5F 7C 20 20 20 20 20 20 3C 5F 0D : <_| <_. 0x0120 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0130 : 41 4D 4F 45 42 41 73 20 20 20 20 20 20 20 20 0D : AMOEBAs . 0x0140 : 5F 5F 5F 5F 5F 2E 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____.______ . 0x0150 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0160 : 5F 5F 5F 5F 5F 21 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____!______ . 0x0170 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0180 : 5F 5F 5F 5F 5F 2E 7C 5F 5F 5F 5F 5F 20 20 20 0D : _____.|_____ . 0x0190 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x01A0 : 5F 5F 5F 2E 2E 2E 2E 2E 2E 2E 5F 5F 20 20 20 0D : ___.......__ . 0x01B0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x01C0 : 5F 5F 5F 5F 5F 2A 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____*______ . 0x01D0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x01E0 : 5F 5F 5F 5F 5F 2E 7A 5F 5F 5F 5F 5F 20 20 20 0D : _____.z_____ . 0x01F0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0200 : 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 20 20 20 0D : ____________ . 0x0210 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0220 : 5F 5F 5F 5F 5F 6F 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____o______ . 0x0230 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0240 : 5F 5F 5F 5F 5F 4F 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____O______ . 0x0250 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0260 : 5F 5F 5F 5F 5F 6F 2E 6F 5F 5F 5F 5F 20 20 20 0D : _____o.o____ . 0x0270 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0280 : 5F 5F 5F 5F 5F 2E 2D 2E 5F 5F 5F 5F 20 20 20 0D : _____.-.____ . 0x0290 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x02A0 : 5F 5F 5F 5F 5F 2E 3E 5F 5F 5F 5F 5F 20 20 20 0D : _____.>_____ . 0x02B0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x02C0 : 5F 5F 5F 5F 5F 2E 2D 5F 5F 5F 5F 5F 20 20 20 0D : _____.-_____ . 0x02D0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x02E0 : 5F 5F 5F 5F 5F 2E 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____.______ . 0x02F0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0300 : 5F 5F 5F 5F 5F 27 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____'______ . 0x0310 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0320 : 5F 5F 5F 5F 5F 3A 5F 5F 5F 5F 5F 5F 20 20 20 0D : _____:______ . 0x0330 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0340 : 5F 5F 5F 5F 5F 3A 7E 5F 5F 5F 5F 5F 20 20 20 0D : _____:~_____ . 0x0350 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0360 : 5F 5F 5F 5F 28 2E 29 5F 5F 5F 5F 5F 20 20 20 0D : ____(.)_____ . 0x0370 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x0380 : 33 3D 3D 3D 44 5F 5F 2E 5F 5F 5F 5F 20 20 20 0D : 3===D__.____ . 0x0390 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x03A0 : 5F 5F 5F 5F 5F 24 2E 5F 5F 5F 5F 5F 20 20 20 0D : _____$._____ . 0x03B0 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : . 0x03C0 : 20 3A 3A 3A 3A 3A 3A 3A 3A 3A 3A 20 20 20 20 0D : :::::::::: . 0x03D0 : 20 3A 3A 3A 3A 3A 3A 3A 3A 3A 3A 20 20 20 20 0D : :::::::::: . 0x03E0 : 5F 3A 3A 3A 3A 3A 3A 3A 3A 3A 3A 5F 20 20 20 0D : _::::::::::_ . 0x03F0 : 65 6F 66 20 31 30 32 34 20 62 79 74 65 73 20 0D : eof 1024 bytes . 0x0400 : 20 20 5F 5F 20 20 20 20 20 20 5F 20 20 20 20 0D : __ _ . 0x0410 : 6F 27 27 29 7D 5F 5F 5F 5F 2F 2F 20 20 20 20 0D : o'')}____// . 0x0420 : 20 60 5F 2F 20 20 20 20 20 20 29 20 20 20 20 0D : `_/ ) . 0x0430 : 20 28 5F 28 5F 2F 2D 28 5F 2F 20 20 20 20 20 0D : (_(_/-(_/ . 0x0440 : 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D : .
EEPROM au format DIP28
Le but étant de pouvoir insérer l'EEPROM sur la carte de récupération Z80, il faut que l'EEPROM soit au format DIP28 (comme l'UVPROM 27512 originale).
Cela tombe bien, j'ai un adaptateur PLCC->DIP28 dans ce dépôt.
Grâce au connecteur ZIF (Zero Insertion Force) sur le programmateur, cette EEPROM pourra être reprogrammée facilement.
Prototype du programmeur d'EEPROM Pico sous MicroPython |
Ensuite
Maintenant qu'il est possible de lire et écrire une EEPROM, il ne reste plus qu'à écrire la partie logicielle programmateur (permettant de flasher/Lire l'EEPROM depuis un PC).
Un script MicroPython au coeur du programmateur et un script Python 3 sur PC pour dialoguer avec la carte programmateur (lecture de l'EEPROM ou écriture de celle-ci).
Ressources
- Schéma du programmateur d'EEPROM
- Dépôt kicad-public-projects/HASKEL-Z80/PROGRAMMER-GLS27SFS512 (GitHub, carte du programmeur)
- Dépôt kicad-public)projects/HASKEL-Z80/EPROM-27512-GLS27SF512 (Github, adaptateur PLCC->DIP28)
- Dépôt micropython-eeprom-27512 (GitHub, code du programmeur)
Écrire un commentaire