Introducción Este proyecto nació como una necesidad de poder grabar memorias de algún tipo. Después de mucho pensarlo, leer y aprender todo lo que pude sobre memorias, y analizar varios programadores, decidí que lo mejor era diseñar un programador desde cero para memorias flash tipo 29F0x0, de AMD y Atmel, principalmente. Al usar sólo un tipo de memoria, el diseño se simplificaba, y también el software que debía programar para controlarlo. Escogí estas memorias por tener un precio asequible, ser no volátiles, regrabables, y requerir sólo 5V para programarlas. Aunque parezca muy artesanal, la implementación final fue en placa de cobre, con pistas por la cara inferior, unos pocos cables por la parte superior, y unos resultados excelentes de funcionamiento. Este documento sirve como guía para todo aquel que quiera construir un programador para memorias flash, completamente probado y con software para windows XP. Todo de cosecha propia :) Como ya he comentado, el diseño es genuino. No daré todos los detalles paso por paso, pero daré la suficiente información como para que su construcción pueda llevarse a cabo sin muchos problemas. Doy por hecho que quién se enfrente a este documento sabe lo básico sobre memorias, que sabe lo que es un bus de datos, de direcciones, y está familiarizado con la electrónica digital, sabe lo que es una resistencia, voltaje, y cosas así.
Vista general de mi diseño. Decidí realizar el programador de forma modular, dejando toda la lógica de control en una placa, y conectando los dispositivos a grabar a esta placa “madre” a través de un conector de 40 vías, como el que usan los dispositivos IDE en los PC (ver foto). De este modo el programador podría valer para programar diversos dispositivos, o acceder a memorias SRAM, o a las ROMs de cartuchos de consolas (con el conector adecuado), para realizar backups de los originales, etc. En definitiva, sirve para leer y grabar dispositivos de memoria de 8 bits de hasta 4 Mb de capacidad (o 32Mbits). En el proyecto actual sólo fabriqué un módulo con zócalo DIP de 32 pines, para programar memorias 29F0x0 de AMD y Atmel, de hasta 4 Mbits (placa pequeña en la foto), y he probado ambas con éxito y excelentes resultados. Esta placa se conecta a la placa de control a través de un cable plano de 40 hilos muy fácil de conseguir o hacer. El tiempo de lectura ronda menos de un minuto para leer una 29F040 (de 512Kb, la mayor memoria que acepta este módulo), y poco más de 6 minutos para grabarla. Aunque dependiendo del contenido de lo que se quiera grabar puede tardar menos (el software evita hacer ciertas lecturas redundantes). Aún se podría mejorar este tiempo revisando el software, que escribí rápidamente, aunque su funcionamiento básico está garantizado (detectar dispositivo, leer, borrar y grabar). He visto otros programadores “caseros” de estas características por Internet, y a excepción de uno, que es ligeramente más rápido, el resto tardaban incluso más del doble en grabar el mismo dispositivo. No está nada mal, ya que esté ha sido mi primer proyecto serio diseñado desde cero, hardware y software. Así que estoy contento con él ;-) Sólo comentar que no es un proyecto fácil y asequible para novatos, o gente sin experiencia. Hay que estar dispuestos a tomárselo con calma, y saber que tardarás un tiempo en construirlo. Pero te ahorras un dineral, ya que los programadores de eproms son carisimos. Comenzando su construcción. Algunos detalles. La placa madre, y toda la lógica del programador, está contenida en 3 chips. * Un 8255 (para generar direcciones). * Un decodificador 3:8 (para generar las señales de lectura y escritura). * Biestables D (para generar señales de control del 8255, excepto de lectura y escritura). El corazón del circuito es el chip de entrada/salida programable 8255. Es un chip con un puerto de entrada de 8 bits, y 3 puertos de salida de 8 bits. Permite mandar datos metidos por el puerto de entrada a cualquiera de los puertos de salida, o al revés, entre otras funciones. Así pues, el 8255 se conecta al puerto paralelo del PC, de 8 bits, y permite mandar los datos enviados desde el PC, a cualquiera de tres puertos de salida del chip de 8 bits cada uno, lo que suma 24 bits en total (8x3). Esto lo uso para direccionar la memoria a leer/grabar. Así se consigue dar una dirección de 24 bits con sólo 8 bits del puerto paralelo, cargando de 8 bits en 8 bits la dirección, por el puerto de entrada. Con 24 bits podemos direccionar 16Mb. Pero en mi diseño sólo utilicé 22 líneas, que dan un máximo de 4Mb. Para usar así el 8255, hay que configurarlo en ese modo, y decirle que los 3 puertos de salida serán de salida, ya que podrían no serlo. Es decir, el 8255 se puede configurar en varios modos de funcionamiento. Quien quiera aprender más del 8255, que busque en Internet. En este proyecto, su funcionamiento es muy sencillo, y muy instructivo a la hora de aprender a manejarlo. Para controlar las señales de lectura y escritura de la memoria flash, y a la vez controlar las del chip 8255, usando las líneas de control del puerto paralelo, utilicé un decodificador 3 a 8. Así puedo controlar las señales de lectura y escritura de la memoria (/RD y /WR), la de escritura del 8255, y una señal de reloj, usando sólo 3 líneas en lugar de 4. Esto fue posible porque me di cuenta que podía construir el circuito de manera que sólo una de estas señales (/RD, /WR de la Flash, /WR del 8255 y el reloj) estuviera activada a la vez (ej: no se puede leer a la vez la memoria y el 8255, o dar un pulso de reloj a la vez que se lee o escribe). Este requisito no es algo muy restrictivo. El objetivo de hacer esto es dejar libre una de las líneas de control del puerto paralelo para futuros usos. La señal de reloj se usa para cargar un último chip de biestables D que controlan el 8255 (en concreto, su señal de reset, y el puerto activo). Estos biestables se cargan desde 3 de los bits del bus de datos, a la señal del reloj. Y esto lo hago así porque mientras se lee y se escribe la memoria, que se hace con el bus de datos también, no se debe afectar al contenido de los biestables que controlan el 8255. Además, al usar chips como intermediarios, evito que la excesiva longitud del cable del puerto paralelo pueda generar ruido y un incorrecto funcionamiento del programador (los chips actúan como “repetidores” de la señal que llega del puerto paralelo). A pesar de todo, se debe tener cuidado de no usar cables largos, porque los datos leídos y escritos en la memoria flash se hacen directamente desde y hacia el puerto paralelo, sin chip intermediario. Por lo tanto, recomiendo usar un cable de puerto paralelo de 1 metro a ser posible, y un cable de 40 vías para conectar los módulos, lo más corto posible. El esquemático de la placa de control es el siguiente; 
Comentarios sobre el esquemático
Las señales que dicen DATA BUS, y todas las de direcciones que salen del 8255 (las del lado derecho), además de la de /WR y /RD, deben ir al conector de 40 vías de la placa de control. Es decir, estás serán las líneas que se llevarán a las placas de programación a través de un cable plano, por ejemplo. Pero si sólo deseas programar un tipo concreto de memorias, por ejemplo Flash roms del tipo 29F0x0, de un mismo formato (DIP o PLCC), que es el objetivo primordial de este programador, puedes no querer hacer 2 placas, sino meter todo en una placa y olvidarte del conector de 40 vías. Como he dicho, el objetivo de tener 2 placas, es que manteniendo la misma placa de control, se pueden hacer y conectar otras placas de programación para leer o escribir otros tipos de memorias (eso sí, de momento el software sólo soporta Flash roms del tipo 29F0x0). Es decir, las placas pequeñas sólo llevan un zócalo o conector para un tipo de memoria, mientras la placa de control lleva todo el circuito y la lógica de programación. Para quienes quieran usar el diseño modular de varias placas, debo decir que por facilitar la construcción, no pude incluir las líneas de alimentación y tierra en el conector de 40 pines, por lo que se deben llevar a las placas de programación por otro medio. Yo elegí el sencillo método de 2 cables soldados a un pequeño conector, como puede verse en las fotos. No daré más detalles sobre la construcción de la placa de programación, ya que creo que cada uno puede hacerle a su conveniencia, y no tiene ninguna complicación adicional. Es sólo conectar pin a pin las señales del conector de 40 pines, a los pines del zócalo o conector de la memoria. Sólo recuerda añadir un condensador cerámico de 100nF cerca del zócalo o conector. En las fotos de mi placa, se ve un interruptor DIP de 4 interruptores (azul y blanco), que sirve para poder leer eproms de 28 pines en el zócalo de 32 pines. Hace un sencillo recableado, nada más. Basta con comparar el pinout de una eprom de 32 pines con el de una de 28 pines e idear una manera de llevar a los pines que difieren, las señales correctas. Tampoco daré más detalles porque en principio es algo opcional que cada uno puede encontrar útil o no. Si alguien necesita ayuda adicional, que me lo consulte.
Consideraciones prácticas Aconsejo usar condensadores cerámicos de 100nF cerca de cada integrado, entre las patas de alimentación y tierra. Sirven para filtrar ruido, que podría hacer funcionar mal tanto algún integrado como el programador en sí. Está comprobado científicamente, no es una chorrada. De hecho, cuando el programador estaba en estadios de desarrollo, y después de romperme la cabeza para solucionar diversos problemas, sólo cuando puse los condensadores, se dignó a funcionar correctamente. Para mejorar la compatibilidad de ciertos puertos paralelos, que por regla general son bastante quisiquillosos, recomiendo usar una resistencia SIP de 8 resistencias de 4.2Kohmios. Ésta se deberá colocar en las 8 líneas de datos del puerto paralelo, y el pin común de la resistencia SIP a tierra. Para la alimentación se requieren 5V. Así que para poder usar un adaptador de corriente de 9 o 12V, muy comunes, hay que usar un regulador de voltaje de 5V, como el 7805, para estabilizar el voltaje. El 7805 es un encapsulado con 3 patas, una de entrada de voltaje, a una tensión de 7.5V a unos 20V, la pata central se conecta a tierra, y por la pata restante se obtienen 5V. Eso sí, recomiendo no usar voltajes de entrada de más de 12V porque el 7805 se calienta bastante. Pero para garantizar un funcionamiento perfecto, hay que añadir algún elemento más al regulador. Hay muchos ejemplos en Internet de circuitos con el 7805, bastante sencillos. Pero para el programador yo probé con uno especialmente sencillo, que como va de lujo, es el que usé. Básicamente, coloca un condensador, electrolítico de 100uF y al menos 25V, entre la pata de tierra y de entrada de voltaje del 7805. También puedes añadir un diodo como el 1N4004 como medida de seguridad. Recomiendo usar un adaptador de corriente de 9V o 12V con este esquema.
Notas
sobre las líneas de dirección
Para
simplificar el cableado en el PCB final que diseñé, he usado las
siguientes conexiones. La columna de la izquierda corresponde con los
pines del bus de dirección de la memoria Flash, y la columna de la
derecha, los pines del 8255 a los que están unidos. Recordar que es
el 8255 el que general direcciones.
Teniendo
en cuenta que para el 8255;
A00
– A07 se refiere a P00-P07 (puerto 0, bits 0 a 7) A08
– A15 se refiere a P10-P17 (puerto 1, bits 0 a 7) A16
– A23 se refiere a P20-P27 (puerto 2, bits 0 a 7)
ROM - 8255 A0 - A15 A1 - A14 A2 - A13 A3 - A12 A4 - A11 A5 - A10 A6 - A09 A7 - A08 A8 - A01 A9 - A02 A10 - A04 A11 - A03 A12 - A19 A13 - A00 A14 - A21 A15 - A18 A16 - A17 A17 - A20 A18 - A16
Con
este aparentemente caótico cableado, he conseguido trazar casi todas
las pistas de datos y dirección en una sola cara de circuito
impreso. Si quieres usar mi programa para flashear, deberás conectar
de este modo las salidas del 8255 a las líneas de dirección del
zócalo de la ROM. Si decides fabricar el circuito de otra manera y
unir las líneas de dirección en su orden natural, entonces pone en
contacto conmigo y te suministraré el programa modificado para ello,
si aún no lo he colgado en la Web. Es decir, no estás obligado a
hacer ese cableado. Pero sobretodo si vas a hacer un PCB con pistas
de cobre, plantéatelo, porque significa mucho. 
A0 y A1 sirven para seleccionar el puerto activo. P0x se refiere al puerto 0. P1x se refiere al puerto 1. P2x se refiere al puerto 2. Para
más información sobre el 8255 buscar en Internet. El uso que le doy a
este proyecto es muy sencillo e intuitivo cuando se entiendo el 8255. Pinout del conector
Como
ves, este programador se basa en una placa madre, o de control, que
contiene la electrónica necesaria para generar las direcciones y las
señales de control a partir de un puerto paralelo. A esta placa se le
conectan módulos, es decir, otras placas que contienen el dispositivo
en cuestión que vamos a programar. Esto le elegí así para facilitar la
ampliación de las capacidades del programador. Pues
bien, para conectar la placa madre a los módulos hay que usar algún
tipo de conexión. Decidí usar un conector de 40 pines en 2 hileras, de
2,54mm de separación. Es decir, exactamente el mismo que el que usan
los discos duros y las unidades CD/DVD IDE. De esta forma, para
conectar la placa madre a módulos, se puede usar un cable plano IDE
estándar. A este conector le vamos a llamar a partir de ahora FlashBUS. ¿Cómo conectar cada pin del 8255 en la placa de control a su conector de 40 pines, que vamos a llamar FlashBUS? Así: A16 | A17 | A18 | A19 | A8 | A9 | A10 | A11 | A12 | A13 | A14 | A15 | - | - | - | - | - | - | - | - | /OE | /WR | A20 | A21 | A0 | A1 | A2 | A3 | A4 | A5 | A6 | A7 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
En
el módulo de programación de memorias Flash, el pinout será el
siguiente. En él se muestran qué pines del zócalo deben ir a cada pin
del FlashBUS. Placa DIP32 para memorias 29F0x0 A18 | A16 | A15 | A12 | A7 | A6 | A4 | A3 | A2 | A1 | A0 | - | - | - | - | - | - | - | - | - | /OE | /WR | A17 | A14 | A13 | A8 | A9 | A11 | A10 | - | - | - | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
La placa de control acabada me quedó así (la calidad de las fotos es regular): 
Y la placa del zócalo para programar flash roms DIP de 32 pines:
Versión 2 de la placa de control
En
este documento describo la forma de construir un módulo para programar
memorias Flash. Pero posteriormente a la construcción de la placa
madre, diseñé otro módulo para leer/escribie cartuchos de Super
Nintendo que requería de ciertas capacidades hardware que mi placa de
control no tenía, por lo que decidí modificarla ligeramente. No
necesitas tenerlo en cuenta si únicamente quieres grabar memorias Flash
de hasta 512 Kbytes. Pinout del FlashUSB de la placa madre v.2. A16 | A17 | A18 | A19 | A8 | A9 | A10 | A11 | A12 | A13 | A14 | A15 | - | - | - | - | - | *Ctr | *A22 | *A23 | /OE | /WR | A20 | A21 | A0 | A1 | A2 | A3 | A4 | A5 | A6 | A7 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 |
(*) Líneas añadidas en la versión 2. La señal Ctr no proviene del 8255 sino del puerto paralelo. Lista de componentes para la placa de control
1 x zócalo de 40 pines ancho. 1 x zócalo de 20 pines estrecho. 1 x zócalo de 16 pines estrecho. 1 x 8255 (chip I/O) 1 x 74LS138 (decodificador) 1 x 74LS374 (biestables D) 1 x 7805 (regulador de tensión) 1 x condensador 220 uF electrolítico de 16 o más voltios 3 x condensadores 100 nF cerámicos 1 x resistencia 330 ohms 1 x led de 3 ó 5 mm 1 x diodo 1N4004 o equivalente 1 x conector DB25 macho (puerto paralelo) 1 x conector de 40 pines en 2 hileras de separación 2,54mm (0,1 pulgada) 1 x conector de alimentación del mismo tipo que el adapatador que vayas a usar para alimentar la placa. Lista de componentes para la placa de programación Flash DIP32 básica. 1 x zócalo de 32 pines ancho 1x condensaror 100 nF cerámicos 1x resistencia 330 ohms. 1 x led de 3 ó 5 mm. 1 x conector de 40 pines en dos hileras de separación de 2,54mm (0,1 pulgada) Software de control
El programador se maneja con un programa para Windows, que puedes descargar desde la sección de descargas de la web. Aquí.
|