Suite à une discussion sur la shoutbox et sur le conseil de Folco je me permets de créer ce topic car j'aurais besoin d'aide sur un projet.
Mon objectif est de fabriquer un programmateur parallèle à base de Raspberry Pi 2.
La mémoire que je souhaite programmer est la MX29F1615 (16M-BIT [2M x8/1M x16] CMOS SINGLE VOLTAGE FLASH EEPROM ) de Macronix.
http://www.alldatasheet.fr/datasheet-pdf/pdf/74486/MCNIX/MX29F1615.html
Cette mémoire a l'avantage d'avoir un format DIP qui est facile à souder ainsi qu'une bonne capacité tout en étant 5V et reprogrammable sans UV.
J'ai conçu un schéma avec Kicad ainsi qu'un premier prototype.
Voici mon schéma
http://sega4ever.power-heberg.com/tutodedev/Pi%20Project/Sch%c3%a9ma%20programmateur.pdf
Voici comment ça fonctionne :
Une nappe IDE fait la liaison entre les GPIO du Raspberry Pi 2 et ma carte custom.
Le Raspberry Pï 2 possède 24 GPIO 3.3V que j'ai réparti de cette manière:
- 16 I/O sont directement affectées aux datas et sont envoyées vers un level shifter Bi-directionnel le TXB0108 puis vers la mémoire
- Les 5 premières adresses ( A0 - A4) ainsi que les 3 pins de contrôle ( CE , OE et Byte) sont envoyées vers un level shifter 74HC245 puis vers la mémoire
-Les autres adresses ( A5 - A20) sont générées par un MCP23017 à l'aide de la liaison I²C du Raspberry Pi.
Pour pouvoir programmer cette mémoire j'ai également besoin d'une tension de 10V ( VHH) celle ci est générée par un Step DC ( le LT1301) qui peut produire du 12V ou du 5V en fonction de l'état ( 5V ou GND) d'une entrée ( j'utilise / BYTE en sortie du 74HC ) puis une résistance pour réduire 12V en 10V et renvoyer ça sur la pins VPP de la mémoire.
voici mon prototype ( aujourd'hui le LT1301 est soudé)
J'arrive à piloter toutes les I/O et j'ai bien les tensions que je souhaite au niveau de la mémoire , c'est après que ça se corse

mon code est basé sur la librairie WiringPi qui permet de commander les I/O du Raspberry Pi facilement et qui supporte également le MCP23017.
Cependant je n'arrive pas à récupérer le silicon ID de la mémoire et je ne sais pas vraiment où se situe le problème.
Voici les fonctions simples que j'ai écrit ( Attention ça pique

http://pastebin.com/Hz6QJHEj
et ma fonction main
#include <wiringPi.h> #include <mcp23017.h> #include "UC_Prog.h" #include "MX29F1615.h" int main (void) { // Init Wiring Pi wiringPiSetup () ; // Init MCP23017 mcp23017Setup(100,0x20); //100 base adress pin //Setup Memory Clean_IO(); Init_Memory(); SetFlashBYTE(0); SetFlashOE(0); SetFlashCE(0); //Reset Chip WriteFlashByte(0x5555,0xAA); WriteFlashByte(0x2AAA,0x55); WriteFlashByte(0x5555,0xF0); //Silicon ID Read WriteFlashByte(0x5555,0xAA); WriteFlashByte(0x2AAA,0x55); WriteFlashByte(0x5555,0x90); id=ReadFlash(0); printf("bus value is %02x \n",id); return 0 ; }
Ce code me retourne 0x90 qui est la dernière valeur du bus du data au lieu de récupérer 0xC2...
Vu que j'arrive à piloter correctement mes I/O je ne pense pas que le problème vienne de mon prototype ou d'une erreur de câblage.
-Il peut venir du code
-ou alors d'un problème de timing ?
La bibliothèque Wiring Pi permet de tester les temps d’exécution des fonctions et voici ce que j'ai relevé:
-L’exécution de la fonction Digital Write pour les adresses A0 - A4 prends en moyenne 1 ou 2 µs
-L’exécution de la fonction Digital Write pour les pins de data prends en moyenne 2 ou 3 µs
-L’exécution de la fonction Digital Write pour les pins d'adresses multiplexer prends en moyenne 30 à 60 µs par pin
En lisant la datasheet de la MX29F1615 en page 19 j'ai tBALC Word Address Load Cycle qui doit être compris entre 0.3 et 30µs.
De ce que je comprends cette valeur correspond au temps maximum admissible entre un changement d'états de la pin /CE de 1 à 0
Mais d'après mon code les adresses sont préparées sur le bus avant le changement d'état de OE et CE et mes pins de contrôle ne sont pas multiplexées ( justement pour qu'elles soient pilotées rapidement) donc je ne sais pas si c'est critique ?
Voila d'avance merci à ceux qui auront pris le temps de lire mon pavé

Toute aide ou conseil seront grandement appréciés!