I2C+et+SPI

Page précédente. Franck DJOMO M13 = 1. Introduction =

Le module MSSP ( Master        Synchronous Serial         Port), permet l’  échange  de données du microcontrôleur avec le        monde extérieur        (afficheurs, capteurs, microcontrôleurs), en utilisant des transmissions série synchrones.Il peut travailler selon deux modes, soit en mode SPI, soit en mode I2C. Bien ,que ces deux modes ut ilisent le même toc module,donc le même registre, ont chacun une spécificité. Avant de se lancer  dans la description de ces deux modes de communication, il importe de définir certains termes tels que : = 2. Bus SPI =
 * Une liaison série  est un moyen de  connexion  par lequel les données sont transférées bit après bit (en série), au contraire d’une liaison parallèle, qui transmet un mot à la fois (mot de 8 bits, 16 bits).
 * La notion de synchrone signifie simplement que l’émetteur/récepteur fourni un signal d'horloge qui va se mettre en phase avec le début et la fin de chaque octet, mais également la position de chaque état stable des bits.Autrement dit la synchronisation  consiste à cadencer l'information à transmettre.

Une liaison SPI ( Serial Peripheral Interface  ) est un bus de données série synchrone baptisé ainsi par Motorola, qui opère en mode Full-Duplex et qui peut transférer des données sur de courtes distances à des vitesses élevées. Les circuits communiquent selon un schéma maître-esclaves, où le maître s'occupe totalement de la communication. Plusieurs esclaves peuvent coexister sur un même bus, dans ce cas, la sélection du destinataire se fait par une ligne dédiée entre le maître et l'esclave appelée Chip Select (CS) ou Slave Select(SS).

2. 1 principe de fonctionnement du bus SPI
Pendant le transfert , le dispositif peut travailler soit en maître,soit en mode esclave. L'interface SPI permet de connecter un ou plusieurs esclaves à un seul maître via le même bus. fig.1 liaison série maître-esclaves Le bus SPI utilise 4 signaux logiques : On parlera aussi de liaison à 3 fils : Permet de véhiculer l’information dans les 2 sens (bidirectionnelle), un fil différent étant dévolu à chaque sens de transfert d’information. Comme ceci permet la communication simultanée dans les 2 sens de transmission, on parlera de liaison full-duplex : pendant que le maître transmet des données sur la ligne MOSI, vers l’esclave sélectionné, il en reçoit de celui-ci par la ligne MISO. Dans certaines littératures, on rencontre les noms tels que SCK(Horloge), SDI(MISO), SDO( MOSI), CS(SS). Le MOSI, le SCLK, Le SS, sont générés par le maître et le MISO est généré par l'esclave.
 * SCLK (Serial Clock) : est le signal d'horloge, il est utilisé pour synchroniser les données échangées entre le maître et les esclaves. Cette ligne est nécessairement une sortie sur le maître et une entrée sur le ou les esclaves
 * MOSI (Master Output, Slave Input) : est utilisé pour transférer les données du maître vers l'esclave
 * MISO (Master Input, Slave Output) : est utilisé pour transférer les données l'esclave vers le maître
 * SS (Slave Select) : le maître utilise ce signal pour choisir avec qui il veut dialoguer.Ce signal est actif à l'état bas.Les esclaves ne peuvent pas communiquer entre eux.Seul le maître peut autoriser un esclave à dialoguer, cela dit l'esclave ne peut commencer le dialogue que s'il n'a pas l'autorisation.

2. 2 Domaine d'application SPI
Dans la carte easyAVR, la liaison spi est utilisée par exemple pour accéder à l'extenseur de port.L'interface spi est aussi utiliser pour permettre la communication entre le microcontrôleurs et ses périphériques(les convertisseurs (CNA ), les mémoire EEPROM (Electrically-Erasable Programmable Read-Only Memory ou mémoire morte effaçable électriquement et programmable, est utilisée pour le stockage de paramètres du système. Par exemple un numéro de série, une configuration… ) et flash(utilisée pour le stockage des programmes), et l'afficheur 2x16).

2. 3 Principe d'une transmission série SPI
Une transmission SPI typique est une communication simultanée entre un maître et un esclave : À chaque coup d'horloge le maître et l'esclave s'échangent un bit. Après huit coups d'horloges le maître a transmis un octet à l'esclave et vice versa. La vitesse de l'horloge est réglée selon des caractéristiques propres aux périphériques.
 * Le maître initie la communication en sélectionnant l'esclave avec qui il veut communiquer par l'utilisation du signal SS qui est actif bas.
 * Le maître et l'esclave préparent les données à envoyer dans leur registres à décalage.
 * Le maître génère des impulsions d'horloge pour synchroniser les données échangées.

pendant que le maître transmet les données sur la ligne MOSI, vers l’esclave sélectionné, il en reçoit de celui-ci par la ligne MISO. Voici le tout sous forme de dessins. En rouge les bits reçus, en bleu les bits envoyés :







2.4.1 Schéma bloc SPI
La séquence peut se résumer comme suit : Nous remarquons que cela necessite 2 synchronisations différentes. La première pour placer le bit à envoyer sur la ligne de transmission, et la seconde pour dire au récepteur qu’on peut lire ce bit, qui est maintenant stable.
 * coté émetteur : l'octet à envoyer est placée dans le buffer, puis est recopié automatiquement dans le registre à décalage ,qui, est un registre destiné à sérialiser la donnée (la transformer en bits successifs).Comme le premier bit à envoyer est le bit 7, le registre devra décaler vers la gauche.le bit sortant est envoyé directement sur la ligne mosi. Le mécanisme se poursuit jusqu’à ce que les 8 bits soient envoyés.
 * Côté récepteur, c’est évidemment le même genre de mécanisme. Le bit reçu sur la ligne miso est entré par le côté droit du même registre à décalage, donc par le bit 0. Ce registre subit alors un décalage vers la gauche qui fait passer ce bit en position b1. Le bit suivant sera alors reçu en position b0, et ainsi de suite. Le dernier bit reçu entraîne automatiquement une copie de la donnée contenue dans le registre à décalage vers le buffer.
 * 1) L’émetteur copie sa donnée de SSPBUF vers SSPSR
 * 2) Pour chacun des 8 bits
 * 3) Au premier clock, l’émetteur décale SSPSR vers la gauche, le bit sortant (ex b7) est envoyé sur mosi
 * 4) Au second clock, le récepteur fait entrer le bit présent sur miso et le fait entrer dans SSPSR en décalant ce registre vers la gauche. Ce bit se trouve maintenant en b0.
 * 5) On recommence pour le bit suivant
 * 6) Le récepteur copie SSPSR dans SSPBUF



2.4.2 Registre de configuration
Il permet de choisir le rôle (maître ou esclave), la polarité de l’horloge, l’ordre des bits, la vitesse de l’horloge (un des bit de configuration de la vitesse " SPI2X" se trouve dans le registre d’état), d’activer le module et d’autoriser les interruptions.

Grace au bits **CPO**L et ** CPHA ** on peut distinguer 4 différents modes de transmission
 * 1) Bit 7 – SPIE: SPI Interrupt Enable : ce bit autorise une interruption si le bit SPIF du registre d'etat (SPSR) vaut 1 et si le bit d'interruption globale du SREG vaut également 1.
 * 2) Bit 6 – SPE: SPI Enable : ce bit permet d'activer le module SPI
 * 3) Bit 5 – DORD: Data Order : ce bit indique l'ordre de transmission des données.quand il est à 1 les bits de poids faibles(LSB) sont transmis en premier et quand il est à 0 les bits de poids fort(MSB) sont transmis en premier.
 * 4) Bit 4 – MSTR: Master/Slave Select : ce bit permet de sélectionner le mode master quand il est à 1 et le mode esclave quand il est à 0.
 * 5) Bit 3 – CPOL: Clock Polarity: ce bit indique la polarité de l'horloge,il détermine si au repos l’horloge est sur le niveau bas (CPOL=0) ou haut (CPOL=1).
 * 6) Bit 2 – CPHA: Clock Phase : ce bit détermine à quel front de l’horloge les données sont transmises. CPHA=0 signifie que les données sont valides au premier front d’horloge, CPHA=1 qu’elles sont valides au deuxième front.
 * 7) Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0 : ces deux bits permettent la vitesse de l'horloge généré par le maître. le tableau suivant donne la relation entre l'horloge et la fréquence d'oscillation.

2.4.3 Registre d’état
Il indique quand un octet a été transféré et si une collision s’est produite. Le registre SPSR (SPI StatusRegister) : registre d’état de l’interface SPI
 * 1) SPIF (SPI Interrupt Flag) :le flag à 1 indique que la transmission de l’octet est terminée. Il est remis à 0 lorsque la routine d’interruption a été exécutée.
 * 2) WCOL (Write Collision Flag) : Indique qu’il y a eu collision de donnée = écriture dans SPDR alors que le transfert n’est pas terminé.
 * 3) SPI2X (SPI Double Speed) : lorsque ce bit est à 1 la vitesse d'horloge double en mode maître (voir registre SPCR).

2.4.3 Registre de données
Le registre SPDR (SPI Data Register) : registre de données de l’interface SPI. En écrivant dans ce registre, la transmission est lancée -> en écriture, concerne l’octet envoyé.Contient le résultat de la dernière réception -> en lecture, concerne l’octet reçu.

2.5.1 CPHA = 0
Lorsque CPHA est mis à 0, les données sont validées au premier front du signal d’horloge. La polarité CPOL détermine s’il s’agit d’un front montant ou descendant. A CPOL=0, au repos,l’horloge est sur le niveau BAS; le premier front est donc un front montant. A CPOL=1, au repos, l’horloge est sur le niveau HAUT; le premier front est donc un front descendant.Cependant, la polarité de l’horloge n’a pas d’influence sur le moment où le premier bit de données est valide et par conséquent n’a pas d’effet sur le format du transfert de données,comme indiqué en Fig 3.

2.5.2 CPHA = 1
Lorsque CPHA est mis à 1, les données sont réceptionnées avec le deuxième front du signal d’horloge. La polarité CPOL détermine s’il s’agit d’un front montant ou descendant. Avec CPOL=0, au repos, l’horloge est sur le niveau BAS et monte au niveau HAUT après le premier front; le deuxième front est donc un front descendant. Avec CPOL=1, au repos,l’horloge est au niveau HAUT et descend au niveau BAS après le premier front; le deuxième front est donc un front montant.Cependant, la polarité de l’horloge n’a pas d’influence sur le moment où le premier bit de données est valide et par conséquent n’a pas d’effet sur le format du transfert de données,comme indiqué en Fig 4. Ces contraintes sont dues au fait qu’on ne peut lire que lorsque le bit est stable, c’est-à dire après le moment où le bit est placé, et avant qu’il ne disparaisse au profit du suivant. Comme nous sommes synchronisés à l’horloge, le seul moment possible de lecture se situe donc un demi cycle après le positionnement du bit.
 * Remarque : **
 * Le maître place toujours sa donnée en début de cycle; On en déduit que l’esclave lira toujours la donnée en milieu de cycle
 * L’esclave peut placer sa donnée, soit en début, soit en milieu de cycle; Ceci implique que le maître lira la donnée reçue, soit en milieu, soit en fin de cycle

2. 6 SPI mode maître
Lorsqu'il est configuré en tant que maître, l'interface SPI n'a aucun contrôle automatique de la ligne de SS.Pour la configuration en mode maitre,nous devons déclarer : MOSI, SS et SCLK en sortie; MISO en entrée ; mettre le bit MSTR à 1 dans le registre SPCR. La mise de SS à l’état bas permet d'établir la communication avec l’esclave. le principe de transmission suit cette ordre : Le dernier octet entrant sera conservés dans le registre tampon pour une utilisation ultérieure.
 * 1) Ecriture d’un octet dans le registre de données (SPDR).
 * 2) génération du signal d'horloge.
 * 3) envoie des données contenue dans le registre de données vers l’esclave via la ligne MOSI.
 * 4) arret du signal d'horloge.
 * 5) mise du bit SPIF = 1 (flag de fin de communication)
 * 6) Si SPIE = 1 (autorisation de l’interruption) : interruption demandée, 2 options :
 * chargement de l’octet suivant dans le registre
 * mise de SS à l’état haut pour signaler la fin du paquet de données

2. 7 SPI mode esclave
Pour la configuration en mode esclave,nous devons déclarer : MOSI, SS et SCLK en entrée; MISO en sortie ;Mettre le bit MSTR à 0 dans le registre SPCR. L’esclave reste en mode sommeil jusqu’à ce que le maître l'appelle(en mettant la ligne SS à l’état bas). La mise de SS à l’état bas permet d'établir la communication avec l’esclave. Le principe de transmission suit cette ordre :
 * 1) sélection de l'esclave avec qui communiquer
 * 2) génération du signal d'horloge par le maître
 * 3) envoie des données contenue dans le registre des données vers l’esclave via la ligne MISO.
 * 4) mise du bit SPIF = 1 (flag de fin de communication)
 * 5) Si SPIE = 1 (autorisation de l’interruption) :
 * interruption demandée
 * chargement de l’octet suivant dans le registre

2. 8.1 Avantages

 * Communication full-duplex
 * Vitesse assez importante par rapport à l’I²C (10-100MBits/s)
 * Partage d’un bus commun pour l’horloge, MISO et MOSI entre les périphériques
 * Simplicité de l’interface matérielle :
 * Aucun arbitre nécessaire car aucune collision possible
 * Les esclaves utilisent l’horloge du maître et n’ont donc pas besoin d’oscillateur de précision

2. 8.2 inconvénients

 * Utilise plus de pattes d’un boitier que l’I²C qui en utilise seulement 2 (et la masse).
 * Aucun adressage possible : Il faut une ligne de sélection par esclave en mode non chaîné.
 * Le protocole n’a pas d’acquittement. Le maître peut parler dans le vide sans le savoir.
 * Il ne peut y avoir qu’un seul maître sur le bus
 * Ne s’utilise que sur de courtes distances contrairement aux liaisons RS-232, RS-485 ou bus CAN.

= 3. Bus IIC =

3. 1 Introduction
I2C (Inter Integrated Circuit) est un bus de données qui a émergé de la « guerre des standards » lancée par les acteurs du monde électronique. Conçu par Philips pour les applications de domotique et d’électronique domestique, il permet de relier facilement un microprocesseur et différents circuits, notamment ceux d’une télévision moderne : récepteur de la télécommande, réglages des amplificateurs basses fréquences, tuner, horloge, gestion de la prise péritel, etc... Il existe d’innombrables périphériques exploitant ce bus, il peut êtreimplémenter par logiciel dans n’importe quel microcontrôleur. Le poids de l’industrie de l’électronique grand public a permis des prix très bas grâce à ces nombreux composants. Ce bus porte parfois le nom de TWI (Two Wire Interface) chez certains constructeurs.

3. 2 Historique

 * 1982 (version de base) : présence des modes Low-Speed (10kbit/s) & Standard (100kbit/s).
 * 1992 (version 1.0) : Suppression du mode Low-Speed et ajout du Fast-Mode ( 400kbit/s) + ajout d’un mode d’adressage sur 10 bits.
 * Décembre 1998 (version 2.0) : Ajout du mode High-Speed (3,4MBit/s)
 * Janvier 2000 (version 2.1) : Révision des paramètres du mode High-Speed.
 * 1 septembre 2006 : Passage chez NXP SemiConductors.
 * Juin 2007( version 3.0) : Ajout du Fast-Mode Plus (1Mbit/s)
 * Février 2012 (version 4.0) : Ajout du mode Ultra Fast (jusqu’à 5 Mbit/s)

3. 3 Caractéristiques
Le bus I²C permet de faire communiquer entre eux des composants électroniques très divers grâce à seulement trois fils : un signal de données (SDA), un signal d'horloge (SCL), et un signal de référence électrique (masse). Il s'agit d'une liaison en mode série synchrone (un bit est transmis à chaque coup d’horloge). Le nombre de composants qu'il est ainsi possible de relier est essentiellement limité par la charge capacitive des lignes SDA et SCL : 400 pF. un circuit maître et un ou plusieurs circuits esclaves peuvent être connectés au bus. Les échanges se font toujours à l’initiative du maître.La transmission est half duplex : mode écriture ou mode lecture, pas possible de manière simultanée.

3. 4 Domaines d'applications
En général, le maitre est un microcontrôleur. Les esclaves peuvent être de diverses natures, même pour les applications nécessitant une grande vitesse de communication étant donné qu'avec les nouvelles mises-à-jour du bus, la vitesse devient de moins en moins un problème. L'utilisation d'un bus I²C permet de réduire la complexité des circuits imprimés à réaliser.Par exemple, pour connecter une EEPROM ou une RAM à un microcontrôleur classique, il faut relier entre eux les bits de données et les bits d'adresses des différents composants, et, en plus, il faut bien souvent ajouter une logique de sélection. Avec des composants prévus pour se connecter au bus I²C, il suffit de les relier par deux pistes seulement. La variété des systèmes disponibles disposant d'un port I²C est énorme :
 * microcontrôleurs
 * expandeurs de bus (entrée/sortie 8 bits)
 * convertisseurs A/N et N/A
 * mémoires (RAM, EPROM, EEPROM, etc.)
 * récepteurs infra-rouge (télécommande RC5)
 * capteurs de température (DS 1820)
 * circuits audio (égaliseur, contrôle de volume, etc.)
 * drivers d'affichage LCD ou à LEDs
 * décodeurs télétexte
 * chargeurs de batterie
 * PLL pour tuner HF
 * etc...

3. 5 Connexion électrique
Comme indiqué précédemment, pour se connecter à un bus I²C il faut une masse, et deux fils de communication. Le premier fil, SDA (Signal DAta), est utilisé pour transmettre les données. L'autre fil, SCL (Signal CLock) est utilisé pour transmettre un signal d'horloge synchrone (signal qui indique le rythme d'évolution de la ligne SDA). Les tensions associées aux niveaux logiques vont dépendre de la technologie des circuits en présence (CMOS, TTL). Il faudra que tous les circuits connectés au bus I²C utilisent les mêmes potentiels pour définir les niveaux haut et bas. En définitive, cela implique que tous les composants connectés à un même bus soient alimentés de façon identique. Cela ne signifie pas que les composants doivent utiliser la même source pour s'alimenter ; il suffit que la tension d'alimentation soit à la même valeur pour tous les composants, le fil de masse permettant d'unifier les références. Il faut utiliser des sorties à collecteur ouvert (ou à drain ouvert pour des circuits CMOS),afin de permettre à plusieurs circuits logiques de connecter leurs sorties ensemble, sachant que certains circuits voudront imposer un niveau haut tandis que d'autres voudront imposer un niveau bas. Le niveau résultant sur la ligne est alors une fonction « ET » de toutes les sorties connectées.



Les résistances de rappel au potentiel VCC permettent aux signaux SDA et SCL d'être à 1 si toutes les sorties à, collecteurs ouverts sont aussi au niveau 1 (résultat de la fonction « ET »). Si une ou plusieurs sorties tentent d'imposer un niveau bas sur une ligne, le ou les transistors associés vont conduire, ce qui entraîne un niveau bas sur la ligne correspondante (ce qui est conforme au résultat de la fonction « ET »). En ce qui concerne la lecture des signaux SDA et SCL, cela ne pose pas de problème. Les signaux peuvent être lus en permanence sans risque d'interférer sur le niveau de la ligne. Au repos, tous les circuits connectes doivent imposer un niveau haut sur leurs sorties respectives. Si les lignes SDA et SCL sont au niveau haut dans ces conditions, cela signifie qu'aucun circuit ne tente de prendre le contrôle du bus. Si une des lignes SDA ou SCL passe à un niveau bas dans les mêmes conditions, c'est qu'un des circuits désire prendre le contrôle du bus. Mais il peut aussi y avoir deux circuits qui tentent de prendre le contrôle du bus en même temps (ou à quelques nanosecondes d'écart près). Il faut donc mettre en place un protocole pour gérer les conflits possibles.
 * Remarque :**
 * Valeur minimale limitée par le courant (Iol) de sortie des lignes SDA et SCL lorsqu’elles sont à l’état bas (Vol) : Rpmin = Valim – Vol(max) / Iol
 * Valeur maximale limitée par les temps de montée (tr) et de descente (tf) des signaux SDA et SCL ainsi que de la capacité du bus (Cb) : Rpmax= tr/0,8473

3.6.1 Avantages

 * Utilise seulement 2 lignes (+ le fil de masse) et simplicité de connexion (uniquement deux résistances de pull-up à rajouter)
 * Le protocole limite automatiquement la vitesse de transmission à la vitesse de l’élément le plus lent.
 * Le bit de reconnaissance qui permet de savoir si l’esclave est bien connecté et également si les données ont été correctement transmises ou non.
 * Interconnections de multiples périphériques

3.6.2 Inconvénients

 * Impossibilité d’utiliser un mode full-duplex
 * Vitesse relativement lente pour la plupart des périphériques esclaves (100 à 400kbits/s)
 * Consommation relativement élevée du à la configuration en collecteur/drain ouvert
 * Distance de communication limitée car les lignes du bus ne sont pas protégées des perturbations et envoient des fronts montants et descendants. Cette distance est donc limitée par la vitesse de communication, les résistances de pull-up, la capacité du bus (en général, autour des 400pF),…

3. 7 Protocole I2C
Le protocole du bus I²C définit la succession des états possibles sur les lignes SDA et SCL, et comment doivent réagir les circuits en cas de conflit.

3.7.1 La prise de contrôle du bus
Pour transmettre des données sur le bus I²C, il faut surveiller deux conditions particulières : la condition de départ et la condition d'arrêt



Avant de tenter de prendre le contrôle du bus, un circuit doit vérifier que les lignes SDA et SCL sont au repos, c'est-à-dire à l'état haut. Si c'est le cas, le circuit indique qu'il prend le contrôle du bus en mettant la ligne SDA à 0. A partir de ce moment là, les autres circuits savent que le bus est occupé et ils ne devraient pas tenter d'en prendre contrôle. Le circuit qui vient de prendre le contrôle du bus en devient le maître. C'est lui qui génère le signal d'horloge, quel que soit le sens du transfert.

3.7.2 Transmission d'un octet
Après avoir imposé la condition de départ, le maître applique sur SDA le bit de poids fort D7. Il valide ensuite la donnée en appliquant pendant un instant un niveau '1' sur la ligne SCL. Lorsque SCL revient à '0', il recommence l'opération jusqu'à ce que l'octet complet soit transmis. Il envoie alors un bit ACK à '1' tout en scrutant l'état réel de SDA. L'esclave doit alors imposer un niveau '0' pour signaler au maître que la transmission s'est effectuée correctement. Les sorties de chacun étant à collecteurs ouverts, le maître voie le '0' et peut alors passer à la suite. Notez que c'est le bit de poids fort qui est transmis en premier. Une fois les 8 bits transmis, le circuit qui vient de recevoir les données doit imposer un bit d'acquittement ACK sur la ligne SDA. Pour cela, pendant que la ligne SCL est au niveau bas, le maître place sa propre sortie au niveau haut, tandis que le récepteur (aussi appelé l'esclave) place sa sortie au niveau bas. Puisque les sorties sont à collecteur ouvert, la ligne SDA restera au niveau bas à cause de l'esclave. Le maître relit ensuité la ligne SDA une fois qu'il a passé la ligne SCL au niveau haut. Si la valeur lue pour le bit ACK est 0, c'est que l'esclave s'est bien acquitté de l'octet reçu, sinon c'est qu'il y a une erreur et le maître doit générer la condition arrêt.

3.7.3 transmission d'une adresse
Le nombre de composants qu'il est possible de connecter sur un bus I²C étant largement supérieur à deux, le maître doit pouvoir choisir quel esclave est censé recevoir les données. Dans ce but, le premier octet que transmet le maître n'est pas une donnée mais une adresse. Le format de l'octet d'adresse est un peu particulier puisque le bit D0 est réservé pour indiquer si le maître demande une lecture â l'esclave ou bien au contraire si le maître impose une écriture à l'esclave. Chaque circuit connecté au bus I²C possède une adresse, qui doit être unique. L'adresse associée à un composant est définie en partie par l'état de broches de sélections et d'autre part par sa fonction. Par exemple, le circuit PCF8574, qui est un port d'entrées/sorties bidirectionnel 8 bits, décompose son adresse de la façon suivante : [0] [1] [0] [0] [A2] [A1] [A0] [R/W]. Les bits A2, A1 et A0 reflètent l'état des broches 1, 2 et 3 du circuit. Cela permet de placer 8 circuits PCF8574 sur le bus I²C. Lors de la conception d'un système, il faut donc veiller à l'unicité des adresses attribuées aux différents composants. Une fois l'adresse envoyée sur le bus, l'esclave concerné doit répondre en plaçant le bit ACK à 0. Si le but ACK vaut 1, le maître comprend qu'il y a une erreur de sélection et il génère la condition arrêt. En revanche, si le bit ACK vaut 0, le maître peut continuer les opérations. Note : Les adresses 0000 0xxx et 1111 11xx sont réservées à des modes de fonctionnement particuliers.

3.7.4 Ecriture d'une donnée
Si le bit R/W précédemment envoyé était à 0, cela signifie que le maître doit transmettre un ou plusieurs octets de données. Après chaque bit ACK valide, le maître peut continuer d'envoyer des octets à l'esclave ou bien il peut décider de terminer le dialogue par une condition d'arrêt.

3.7.5 Lecture d'une donnée
Si le bit R/W transmis en même temps que l'adresse est à 1, cela signifie que le maître veut lire des données issues de l'esclave. C'est toujours le maître qui va générer le signal d'horloge SCL. En revanche, après le bit ACK de l'adresse, c'est l'esclave qui va garder le contrôle de la ligne SDA. Pour cela, le maître va placer sa propre sortie SDA au niveau haut pour permettre à l'esclave de prendre le contrôle de la ligne SDA. L'esclave doit alors scruter la ligne SCL et attendre le niveau bas pour changer l'état de la ligne SDA, faute de quoi le maître détectera une condition arrêt et abandonnera le transfert (l'électronique intégrée dans l'esclave se doit de détecter aussi qu'il y a eu une condition arrêt, bien entendu). Après que l'esclave a transmis les 8 bits de données, c'est le maître, cette fois-ci, qui va générer un bit d'acquittement. Si le maître désire lire des octets supplémentaires, il placera le bit d'acquittement à 0. En revanche, si le maître décide que la lecture est terminée, il placera le bit ACK au niveau 1. L'esclave comprendra alors que le transfert est terminé. Cette fois-ci, bien que le bit ACK soit au niveau 1, cela ne correspond pas à une condition d'erreur mais à une fin de transfert.



3.7.6 Restart
Le protocole du bus I²C ne s'arrête pas là. Il est possible d'enchaîner écriture et lecture de l'esclave sans avoir à passer par une condition arrêt. Par exemple, dans le cas de la lecture d'une RAM, le maître commence par envoyer l'adresse du composant avec le bit R/W positionné sur l'écriture. La RAM adressé, en esclave renvoie ACK = 0. Ensuite, le maître transmet l'adresse interne de la case mémoire demandée. Une fois encore, l'esclave répond par ACK = 0. Le maître envoie alors à nouveau une condition de départ (sans passer par une condition d'arrêt), puis de nouveau l'adresse du composant sélectionné mais en plaçant le bit R/W sur la position lecture. L'esclave va répondre par ACK = 0 et enchaîner par la transmission du contenu de la case mémoire demandée. C'est toujours le maître qui impose l'horloge SCL mais c'est l'esclave, en l'occurrence la RAM, qui contrôle la ligne SDA. Une fois les 8 bits de données transmis par la RAM, si le maître veut lire le contenu de la case mémoire suivante, il placera le bit ACK au niveau 0. Dans ce cas, la RAM recommence la lecture avec la case mémoire suivante. En revanche, si le maître souhaite en terminer avec la lecture, il placera le bit ACK au niveau 1 et il générera ensuite la condition arrêt. Le contenu des octets de données lus ou écrits aura une signification qui dépend du composant sélectionné. Mais le protocole reste le même.

3.7.7 Gestion des conflits
La structure même du bus I²C 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 gestion des conflits. En effet, chaque maître pouvant prendre possession du bus dès que celui çi est libre, c'est à dire tant que les lignes SDA et SCL sont au niveau haut depuis suffisamment de temps, (4,7 µs), il existe le possibilité que deux maîtres prennent le contrôle du bus en même temps. Si cela ne pose pas de problème sur le plan électrique grâce à l'iutilisation de collecteurs ouvert, il faut pouvoir détecter cet état de fait pour éviter la corruption des données transmises. Comment cela se passe-t-il ? Une fois qu'il est établi que le bus est libre, le circuit qui souhaite prendre le contrôle du bus place la ligne SDA à 0 puis il relit l'état réel de la ligne SDA pour le comparer avec l'état qu'il souhaite imposer. Si dans un laps de temps très proche un autre maître décide aussi de prendre le contrôle du bus, il placera lui aussi la ligne SDA à 0. Du fait de la configuration à collecteur ouvert, le niveau de la ligne SDA sera à un niveau résultant d'une fonction "ET" entre les niveaux demandés par chaque maître. Pour l'instant, le résultat sera bien un niveau 0, de sorte qu'aucun maître ne peut savoir qu'il y a un conflit. Chaque circuit maître va donc commencer normalement à générer le signal d'horloge, de sorte que l'état de la ligne SCL sera aussi le résultat d'une fonction « ET » des différents états imposés par chaque maître. Pendant l'état bas de la ligne SCL, chaque maître va modifier sa propre sortie SDA. Si tous les maîtres qui ont pris le contrôle du bus placent le même état sur la ligne SDA, le conflit n'étant pas visible, la transmission se poursuit normalement, comme si chacun était seul. En revanche, dès qu'un maître place un niveau différent des autres sur la ligne SDA, il y aura forcément un état bas sur la ligne SDA, tandis qu'un ou plusieurs maîtres souhaitaient imposer un niveau haut. Tous les maîtres qui ont demandé un niveau haut, tandis que la ligne SDA reste à 0, vont perdre immédiatement le contrôle du bus. A partir de cet instant, le ou les maîtres qui viennent de perdre le contrôle du bus vont continuer à lire les états successifs de la ligne SDA. Ils vont continuer la lecture comme ils l'auraient fait en tant qu'esclaves, pour le cas où le maître qui reste encore en course souhaite justement adresser l'un d'eux.



Si les différents maîtres en compétitions tentent d'adresser le même composant, la ligne SDA sera toujours au bon niveau. La procédure d'arbitration va alors continuer avec les données à transmettre. Si les différents maîtres qui adressaient le même composant écrivent la même donnée, le conflit n'a pas lieu d'exister puisque tout le monde veut faire la même chose. La procédure d'arbitration va alors se poursuivre jusqu'à ce que l'un des maîtres demande un niveau différent des autres. En poussant le raisonnement à l'extrême, on peut imaginer le cas où tous les maîtres vont demander les mêmes niveaux jusqu'à la condition d'arrêt. Mais la probabilité d'un tel cas est bien faible. Quoi qu'il en soit, si le cas se produit, la procédure d'arbitration garantit que le résultat final est correct, chaque maître ayant réalisé la même opération exactement en même temps.

3.7.8 Ralentissement de la vitesse
Il est possible de ralentir la vitesse de transmission du bus I²C. Si un circuit esclave a besoin de ralentir les échanges sur le bus, il lui suffit de maintenir la ligne SCL à état bas. Le circuit maître scrute en permanence la ligne SCL pour la comparer avec l'état qu'il souhaite lui-même imposer. Quand le circuit maître détecte un niveau bas tandis qu'il vient de placer sa sortie SCL à l'état haut, il passe dans une boucle d'attente. L'attente se poursuivra jusqu'à ce que la ligne SCL asse au niveau haut.

3.7.9 Les adresses réservées
Les adresses 0000 0xxx ne sont pas utilisées pour l'adressage de composants. Elles ont été réservés par Philips pour effectuer certaines fonctions spéciales. Adresse d'appel général : 0000 0000 Après l'émission d'un appel général, les circuits ayant la capacité de traiter ce genre de demande d'appel émettent un acquitement. Le deuxième octet permet de définir le contenu de l'appel : 0000 0110 : RESET. Remet tous les registres de circuits connectés dans leur état initial (mise sous tension). Les circuits qui le peuvent rechargent leur adresse esclave.0000 0100 : Les circuits définissant leur adresse de façon matérielle réinitialisent leur adresse esclave. Cela ne réinitialise pas les circuits.0000 0000 : Interditxxxx xxx1 : Cette commande joue le rôle d'interruption. xxxx xxx peut être l'adresse du circuit qui a généré l'interruption.Les autres valeurs du second octets ne sont pas définies et sont tout simplement ignorées.Octet de start : 0000 0001 : Cet octet est utilisé pour synchroniser les périphériques lents avec les périphériques rapides.Début d'adressage CBUS : 0000 001x : L'émission de cet octet permet de rendre sourd tous les circuits I²C présents sur le le bus. À 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 : 0000 0110 à 0000 1111Ces adresses ne sont pas définis et sont ignorés par les circuits I²C. Elles peuvent être utilisés pour débugger un réseau multimaster.

3. 8 L'interface TWI (Two Wire Interface)

 * Le Bit Rate Generator : unité de contrôle de la période du signal SCL en mode maître. Cette période est déterminée par la configuration du bit rate dans le registreTWBR et du prescaler dans le registre TWSR. Le bit rate est le débit binaire, c'est à dire le nombre de bits par seconde envoyés ou reçus sur le bus TWI. Le prescaler est un diviseur de fréquence. Il permet de diviser la fréquence CPU pour atteindre la fréquence SCL du bus TWI.
 * Le Bus Interface Unit : contientL' Address Match Unit :vérifie si l'octets de l'adresse reçus correspondent à l'adresse des 7 bits dans le TWI registre d'adresse (TWAR) ,lorsque le microcontrôleur agit comme un dispositif esclave . Le bit de TWGCE permet la reconnaissance d'un appel général.
 * les bit start et stop
 * le registre à décalage de données et d'adresses
 * l'adresse ou la donnée à transmettre
 * Control Unit : surveille le bus TWI et génère des réponses correspondant aux paramètres du registre de contrôle ( TWCR ).

3.8.1 Caractéristiques de l'interface
L’interface TWI possède les caractéristiques suivantes :
 * Différentes configurations possibles en mode maître ou esclave
 * Adressage sur 7 ou 10 bits
 * Mode multi-maitre supporté
 * Vitesse maximale limitée par l’élément le plus lent

3.8.2 Régistres de l'interface
L'interface TWI contient 5 registres : Ce registre sélectionne la fréquence du pré-diviseur du bus SCL et travaille conjointement avec TWPS0, TWPS1 et TWSR Le TWSR contient des informations d'état pertinentes lorsque le drapeau d'interruption TWI est à 1. TWPS1 & TWPS0 : choix de la valeur du pré-diviseur pour la fréquence de transmission TWS7…TWS3 : permettent de connaître l’état actuel du protocole -> lecture indispensable pour une communication fiable maître-esclave
 * ** le registre de configuration TWBR (two bit rate register) **
 * ** le registre d’état (TWSR :TWI Status Register ) **

Contient l’adresse de l’esclave. TWA6..0 : contiennent l’adresse de l’esclave. TWGCE : Choix du mode écriture/lecture. Si 0 -> écriture (dans l’esclave). Si 1 -> lecture (de l’esclave).
 * ** Le registre d'adresse TWAR : TWI (Slave) Address Register **

En mode émission, leTWDR contient l'octet suivant à transmettre. En mode de réception, le TWDR contient le dernier octet reçu. Le registre de données ne peut pas être initialisé par l'utilisateur avant la première interruption.
 * ** Le registre des données TWDR (TWI Data Register) **


 * ** Le registre de contrôle TWCR (TWI Control Register) **




 * TWINT : Demande d’interruption lorsque l’opération est terminée. (conditions: bit I de SREG=1 (Active toutes les sources d’interruptions) & TWIE=1) à vers exécution de l’interruption. Attention, non remis à 0 automatiquement -> il faut le faire.
 * TWEA : Bit de validation du signal ACK. Si 0 -> déconnection momentanée entre le microcontrôleur et le bus (ne répond plus aux requêtes).
 * TWISTA : Génère une condition de départ. Si bus occupé -> restart puis validation de la condition de départ. Attention : doit être remis à 0 une fois la condition transmise.
 * TWISTO : Génère une condition d’arrêt. Remise automatique à 0 une fois la condition d’arrêt exécutée.
 * TWWC : Si TWINT=0, ce bit est mis à 1 si une tentative d’écriture dans le registre TWDR est exécutée. Quand l’écriture est réalisée -> TWWC=0.
 * TWEN : bit d’activation de l’interface TWI. Sinon -> SDA et SCL = lignes d’entrées/sorties classiques.
 * TWIE : validation de l’interruption quand TWINT=1 & bit I de SREG=1 (Active toutes les sources d’interruptions)

3.8.3 Paramétrage de la TWI
Avant la communication voici les etapes à suivre pour paramétrer de la TW. Pour ce faire, il faut :
 * Activer l’interface TWI (TWEN=1)
 * Etablir la vitesse de fonctionnement de l’interface TWI (registre TWBR + bits TWPS0 & TWPS1 de TWSR)
 * Choisir la valeur de TWIE : prise en compte ou non des interruptions

3.8.4 Principe de transmission de la TWI

 * START (TWISTA=1)
 * Adresse de l’esclave concerné (TWA6..0 de TWAR) + sens (R/W -> TWGCE de TWAR)
 * Accusé de réception généré par l’esclave (TWINT=1 -> ok)
 * Vérifier l’état du protocole avec TWS7…TWS3
 * On remet TWINT à 0 en y écrivant un « 1 ».
 * Envoi du premier octet par le maître ou l’esclave suivant le sens de transmission (registre TWDR)
 * Accusé de réception généré par celui qui reçoit
 * Vérifier l’état du protocole avec TWS7…TWS3
 * Remettre TWINT à 0
 * Envoi de l’octet suivant
 * STOP (TWISTO=1)
 * STOP (TWISTO=1)

= 4. Sources =

note de cours http://www.atmel.com/Images/doc2564.pdf http://www.sensortechnics.com/cms/upload/appnotes/AN_SPI-Bus-HCE_F_11156.pdf http://www.aurel32.net/elec/i2c.php# http://www.csulb.edu/~hill/ee444/Lectures/11_I2C%20Serial%20Communications.pdf https://www.diolan.com/dln_doc/spi-bus-interface.html http://fr.wikipedia.org/wiki/Serial_Peripheral_Interface

 **3.6.9**  code En mode émission, TWDR contient l'octet suivant à transmettre. En mode de réception, le TWDR code
 * contient le dernier octet reçu