Description
du programmateur de mémoires I2C sur port série
+ adaptation pour PCF8582, et cartes à puce I2C
du programmateur de mémoires I2C sur port série
+ adaptation pour PCF8582, et cartes à puce I2C
En préambule :
Cette réalisation est une alternative au programmateur de mémoires I2C sur le port parallèle également présenté sur ce site ; vous avez été plusieurs à me signaler votre préférence pour un dispositif fonctionnant sur le port série, tout en manifestant votre intérêt pour le programme écrit pour le port parallèle. J'avais travaillé moi-même sur une ébauche de programmateur série qui ne me donnait pas satisfaction ; c'était donc là l'occasion de se remettre au travail...
N'hésitez pas, cependant, à vous reporter à la description du programmateur parallèle : je ne reprendrai pas ici la partie 'Généralités' et les bonnes adresses concernant les mémoires I2C, ni la partie traitant du protocole, ni l'exemple d'interfaçage entre un PIC16F84 et une 24Cxx.
Maintenant, il est grand temps de passer à la partie qui nous intéresse, à savoir la réalisation du système...
N'hésitez pas, cependant, à vous reporter à la description du programmateur parallèle : je ne reprendrai pas ici la partie 'Généralités' et les bonnes adresses concernant les mémoires I2C, ni la partie traitant du protocole, ni l'exemple d'interfaçage entre un PIC16F84 et une 24Cxx.
Maintenant, il est grand temps de passer à la partie qui nous intéresse, à savoir la réalisation du système...
Analyse du schéma électrique :
Comme le remarquerons les connaisseurs, le schéma décrit est inspiré de celui de l'interface proposée avec une application DOS de bonne qualité, le programme PIP02, utilisé avec le driver COM84. J'ai tenté de conserver une certaine compatibilité avec ce programme qui fonctionne fort bien, à condition que l'on utilise un ordinateur pas trop rapide...
Les signaux présents sur le port série sont à la norme RS232, cela correspond à des niveaux de tension de +12v et -12v, sans d'ailleurs que ces niveaux soient garantis, la norme étant relativement élastique, et les fabricants ayant une interprétation toute personnelle de la notion de compatibilité...
Les entrées SDA et SCL de la mémoire sont associées respectivement aux sorties DTR et RTS ; l'alimentation est prélevée sur la broche TxD.
Fonctionnement des entrées SDA et SCL :
- Lorsque la sortie DTR ou RTS passe à +12v, la diode Zener est polarisée en inverse et limite donc la tension sur l'entrée correspondante (SDA ou SCL) à +5,1v. La diode Schottky, également polarisée en inverse, est quant à elle bloquée, on peut la considérer comme absente. Rappelons qu'une diode Schottky est juste une diode avec une tension de seuil plus basse (elle n'est pas constituée d'une classique jonction PN, mais d'une jonction semiconducteur / métal, me semble-t-il).
- Lorsque la sortie bascule à -12V, en l'absence de diode Schottky, la Zener est polarisée en direct et fonctionne alors comme une diode au silicium classique, avec une tension de seuil de 0,7v. La tension sur l'entrée vaudrait alors -0,7v ; cette tension un peu négative sera perçue par la plupart des mémoires comme un niveau logique '0' correct ; avec les 24LC256, la valeur est trop basse (en-deçà des spécifications) ceci entraîne des erreurs en écriture et en lecture. Avec la diode schottky en parallèle, donc polarisée dans les mêmes conditions (en direct), la tension de seuil tombera a environ 0,26v, soit -0,26v sur l'entrée, ce qui est plus raisonnable et siéra mieux aux 24LC256. Remarque : La Zener sera alors très faiblement polarisée (presque bloquée).
- Le choix de la tension Zener des diodes est imposé par la gamme de tensions de fonctionnement de la mémoire : entre 4,5 et 5,5v ; on aurait pu utiliser des diodes 4,7v mais compte-tenu du faible courant de polarisation, la tension obtenue risque d'être un peu plus basse : j'ai opté pour des diodes 5,1v. Le courant de polarisation des Zener en inverse est fixé à environ 3 mA, la résistance vaut donc : R = (12v-5,1v)/0,003 = 2300 ohms
on prendra des 2,2 kohms.
Remarque : si vous ne trouvez pas de zener 5,1v, vous pouvez à l'extrême rigueur utiliser des 5,6v (en théorie non, mais en pratique oui !).
La partie alimentation :
- Elle est polarisée selon le même principe, mais avec un courant un peu plus élevé ; une diode lumineuse insérée en série permet de contrôler l'alimentation de la mémoire (en cours de lecture ou de programmation) et de bloquer toute tension négative quand TxD vaut -12v (donc pas besoin de diode Schottky ici) ; la led 'encaisse' alors une certaine tension inverse, ce qui fera hurler les puristes : tant mieux ! Avec un courant de polarisation de 20 mA, une tension aux bornes de la led de 1,6v, et une Zener de 5,1v, la résistance vaut alors :
R = (12-1,6-5,1)/0,020 = 265 ohms
on choisira donc R=270 ohms.
- Sur les 20 mA disponibles, le courant non utilisé pour l'alimentation de la mémoire sera détourné par la diode Zener vers la masse. Le port série est plus généreux en terme de courant débité que le port parallèle ; ce choix de R=270 ohms permet de compenser des variations de tension du port série d'un PC à l'autre, ou pour différentes leds : un courant même deux fois inférieur suffirait encore à alimenter la plus goulue des mémoires ; rien n'interdit formellement d'augmenter la valeur de R si vous préférez un courant plus faible (par exemple, une résistance de 470 ohms) ; idem pour les entrées SDA et SCL...
La broche SDA est à la fois une entrée et une sortie : les données sont envoyées au port série par l'entrée CTS ; le niveau de tension vaut alors -0,26v ou 5,1v, ce qui suffit néanmoins au port série pour interpréter un niveau logique "0" ou "1", la norme RS232 étant assez tolérante, comme nous l'avons dit...
L'ensemble peut être connecté au port série d'un PC, qu'il soit muni d'une fiche DB9 ou bien DB25 ; le schéma indique le brochage dans les deux cas de figure. Attention au sens des diodes Zener, Schottky, de la led, ainsi que du support huit broches 'tulipe'.
Les signaux présents sur le port série sont à la norme RS232, cela correspond à des niveaux de tension de +12v et -12v, sans d'ailleurs que ces niveaux soient garantis, la norme étant relativement élastique, et les fabricants ayant une interprétation toute personnelle de la notion de compatibilité...
Les entrées SDA et SCL de la mémoire sont associées respectivement aux sorties DTR et RTS ; l'alimentation est prélevée sur la broche TxD.
Fonctionnement des entrées SDA et SCL :
- Lorsque la sortie DTR ou RTS passe à +12v, la diode Zener est polarisée en inverse et limite donc la tension sur l'entrée correspondante (SDA ou SCL) à +5,1v. La diode Schottky, également polarisée en inverse, est quant à elle bloquée, on peut la considérer comme absente. Rappelons qu'une diode Schottky est juste une diode avec une tension de seuil plus basse (elle n'est pas constituée d'une classique jonction PN, mais d'une jonction semiconducteur / métal, me semble-t-il).
- Lorsque la sortie bascule à -12V, en l'absence de diode Schottky, la Zener est polarisée en direct et fonctionne alors comme une diode au silicium classique, avec une tension de seuil de 0,7v. La tension sur l'entrée vaudrait alors -0,7v ; cette tension un peu négative sera perçue par la plupart des mémoires comme un niveau logique '0' correct ; avec les 24LC256, la valeur est trop basse (en-deçà des spécifications) ceci entraîne des erreurs en écriture et en lecture. Avec la diode schottky en parallèle, donc polarisée dans les mêmes conditions (en direct), la tension de seuil tombera a environ 0,26v, soit -0,26v sur l'entrée, ce qui est plus raisonnable et siéra mieux aux 24LC256. Remarque : La Zener sera alors très faiblement polarisée (presque bloquée).
- Le choix de la tension Zener des diodes est imposé par la gamme de tensions de fonctionnement de la mémoire : entre 4,5 et 5,5v ; on aurait pu utiliser des diodes 4,7v mais compte-tenu du faible courant de polarisation, la tension obtenue risque d'être un peu plus basse : j'ai opté pour des diodes 5,1v. Le courant de polarisation des Zener en inverse est fixé à environ 3 mA, la résistance vaut donc : R = (12v-5,1v)/0,003 = 2300 ohms
on prendra des 2,2 kohms.
Remarque : si vous ne trouvez pas de zener 5,1v, vous pouvez à l'extrême rigueur utiliser des 5,6v (en théorie non, mais en pratique oui !).
La partie alimentation :
- Elle est polarisée selon le même principe, mais avec un courant un peu plus élevé ; une diode lumineuse insérée en série permet de contrôler l'alimentation de la mémoire (en cours de lecture ou de programmation) et de bloquer toute tension négative quand TxD vaut -12v (donc pas besoin de diode Schottky ici) ; la led 'encaisse' alors une certaine tension inverse, ce qui fera hurler les puristes : tant mieux ! Avec un courant de polarisation de 20 mA, une tension aux bornes de la led de 1,6v, et une Zener de 5,1v, la résistance vaut alors :
R = (12-1,6-5,1)/0,020 = 265 ohms
on choisira donc R=270 ohms.
- Sur les 20 mA disponibles, le courant non utilisé pour l'alimentation de la mémoire sera détourné par la diode Zener vers la masse. Le port série est plus généreux en terme de courant débité que le port parallèle ; ce choix de R=270 ohms permet de compenser des variations de tension du port série d'un PC à l'autre, ou pour différentes leds : un courant même deux fois inférieur suffirait encore à alimenter la plus goulue des mémoires ; rien n'interdit formellement d'augmenter la valeur de R si vous préférez un courant plus faible (par exemple, une résistance de 470 ohms) ; idem pour les entrées SDA et SCL...
La broche SDA est à la fois une entrée et une sortie : les données sont envoyées au port série par l'entrée CTS ; le niveau de tension vaut alors -0,26v ou 5,1v, ce qui suffit néanmoins au port série pour interpréter un niveau logique "0" ou "1", la norme RS232 étant assez tolérante, comme nous l'avons dit...
L'ensemble peut être connecté au port série d'un PC, qu'il soit muni d'une fiche DB9 ou bien DB25 ; le schéma indique le brochage dans les deux cas de figure. Attention au sens des diodes Zener, Schottky, de la led, ainsi que du support huit broches 'tulipe'.
Elles ont toutes passé le test avec succès !
Seule la 24C512 manque à l'appel, alors si vous en trouvez une, soyez charitable : envoyez-la moi, vous ferez un heureux ! le bonheur, ça tient à peu de choses, finalement...
Remarque : le programmateur parallèle permettait également de programmer le PCF8582 ; ce n'est plus le cas avec le programmateur série qui se limite à la famille des 24Cxx ; pour ceux qui souhaiteraient absolument programmer des PCF8582, il suffit d'ajouter un inter, une résistance et un condensateur, comme l'indique le schéma de droite ; lorsque WP est à la masse (à "0", interrupteur passant), le système programme les 24Cxx ; lorsque le circuit RC est actif (inter non passant), les PCF8582 peuvent être programmés (en indiquant au système une mémoire de taille équivalente, soit 256 octets : la 24C02). La lecture reste toujours possible dans tous les cas, car elle est indépendante de l'état de la broche WP.
Adaptateur pour cartes à puce I2C :
Il existe des mémoires I2C sous forme de cartes à puce (attention, il ne pas les confondre avec les télécartes ou les cartes bancaires, Vitale, Wafer et autres Gold qui fonctionnent selon des protocoles différents). Parmi ces cartes à puce I2C, Je pense en particulier aux D2000 et D4000 (que l'on trouvait chez Selectronique à une époque), ainsi qu'à la série des ZCM02, ZCM16, ZCM64, ZCM128 et ZCM256 disponibles chez Hi Tech Tools (au Mans) ; vous pouvez naturellement utiliser le programme pour lire ou écrire dans ce composant original, moyennant la réalisation d'un adaptateur, qui convient également pour le programme utilisant le port parallèle. Voici la description d'une version simplifiée destinée à venir se brancher sur le support tulipe huit broches :
Seule la présentation diffère, mais le protocole I2C reste le même pour les puces encartées que pour les mémoires en version DIL de la famille 24Cxx ; il suffit d'indiquer au programme un modèle de mémoire de capacité identique à celle de la carte :
- ZCM02 ou D2000 : 2 kbit (256 octets), sélectionnez la 24C02
- D4000 : 4 kbit (512 octets), sélectionnez la 24C04
- D8000 : 8 kbit (1024 octets), sélectionnez la 24C08
- ZCM16 : 16 kbit (2048 octets), sélectionnez la 24C16
- ZCM64 : 64 kbit (8192 octets), sélectionnez la 24C64
- ZCM128 : 128kbit (16384 octets), sélectionnez la 24C128
- ZCM256 : 256 kbit (32768 octets), sélectionnez la 24C256
Aucun commentaire:
Enregistrer un commentaire