Bus I2C Inter Integrated Circuit Par Jean Marc Masson
Sommaire Généralités Fonctionnement Format de transmission Écriture/lecture d ’un octet gestion des conflits les adresses réservées Étude d ’un programme de lecture/écriture
Généralités Bus de type communication série utilise 2 lignes de signaux + les masses débits de 100 à 400 Kbits/s applications audio et vidéo
Les points forts de l ’I2C bus série bifilaire utilisant une ligne de données bidirectionnelle appelée SDA (Serial DAta) et une ligne d'horloge appelée SCL (Serial CLock) . les données peuvent être échangées dans les deux sens sans restriction . le bus est multi-maîtres. chaque abonné dispose d'une adresse codée sur 7 bits. On peut donc connecter simultanément 128 abonnés d'adresses différentes sur le même bus, sous réserve de ne pas le surcharger électriquement . un acquittement est généré pour chaque octet de donnée transférée .
Les points forts de l ’I2C le bus peut travailler à une vitesse maximum de 100 K bits par seconde (ou 400 K bits par seconde) étant entendu que son protocole permet de ralentir automatiquement l'équipement le plus rapide pour s'adapter à la vitesse de l'élément le plus lent, lors d'un transfert . le nombre maximum d'abonnés n'est limité que par la charge capacitive maximale du bus qui peut être de 400 pF. Ce nombre ne dépend donc que de la technologie des circuits et du mode câblage employés . les niveaux électriques permettent l'utilisation de circuits en technologies CMOS, NMOS ou TTL.
Fonctionnement
Fonctionnement Nous constatons que la partie sortie fait appel à une configuration à drain ouvert (l'équivalent en MOS du classique collecteur ouvert) ce qui permet de réaliser des ET câblés par simple connexion, sur la ligne SDA ou SCL, des sorties de tous les circuits. Aucune charge n'étant prévue dans ces derniers, une résistance de rappel à une tension positive doit être mise en place. Le niveau électrique n'est pas précisé pour l'instant car il dépend de cette tension. Nous parlerons donc de niveaux logiques hauts ou « 1 » ou bien encore de niveaux logiques bas ou « 0 » étant entendu que l'on travaille en logique positive c'est à dire qu'un niveau haut correspond à une tension plus élevée qu'un niveau bas
Fonctionnement lorsqu'aucun abonné n'émet pas sur le bus, les lignes SDA et SCL sont au niveau haut qui est leur état de repos. une donnée n'est considérée comme valide sur le bus que lorsque le signal SCL est à l'état haut. L'émetteur doit donc positionner la donnée à émettre lorsque SCL est à l'état bas et la maintenir tant que SCL reste à l'état haut .
Fonctionnement Comme la transmission s'effectue sous forme série, une information de début et de fin doit être prévue. L'information de début s'appelle ici condition de départ (Start)et l'information de fin condition d'arrêt (Stop). Une condition de départ est réalisée lorsque la ligne SDA passe du niveau haut au niveau bas alors que SCL est au niveau haut. Réciproquement, une condition d'arrêt est réalisée lorsque SDA passe du niveau bas au niveau haut alors que SCL est au niveau haut
Fonctionnement Chaque octet est suivi par un bit d'acquittement de la part du destinataire
Fonctionnement Lors d'un échange , la ligne SCL est pilotée par l'initiateur de l'échange ou maître, quitte à ce que l'esclave agisse également dessus dans certains cas particuliers. La condition de départ, générée par le maître du bus est suivie par le premier octet de données, poids forts en tête. Après le huitième bit, l'émetteur qui est aussi le maître dans ce cas, met sa ligne SDA au niveau haut c'est à dire au repos mais continue à générer l'horloge sur SCL. Pour acquitter l'octet, le récepteur doit alors forcer la ligne SDA au niveau bas pendant l'état haut de SCL qui correspond à cet acquittement, prenant en quelque sorte la place d'un neuvième bit. Lorsque cet échange est terminé, le maître génère une condition d'arrêt.
Valeur état de la ligne représentation sur chronogramme Fonctionnement On veut transmettre l'octet suivant : 0100 0001, ce qui correspond à la valeur décimale 65 Remarque : un bit de valeur 1 sera transmis par l'état inactif et 0 par l'état actif. Valeur état de la ligne représentation sur chronogramme 1 inactif état haut 0 actif état bas Attention : ceci est spécifique au protocole I2C. On parle, dans ce cas, de logique inverse.
Fonctionnement
Format de transmission Le premier octet qui est toujours présent en début d'échange. Ses sept bits de poids forts contiennent l'adresse du destinataire du message ce qui autorise 128 combinaisons différentes.
Format de transmission Le bit de poids faible indique si le maître va réaliser une lecture ou une écriture. Si ce bit est à zéro le maître va écrire dans l'esclave ou lui envoyer des données. S'il est à un, le maître va lire dans l'esclave c'est à dire que le maître va recevoir des données de l'esclave. Lorsqu'un maître désire effectuer plusieurs échanges à destination d'esclaves d'adresses différentes, il n'est pas obligé de terminer le premier échange par une condition d'arrêt mais peut les enchaîner en générant une condition de départ dès la fin d'un échange.
Format de transmission Il existe une procédure dite d'appel général où l'adresse envoyée par le maître, c'est à dire rappelons-le, les sept bits de poids forts du premier octet, est nulle. Tous les circuits connectés sur le bus capables de répondre à un tel appel général doivent alors le faire et prendre en compte les données qui suivent. Leur attitude dépend du bit de lecture/écriture de ce premier octet. En effet, si ce bit est à zéro, le deuxième octet revêt une signification particulière, que je ne détaillerais pas ici, mais qui permet, au niveau de chaque esclave, la programmation de son adresse par logiciel ou matériel.
Format de transmission Lorsque ce bit est à un, on est en présence d'un appel général matériel qui est transmis par un maître du bus matériel, tel qu'un circuit d'interface de clavier par exemple. Un tel circuit est incapable de générer l'adresse du destinataire de l'information qu'il a à envoyer. Dans ces conditions, l'octet suivant contient l'adresse de ce maître matériel afin qu'un esclave « intelligent », généralement un microcontrôleur, le reconnaisse et prenne en compte l'information qu'il émet ensuite.
Écriture d ’un octet
Écriture d ’un octet En principe, l'état de la ligne SDA ne doit pas changer pendant que SCL est à '1'. Il y a néanmoins deux exceptions ; les instructions 'START' et 'STOP' qui servent respectivement à initier et à clore le dialogue, se différencient justement par le fait qu'elles se produisent quand SCL est à '1' : - par un front descendant sur SDA, suivi d'un front descendant sur SCL, pour 'START'.par un front montant sur SCL, puis sur SDA, pour 'STOP'. Les signaux 'START' et 'STOP' sont bien sûr délivrés par le maître. En principe, rien n'interdit qu'un périphérique soit tantôt maître, tantôt esclave, par exemple dans le cas où deux microcontrôleurs partagent un même bus I2C. Dans l'application présentée plus loin, celle d'un microcontrôleur pilotant uniquement une EEPROM , le micro sera toujours le maître, et la mémoire l'esclave. Attention: pour que le 'maître' puisse recevoir des bits, il faut que sa sortie ait été remise à '1' au préalable, afin que la mémoire puisse mettre la ligne SDA à '0' ou à '1' (structure à 'drain ouvert' exposée précédemment).
Écriture d ’un octet Le bus est au repos ; les lignes SDA et SCL sont à '1'. Le maître envoie un START (en vert sur le schéma) : SDA passe à '0', puis SCL passe à '0'. Ensuite, on envoie un premier octet [B7,B6,B5,B4,B3,B2,B1,B0], bit à bit : - On donne à SDA la valeur de B7, puis on valide par une impulsion positive sur SCL. - On procède ainsi avec B6, puis B5, B4... jusqu'à B0.
Écriture d ’un octet Les bits [B7,B6,B5,B4] valent [1,0,1,0] ; dans le protocole I2C, ce code indique que l'on s'adresse à une mémoire. Il existe d'autres types de périphériques (par exemple : un port d'entrée/sortie 8 bits, le PCF 8574, dont le code est [0,1,1,1], et bien d'autres...). Les bits [B3,B2,B1] sont les trois bits de poids fort de l'adresse (AD10, AD9 et AD8) ; si la mémoire a une capacité petite ne nécessitant pas tout ou partie de ces bits d'adresse, alors ces bits représentent les valeurs des broches A2, A1 et A0 du boîtier ; ceci permet d'utiliser plusieurs mémoires situées à des adresses logicielles différentes, fixées par les entrées A0, A1, A2. Le bit [B0] est le bit R/W ; mis à '0', il donne à la mémoire un ordre d'écriture ; mis à '1', un ordre de lecture. Ici, il est donc mis à '0'. A la suite du dernier bit, le maître ne doit pas oublier de remettre SDA à '1' pour laisser la ligne disponible.
Écriture d ’un octet Après chaque octet transmis, le périphérique récepteur (ici, la mémoire) indique qu'il a bien reçu l'octet en mettant SDA à '0', le temps d'une impulsion d'horloge envoyée par le maître ; on nomme cette validation 'ACKNOWLEDGE' (en abrégé : ACK), que l'on pourrait traduire en bon français par 'Accusé de réception'. Attention, si c'est le maître qui reçoit des données, c'est à lui d'envoyer ce bit à '0' (il repasse à '1' après). Il ne faut pas oublier ce neuvième bit, qui suit l'envoi de chaque octet. Transmission du deuxième octet, qui représente les huit bits de poids faible de l'adresse : émettre d'abord AD7, puis AD6, etc. jusqu'à AD0 (toujours sur SDA, avec à chaque fois une impulsion positive sur SCL). Nouvel ACK : impulsion positive sur SCL ; on peut en profiter pour vérifier que SDA est bien mis à '0' par la mémoire (pendant le niveau '1' de SCL). Transmission de l'octet de donnée (D7 à D0). Là aussi, commencer par le bit de poids fort et à chaque bit, impulsion positive sur SCL). Dernier ACK : impulsion positive sur SCL, etc. Pour conclure, un STOP : SCL passe à '1', puis SDA passe à '1'
Écriture d ’un octet pour gagner du temps, les mémoires autorisent une écriture en mode 'Page', c'est-à- dire de N octets à la fois ; le nombre N d'octets est donné dans la documentation de la mémoire et doit être respecté, mais surtout pas dépassé ; il vaut par exemple 16 pour les 24C04, 24C08 et 24C16. Chaque octet est suivi d'un ACK, jusqu'au STOP final, comme le montre la figure 5 bis avec N = 4 (la réception d'un octet incrémente automatiquement le compteur d'adresse de la mémoire). Attention, la durée nécessaire à la programmation de la mémoire est contrôlée automatiquement par celle-ci, mais cela veut dire que la mémoire sera indisponible pendant quelques instants (de l'ordre de quelques millisecondes). Il est sage de faire suivre la routine de programmation par une boucle d'attente (Tempo) ou mieux, de surveiller la mémoire jusqu'à ce qu'elle soit à nouveau disponible. Pour cela, envoyez un START, puis le premier octet d'adressage, puis tester l'ACK, puis un STOP. Si la mémoire a répondu à l'ACK (en mettant SDA à '0'), c'est qu'elle est enfin disponible, sinon, répétez la séquence tant que ce sera nécessaire...
Lecture d ’un octet
Lecture d ’un octet La première étape consiste à pointer l'adresse à lire dans le périphérique ; tout se passe comme lors d'une opération d'écriture : On envoie un START (SDA passe à 0, puis idem pour SCL). On envoie le premier octet d'adressage (les 4 bits [1,0,1,0], les trois bits de poids fort [AD10,AD9,AD8], et le bit lecture/écriture à '0' (= écriture). On envoie l'impulsion sur SCL correspondant à l'ACK (la mémoire répond par un '0' sur SDA). On envoie le deuxième octet d'adressage (les 8 bits de poids faible de l'adresse : AD7 à AD0). On envoie l'impulsion pour le deuxième ACK. Pas de STOP nécessaire ! Là s'arrête cette première étape ; signalons qu'elle n'est pas rigoureusement indispensable si vous venez de réaliser une opération de lecture ou d'écriture et si vous êtes certain que l'adresse actuelle de la mémoire est la bonne
Lecture d ’un octet La seconde étape est à proprement parler l'opération de lecture : On enchaîne directement sur un START. On émet l'octet d'adressage du périphérique, avec les quatre bits [1,0,1,0], il ne semble pas nécessaire de repréciser les trois bits suivants , puis vient le bit de lecture/écriture qui est cette fois à '1' (= lecture). Impulsion d'horloge correspondant à l'ACK (testons si la mémoire est disponible et a bien reçu l'ordre : auquel cas elle a mis SDA à '0'). Nous allons alors lire les huit bits de données en envoyant huit impulsions positives sur SCL ; la lecture de chaque bit s'effectue sur SDA après chaque front montant de SCL ; le premier bit reçu est D7, le dernier est donc D0.
Lecture d ’un octet A ce stade, deux cas de figures se présentent : si l'on souhaite continuer à lire des octets, il convient de générer un ACK ; le maître étant l'entité qui a reçu l'octet, c'est à lui de mettre SDA à '0', et ce bien sûr seulement pendant l'impulsion positive qu'il va générer sur SCL. Après, on pourra lire l'octet suivant ; pour cela nous retournons à l'étape précédente. si l'on souhaite arrêter là la lecture, il faut générer un 'No ACK', c'est-à-dire une impulsion positive sur SCL, mais en laissant SDA à '1' pour faire comprendre à la mémoire que l'échange va s'interrompre. Terminons alors par l'étape suivante. Finissons comme d'habitude par un STOP : SCL passe à '1', puis SDA passe à '1'. Le bus I2C est au repos...
Fonctionnement en mode multi-Maître Etat du bus ̧ Le bus est considéré comme occupé après l’apparition de la condition de départ . Il est considéré comme libéré au bout d’un certain laps de tems suivant l’apparition de la condition d’arrêt. Remarque : les unités connectées au bus peuvent détecter facilement les conditions de départ et d’arrêt si elles possèdent l’interface nécessaire. Cependant, lorsque l’arbitre de bus est un micro-ordinateur, la ligne SDA doit être échantillonnée au moins deux fois par période d’horloge pour détecter à coup sûr les changements d’état.
Fonctionnement en mode multi-Maître Génération d’horloge et arbitrage Synchronisation des horloges Chaque maître génère sa propre horloge sur la ligne SCL pendant le transfert des données. Les données ne sont valides que lorsque l’horloge est au niveau logique haut. Il est donc nécessaire de définir une horloge pour permettre l’exécution d’une procédure bit par bit. La synchronisation de l’horloge est réalisée par la connexion « ET câblé » des dispositifs de la ligne SCL. Lorsqu’un front descendant est présent sur la ligne SCL, tous les dispositifs candidats à la prise du bus (tous les maîtres en attente du bus) décomptent leur niveau bas sur la ligne SCL :Un maître qui émet un niveau bas sur la ligne SCL, relâche la ligne à un moment donné pour le remettre au niveau haut. A partir de ce moment, il ne continue pas sa procédure mais il lit le niveau de la ligne SCL et attend qu’il soit effectivement repassé à un. Cela signifie que, aussi longtemps qu’un autre circuit intégré maintient la ligne au niveau bas, le maître qui demande un niveau haut est bloqué. Cet autre circuit peut être aussi bien un maître qui émet avec un débit plus lent qu’un esclave qui a besoin d’un temps d’attente pour exécuter des opérations internes. Le résultat est que le bus se synchronise la durée de l’état bas le plus long, donc le circuit intégré le plus lent.
Arbitrage L’arbitrage permet l’attribution du bus aux différents maîtres. Le bus I2C comporte une procédure particulière dénommée CSMA/CD (Carrier Sense, Multiple Access with Collision Avoidance). Carrier sense est la procédure exécutée par un maître qui veut transmettre pour savoir si le bus est occupé ou non. Le bus est considéré comme occupé si l’une des lignes est au niveau électrique bas. L’intervalle de temps pendant lequel les deux lignes doivent être au niveau haut pour déterminer un bus libre est désigné par tHD;STA dans les spécifications de Philips, sa valeur est de 4ìs. Une fois que le maître a reconnu le bus libre, il émet une condition de départ puis un premier octet qui représente l’adresse de l’esclave qu’il veut appeler. Si un autre maitre veut en faire autant en même temps, ce sont d’abord les impulsions de la ligne SCL qui sont comparées (synchronisation des horloges). Pendant les états hauts de la ligne d’horloge, chaque maitre compare l’état réel de la ligne de donnée SDA à la valeur qu’il a lui-même demandée. Le mécanisme est le même que celui de la synchronisation des horloges. Un maître qui émet un état haut (à cause de la fonction ET câblé reconnaît qu’un autre maître utilise le bus et il cesse sa transmission.
Arbitrage Ce mécanisme est désigné par Collision Avoidance, puisque le maître gagnant n’entre pas en collision avec son concurrent. Il vient en complément d’un autre mécanisme, dit Collision Detection, qui oblige les deux maîtres à libérer le bus si un maitre imparfaitement conforme au standard I2C parvient à provoquer une collision.
Gestion des conflits La gestion des conflits :Mise en situation : La structure même du bus I2C a été conçue pour pouvoir y accueillir plusieurs maîtres. Se pose alors le problème commun à tout les réseaux utilisant un canal de communication unique : la prise de parole. En effet, chaque maître pouvant prendre possession du bus dès que celui-ci est libre, il existe la possibilité de que deux maîtres prennent la parole en même temps. Si cela ne pose pas de problème sur le plan électrique grâce l'utilisation de collecteurs ouverts, il faut pouvoir détecter cet état de fait pour éviter la corruption des données transmises.
Gestion des conflits Principe : Comme nous l'avons vu précédemment, pour prendre le contrôle du bus, un maître potentiel doit d'abord vérifier que celui-ci soit libre, et qu'une condition d'arrêt ai bien été envoyée depuis au moins 4,7µs. Mais il reste la possibilité que plusieurs maîtres prennent le contrôle du bus simultanément. Chaque circuit vérifie en permanence l'état des lignes SDA et SCL, y compris lorsqu'ils sont eux même en train d'envoyer des données. On distingue alors plusieurs cas :
Gestion des conflits (1) Les différents maîtres envoient les mêmes données au même moment : Les données ne sont pas corrompues, la transmission s'effectue normalement, comme si un seul maître avait parlé. Ce cas est rare. (2) Un maître impose un '0' sur le bus : Il relira forcément '0' et continuera à transmettre. Il ne peut pas alors détecter un éventuel conflit. (3)Un maître cherche à appliquer un '1' sur le bus : Si il ne relit pas un niveau '1', c'est qu'un autre maître a pris la parole en même temps. Le premier perd alors immédiatement le contrôle du bus, pour ne pas perturber la transmission du second. Il continue néanmoins à lire les données au cas celles-ci lui auraient été destinées.
Gestion des conflits SCLR : Horloge résultante. SDA1 : Niveaux de SDA imposés par le maître n°1. SDA2 : Niveaux de SDA imposés par le maître n°2. SDAR : Niveaux de SDA réels résultants lus par les deux maîtres. Analyse : Le premier octet est transmis normalement car les deux maîtres imposent les même données. (Cas n°1). Le bit ACK est mis à '0' par l'esclave.
Gestion des conflits Lors du deuxième octet, le maître n°2 cherche à imposer un '1' (SDA2) , mais relit un '0' (SDAR), il perd alors le contrôle du bus et devient esclave (Cas n°3) . Il reprendra le contrôle du bus, lorsque celui-ci sera de nouveau libre. Le maître n°1 ne voit pas le conflit et continue à transmettre normalement. (Cas n°2) Au total, l'esclave à reçu les données du maître n°1 sans erreurs et le conflit est passé inaperçu.
Les adresses réservées Les adresses 0000 0xxx ne sont pas utilisées pour l'adressage de composants. Elles ont étés réservés par Phillips pour effectuer certaines fonctions spéciales. Adresse d'appel général : Adresse : 0000 0000 . Après l'émission d'un appel général, les circuits ayant la capacité de traiter ce genre d'appel émettent un acquittement.
Les adresses réservées Le deuxième octet permet définir le contenu de l'appel : 0000 0110 : RESET. Remet tout les registres de circuits connectés dans leur état initial ( Mise sous tension ). Les circuits qui le permettent rechargent leur adresse d'esclave. 0000 0010 : Les circuits qui le permettent rechargent leur adresse d'esclave. 0000 0100 : Les circuits définissant leur adresse de façon matériel reinitialisent leur adresse d'esclave.
Les adresses réservées 0000 0000 : Interdit xxxx xxx1 : Cette commande joue le rôle d'interruption. xxxx xxx peut être l'adresse du circuit qui a généré l'interruption. Octet de Start : Adresse : 0000 0001 . Cet octet est utilisé pour synchroniser les périphériques lents avec les périphériques rapides.
Les adresses réservées Début d'adressage CBus : Adresse : 0000 001x . L'émission de cet octet permet de rendre sourd tout les circuits I2C présent sur le bus. A partir de ce moment, on peut transmettre ce que l'on désire sur le bus, en utilisant par exemple un autre protocole. Le bus repasse en mode normal lors de la réception d'une condition d'arrêt. Autre : Adresses : 0000 0110 à 0000 1111 . Ces octets ne sont pas définis et sont ignorés par les circuits I2C. Ils peuvent être utilisés pour débugger un réseau multimaster.
Les adresses fixes PCD 3311 Générateur / Décodeur DTMF 010010x PCF 8570 RAM Statique 2 Ko (256 x 8) 1010xxx PCF 8573 Horloge/Calendrier temps réel 11010xx PCF 8574 Extension de port parallèle 8 Bits 0100xxx PCF 8552 EEprom 2 Ko (256 x 8)
Les adresses fixes PCF 8583 Horloge/Calendrier temps réel + 240 Octets de RAM 101000x PCF 8591 Convertisseur A/N N/A 8 Bits 1001xxx SAA 1064 Drivers d'affichage à leds 4 Digits 01110xx M24C256 EEprom 128 Ko (32k x 8) 1010xxx
Adresses des principaux circuits I2C
Exemple de Lecture /écriture 16F877 EEPROM M24C02
.entrée de contrôle écriture Étude de l ’EEPROM M24C02 Caractéristiques 2 fils ‘ interface série I2C, protocole 400Kbits/s Les tensions:. 4.5 à 5.5 V pour M24Cxx 2.5 à 5.5 V pour M24Cxx-W 1.8 à 5.5 V pour M24Cxx-R .entrée de contrôle écriture écriture par page et par octet mode de lecture séquentielle et aléatoire incrémentation d ’adresse automatique plus d ’un million de cycles d ’écriture/effacement
Synoptique E0-E2:Validation adresse SDA: Donnée série SCL:Horloge Wc: contrôle écriture VCC= +V VSS= masse VCC E0-E2 SCL Wc M24C02 SDA VSS
Autres données 000 001 010 Adresses des mémoires sur la carte: valeur des résistances de rappel : 1 K code de sélection de la mémoire :1010
Modes de fonctionnement de la mémoire
Écriture en mode séquentiel (data write inhibé) WC=1
Écriture en mode séquentiel (data write validé) WC=0
Organigramme utilisant ACK
Lecture en mode séquentiel
Opérations d ’écriture Suite à une condition de départ, le bus maître envoie le code de sélection du circuit avec le bit R/W à 0. Le circuit envoie un accusé de réception(ACK) et attends l ’octet d ’adresse. Le circuit réponds à l ’octet d ’adresse par un accusé de réception et attends l ’octet de données. Quand le bus maître génère une condition d ’arrêt immédiatement après le ACK soit à la fin d ’un octet ou d ’un mode page, le cycle interne de la mémoire est verrouillé. Une condition d ’arrêt effectuée ailleurs n ’entraîne pas le verrouillage du cycle. Pendant le cycle interne, Les lignes SDA et SCL sont ignorées et le circuit ne réponds à aucune demande.
Écriture en mode page Ce mode permet d ’écrire jusqu ’à 16 octets sur un seul cycle, ceci permet de localiser les données dans une même page mémoire. Le bus maître envoie de 1 à 16 octets de données,chacune d ’elles reçoit un accusé de réception si Wc=0. Si Wc=1 le circuit retourne la donnée avec un NOACK et la mémoire n ’est pas modifiée. Un compteur interne s ’incrémente après chaque transfert . Le transfert se termine quand le bus maître génère une condition d ’arrêt.
Écriture D ’octets Le bus maître envoie un octet de données après le code de sélection du circuit et l ’octet d ’adresse. Si l ’adresse est protégée en écriture par une condition de contrôle ( Wc), le circuit retourne l ’octet de données avec un NOACK et la zone d ’adresse n ’est pas modifiée. Si l ’adresse n ’est pas protégée en écriture,le circuit retourne un ACK. Le bus maître termine le transfert par une condition d ’arrêt.
Opérations de lecture Lecture aléatoire : Un paquet d ’écriture sans condition d ’arrêt est envoyé en premier afin de chargé l ’adresse du compteur d ’adresses.Puis le bus maître envoie une condition de départ et répète le code de sélection du circuit avec R/W=1.Le circuit retourne un ACK et sort le contenu de la zone d ’adresses.Le bus maître doit envoyer un NOACK et terminer le transfert par une condition d ’arrêt. Lecture de l ’adresse courante Après la condition de départ, le maître envoie seulement le code de sélection avec R/W=1 et termine le transfert par une condition d ’arrêt. Lecture séquentielle Elle est utilisée après les lecture précédentes.Le bus maître doit accusé réception de l ’octet de données et envoyer des coups d ’horloge supplémentaires pour que le circuit continu à envoyer des données. Pour terminer, le maître doit envoyer un NOACK suivi d ’une condition d ’arrêt.
L ’initialisation Le programme comporte un certain nombre d ’astuces . Il prévoit entre autre d ’allumer ou d ’étendre des LEDS pour indiquer le début de l ’écriture(éteint) ou la fin d ’écriture (allumé).Il prévoit un bouton poussoir pour démarrer la lecture. Il faut donc initialiser les ports d ’entrées/sorties et prévoir un compteur d ’adresses.
Séquence d ’écriture Elle s ’effectue en 2 parties : 1- une séquence d ’effacement comportant une boucle avec les conditions de départ, le code , l ’écriture de FFh et la condition d ’arrêt. Nous utiliserons des instructions du types : i2c_start() i2c_Write(0xA0) pour le code i2c_Write(0xFF) pour la donnée i2c_stop() pour la condition d ’arrêt
Séquence d ’écriture 2- la séquence d ’écriture Elle débute par une condition de départ suivi de l ’écriture des données l ’une à l;a suite de l ’autre et se termine par une condition de stop. Attention ne pas mettre de boucle. Une fois la séquence terminée, faire allumer les LEDS et lancer une boucle d ’attente pour le bouton poussoir.
Lecture Un paquet d ’écriture sans condition d ’arrêt est envoyé en premier afin de chargé l ’adresse du compteur d ’adresses.Puis le bus maître envoie une condition de départ et répète le code de sélection du circuit avec R/W=0. Le circuit retourne un ACK et sort le contenu de la zone d ’adresses. Ne pas oublier de modifier le LSB du contrôle pour passer en lecture R/W=1 .Le bus maître doit envoyer un NOACK et terminer le transfert par une condition d ’arrêt. Il faut aussi prévoir une temporisation pour la visualisation. Le NOACK est généré par l ’instruction PORTD=i2c_read(0).
Partie programmation En I2C, la programmation est liée au protocole. Ainsi, à l’émission, on utilise le format suivant:
Communication I2C entre deux PICs 16F877
Communication I2C entre deux PICs 16F877
Logiciel de communication #include <16F877.h> #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3,force_hw) void main() {int8 car; printf("Frappez n'importe quelle touche\r\n"); while(true) {car = getchar(); putchar(car);i2c_start(); i2c_write(0x20); // Adresse de l'esclave i2c_write(car); i2c_stop(); }
Logiciel de communication #include <16F877.h> #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #use i2c(Slave,Fast,sda=PIN_C4,scl=PIN_C3,address=0x20) void main() {int8 car; while(true) {if (i2c_poll()) {car = i2c_read(); output_B(car); }
Écriture /lecture en 24C02 #include <16F877.h> #use delay(clock=4000000) #fuses NOWDT,XT, PUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWR #use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL) #define EEPROM_ADDRESS BYTE #define EEPROM_SIZE 256 void init_ext_eeprom() { output_float(EEPROM_SCL); output_float(EEPROM_SDA);} BOOLEAN ext_eeprom_ready() { int1 ack; i2c_start(); // si commande acceptée, ack = i2c_write(0xa0); // si mémoire prête. i2c_stop(); return !ack;}//retour ack void write_ext_eeprom(BYTE address, BYTE data) { while(!ext_eeprom_ready()); i2c_start(); i2c_write(0xa0); i2c_write(address); i2c_write(data); i2c_stop();}
Écriture /lecture en 24C02 BYTE read_ext_eeprom(BYTE address) { BYTE data;//format trame while(!ext_eeprom_ready());// si prêt i2c_start(); i2c_write(0xa0);//on décode la 24c02 i2c_write(address); i2c_write(0xa1);// on lit data=i2c_read(0);// récupération data i2c_stop(); return(data);}11 retour donnée
Lecture d’un octet
Horloge temps réel DS1307 Le DS 1307 est une horloge calendrier temps réel basse consommation comportant une SRAM de 56 octets alimenté par battetie. L’objectif du programme qui suit est de faire communiquer un PIC de type 16F877 jouant le rôle de maître avec le DS1307 jouant le rôle d’esclave. Le maître envoie des informations à l’esclave pour l’informer de ce qu ’il veut afficher un un écran LCD. L’esclave en fonction des ces informations renvoie au maître des données sous la forme de secondes, minutes, heures, jours, mois, année.
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307
Horloge temps réel DS1307