elektuur - 9/2005 32 DELPHI POUR ÉLECTRONICIENS Partie 7 I2C via le port parall
elektuur - 9/2005 32 DELPHI POUR ÉLECTRONICIENS Partie 7 I2C via le port parallèle cours Detlef Overbeek, Anton Vogelaar et Siegfried Zuhr Par le passé, il était relativement facile d’accéder directe- ment aux ports d’un PC, aujourd’hui cela implique un pilote-kernel prenant la forme d’une DLL. Il en circule de très nombreuses, depuis les instructions de base simple aux DLL de communication complètes. L’inconvénient est souvent que la définition de certains paramètres dans une telle DLL n’en permet l’utilisation qu’en combinaison avec une électronique donnée et qu’il est difficile d’en saisir le fonctionnement vu que l’on ne dispose pratique- ment jamais du code-source. Dépanner n’est pas, dans ces conditions, une sinécure. C’est là la raison qui nous a poussé à concevoir une DLL la plus rustique possible pour accéder au port parallèle en vue d’une communication avec un bus I2C. Le reste est réalisé en Delphi de sorte que tout est parfaitement accessible. Commençons par le plus important : La communication entre un circuit I2C et le programme Les routines sont stockées dans une unité distincte facile à utiliser, UI2C.pas. Dans cette unité, on retrouve tout ce dont on a besoin pour communiquer avec un capteur de température du type DS1621, ce tout se résumant à 2 instructions : la procédure DS1621 init pour l’initialisation du circuit et la fonction DS1621 RD pour demander au circuit une valeur de mesure. Pour la communication on a implémenté les routines sui- vantes dans Delphi : I2C_Start Procédure pour placer une condition de début (start) sur le bus. I2C_Stop Procédure pour placer une condition d’arrêt (stop) sur le bus. I2C_WrAck Procédure pour faire placer une condi- tion d’acquiescement (acknowledge, ACK) sur le bus par le maître. I2C_WaitAck Procédure lisant une condition d’acquies- cement de l’escalve. I2C_WrData Procédure servant à envoyer 8 bits de données via le bus. I2C_RdData Procédure servant à lire 8 bits de don- nées depuis le bus. Il est possible, par le biais de ces modules et de 2 com- posants passifs intégrés dans un connecteur DB-25 (cf. figure 1) de piloter un circuit I2C, un capteur de tempé- rature DS1621 dans le cas qui nous intéresse. Il nous faut commencer par rassembler quelques informa- tions sur le circuit intégré I2C auprès de son fabricant, Maxim. L’un des aspects importants est l’adressage du Dans cette partie nous allons créer une possibilité de communication I2C par le biais du port parallèle. Des années déjà ce dernier port est utilisé à tort et à travers pour toutes sortes d’applications « illicites » mais l’arrivée des versions récentes de Windows rendent difficile l’accès au monde extérieur par ce biais. circuit sur le bus. Le protocole I2C travaille avec un adres- sage sur 7 bits (en partie avec un nouvel adressage sur 10 bits), certains de ces bits d’adresse étant, souvent, paramétrables par le biais de certaines de broches du composant. Sur le présent composant il s’agit des lignes d’adresses A0 à A2, ce qui se traduit par un maximum de 8 de ces circuits sur le même bus. La fiche de caractéristiques indique également la compo- sante fixe de l’adresse (1001 en binaire pour le bit de poids fort) ce qui se traduit par une adresse de 90HEX pour l’écriture et de 91 HEX pour la lecture (les lignes d’a- dresses A0 à A2 se trouvent alors à « 0 »). Le bit 0 sert à identifier le processus, lecture ou écriture (on se référera aux différents articles consacrés à l’I2C dans Elektor et à la fiche de caractéristiques du DS1621). Sur la base de ces informations nous pouvons créer une routine pour démarrer le circuit, la routine DS1621_Init. Nous y retrouvons les étapes suivantes (cf. également le chronodiagramme de la fiche de caractéristiques) : Démarrage de la communication par le biais d’une condition de début. S’adresser au circuit par une action d’écriture à son adresse. Attendre une réponse. Le circuit enverra un ACK si tout s’est bien passé. On signale ensuite, par un processus d’écriture que l’on veut écrire la partie de configuration. On aura à nouveau un ACK en réponse à cette opéra- tion. On peut maintenant écrire l’information destinée au registre CNF. En cas de réception et de traitement corrects il arrive à nouveau un ACK. On termine par une condition d’arrêt en vue de clore la communication. Il faut ensuite lancer la mesure : Démarrer la communication par une condition de début. S’adresser au circuit par une action d’écriture à son adresse. Attendre une réponse. Le circuit enverra un ACK si tout s’est bien passé. On indique ensuite, par l’écriture de la valeur EEHEX que l’on veut lancer la mesure. En cas de réception et de traitement corrects il arrive à nouveau un ACK. On termine par une condition d’arrêt en vue de clôtu- rer la communication. L’initialisation est alors terminée. Il nous faut ensuite créer une routine pour procéder à la lecture du circuit, notre routine DS1621_RD. On y retrouve les éléments suivants (cf. également le chronodiagramme de la fiche de caractéristiques) : Démarrer la communication par une condition de début. S’adresser au circuit par une action d’écriture à son adresse. Attendre une réponse. Le circuit enverra un ACK si tout s’est bien passé. On indique ensuite, par l’écriture de la valeur AAHEX que l’on veut lire la dernière mesure. Il faut transmettre une nouvelle condition de début, un repeated start, comme l’indique le chronodiagramme. Ceci est suivi par l’adresse du circuit avec indication qu’il s’agit d’un processus d’écriture. L’adresse devient alors 91HEX. En cas de réception et de traitement corrects il arrive à nouveau un ACK. On attend, avec I2C_RdData, que la réception des données se soit faite. Il s’agit du MSB tel que le men- tionne la fiche de caractéristiques. Nous le recopions dans la variable Dta après avoir procédé, par Shl 8, à un décalage vers le haut de l’octet reçu, bit par bit, vers l’emplacement destiné à cette information. En cas de réception et de traitement corrects nous envoyons un ACK par le biais de la routine I2C_ACK (false). Il faut attendre avec I2C_RdData jusqu’à la réception du morceau de données suivant, le LSB. Nous l’ajoutons au résultat de la réception précédente, le tout venant de ce fait se mettre à l’emplacement LSB. En cas de réception et de traitement corrects nous envoyons un NACK par le biais de la routine I2C_ACK (true), suivie par un I2C_Stop pour, à nouveau, clore la communication. À l’aide de l’instruction Result := SmallInt(Dta) Div 128 on procède à une conversion des données reçues par le biais du facteur de division (entier) Div 128 en un entier 9/2005 - elektuur 33 Figure 1. Une résistance et un condensateur électrochimiquil n’en faut pas plus pour connecter le capteur de température au port Centronics. Figure 2. Structure schématisée du capteur doté de ses 3 registres de port. 16 bits signé, $0000 correspondant à 0 °C et chaque incrément/décrément correspondant à un delta de 0,5 degré. À des fins de présentation, la valeur Result est divisée par 2, le modulo 0,5 degré devant disponible de ce fait. La figure 2 indique comment brancher le capteur et donne les registres et les modules correspondants. Le code interne - en Delphi Un examen du code Delphi servant à l’utilisation du bus nous apprend les choses suivantes : L’écriture vers le port parallèle fait appel à une DLL très universelle, IO.DLL disponible sur Internet. Elle permet, sous Windows 2000 et XP, d’accéder aux broches indivi- duelles des ports en vue d’y écrire ou de les lire par le biais des routines PortOut et PortIn. Un coup d’oeil à la procédure I2C_Start montre la struc- ture de la condition de début et son envoi par le biais du port. La condition de début est un flanc descendant de la ligne SDA, alors que la lignes SCL se trouve au niveau haut. On l’obtient par la mise, par le biais de PortOut, de la ligne SCL au niveau haut. On écrit une valeur 81HEX vers le registre $378. C’est la valeur requise par le registre de données du port Centronics, pour mettre les lignes de données D7 et D0 au niveau haut. On utilise D7 pour l’alimentation du circuit et D0 en tant que ligne SCL. Ensuite, on écrit, par le biais de PortOut, la valeur 00HEX dans le registre $37A du port Centronics, ceci se tradui- sant par la mise au niveau haut de la broche 1 (Strobe) et ainsi de la ligne SDA. La sortie Strobe est en effet une sortie en collecteur ouvert dotée d’une résistance de for- çage au niveau haut (pull up) externe vers +5 V. Mais il y a un petit hic : il faut 2,5 µs pour obtenir l’ap- plication du signal sur le port (variable en fonction de la carte-mère utilisée). Le bus I2C travaille à 100 kHz au maximum, ce qui correspond uploads/Litterature/ elec-elek-delphi-pour-electroniciens-06-10.pdf
Documents similaires
-
66
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Mai 01, 2021
- Catégorie Literature / Litté...
- Langue French
- Taille du fichier 0.2717MB