Alexandre.ravey@utbm.fr
IF71 : Circuits Logiques Programmables
Communications Numériques
Introduction
Protocole
Gestion des conflits
Synchronisation
Etude de circuits I2C
Gestion du bus par µC
Présentation
• I2C : Inter Integrated Circuit
• développé au début des années 80. A
l’origine pour la communication entre un
microprocesseur et les circuits présents dans
un téléviseur « moderne ».
• Communication entre composants
électroniques sur 3 fils :
• SDA : le signal de données
• SCL : le signal d’horloge
• Masse : signal de référence
I. Introduction
2. Caractéristiques
• Seulement 2 lignes (+masse)
• Plusieurs éléments sur le même bus
• Une adresse par périphérique
• Multi-maître, détection de collision et arbitrage
• Bus série, sur 8 bits, bi-directionnel
• 100kbps en mode standard
• 400kbps en mode fast
• 3,2 Mbps en mode high-speed
• Filtrage intégré (réjection pic parasites)
• Pas de nombre limite de périphérique en théorie (en
pratique la capacité totale du bus ne doit pas
excéder 400pF)
I. Introduction
3. Principe de fonctionnement
• Entrées-sorties en collecteur/drain ouvert (fonction
ET câblée)
• Les lignes SDA et SCL sont au niveau haut au repos
• Un composant relié au bus ne peut que forcer les
lignes au niveau bas, pas au niveau haut
I. Introduction
3. Principe de fonctionnement
I. Introduction
I. Introduction
Prise de contrôle du bus
• le bus doit être au repos avant d’en prendre le contrôle
(SDA et SCL à 1)
• Il existe une condition de départ (start) et une condition
d’arrêt (stop)
• condition de départ : SDA passe à 0
• condition d’arrêt : SDA passe à 1
• SCL reste à 1
• Si le bus est libre, un composant peut prendre le contrôle
du bus. Il devient alors maître et doit générer le signal
d’horloge
II. Protocole
• Bits de start/stop
II. Protocole
2. Transmission d’un octet
• Le maître applique l’état du bit de poids fort (bit 7) sur
SDA
• Cet état est validé par la mise à 1 de SCL
• Le maître génère la suite de l’horloge en passant SCL à 0
• L’état du bit 6 est alors appliqué sur SDA
• …
• ainsi de suite jusqu’au bit de poids faible (bit 0)
• La ligne SDA est remise à 1 par le maître
• Le maître scrute l’état de SDA : si SDA passe à 0 alors c’est
que l’esclave vient de positionner SDA à 0 : il s’agit du bit
d’acquittement ACK
• Si le bit d’acquittement est présent sur SDA, le maître peut
passer à la transmission suivante ou libérer la ligne
II. Protocole
• SCL : horloge imposée par le maître
• SDA maître : Niveaux de données imposés par le maître
• SDA esclave : Niveaux de données imposés par l’esclave
• SDA réel : Niveaux logiques réels lus sur le bus
II. Protocole
• L’acquittement : ACKnowledge
II. Protocole
1 2 3 4
1. Le maître libère la ligne SDA
2. L’esclave force SDA à 0
3. Le maître génère une impulsion sur SCL
4. Quand l’impulsion retombe à 0, l’esclave libère SDA
3. Transmission d’une adresse
• Nombre de composants supérieur à 2 : besoin de
définir une adresse pour chacun
• Chaque adresse est codée sur 7 bits : la valeur de
l’adresse est définie par le type de composant et
éventuellement certaines broches du circuit
permettant de configurer l’adresse.
• Adresse transmise sous la forme d’un octet
• Du bit 7 au bit 1 ( 7 bits d’adressage)
• bit 0 : R/W permet au maître d’indiquer s’il veut lire ou
écrire
II. Protocole
3. Transmission d’une adresse
• Exemple sur un circuit (mémoire EEPROM série)
II. Protocole
Bits 6 à 3 fixé à la conception du circuit
Bits 2 à 0 fixés
par l’utilisateur du circuit
(broche à Vcc ou GND)
3. Transmission d’une adresse
• Les mémoires ont un espace adressable plus grand
que les autres circuits : un premier octet adresse le
circuit, un second donne l’adresse interne de la
mémoire ; ensuite, on peut lire ou écrire une
donnée
• Certaines adresses sont réservées à des modes de
fonctionnement particuliers :
• 00000XXX
• 111111XX
II. Protocole
4. Accès à un esclave
• Choix du mode d’accès : lecture ou écriture
• 8ème bit de l’adresse (0 : écriture, 1 : lecture)
• le nombre maximal de circuits sur le bus est donc limité à
128 (7 bits d’adresse)
• exemple : A2, A1, A0 reliés à GND
• 10100000 : écriture
• 10100001 : lecture
II. Protocole
5. Ecriture d’une donnée
• 3 étapes :
1. Envoi de l’adresse de destination
2. Sélection du mode d’écriture (R/W)
3. Envoi de la donnée
II. Protocole
6. Lecture d’une donnée
• 3 étapes :
1. Le maître envoie l’adresse puis attend l’acquittement
2. L’esclave positionne l’ACK puis émet la donnée sur SDA
3. Le maître positionne ACK à 0 pour continuer la lecture ou à
1 pour la stopper
II. Protocole
Problématique
• L’I2C est un bus destiné à recevoir plusieurs maîtres
-> Nécessité d’arbitrage
• Un maître peut prendre le contrôle du bus quand
celui-ci est libre. Une possibilité existe que 2 maîtres
prennent le contrôle en même temps
• La construction en collecteur ouvert permet d’éviter
des courts-circuits électriques
• Des conflits logiques peuvent cependant exister (2
maîtres voulant positionner respectivement un 1 et
un 0 logique sur la même ligne)
III. Gestion des conflits
2. Principe
• Vérification de la possibilité de prendre le contrôle
du bus
• Si 2 maîtres prennent le contrôle en même temps :
• Aucun conflits si les 2 maîtres envoient les même données
en même temps (cas exceptionnel …)
• Un maître impose un 0 : il relira obligatoirement un 0 sur le
bus et continuera à transmettre
• Un maître souhaite envoyer un 1 sur le bus :
• si il relit un 1, la transmission peut continuer
• si il relit un 0, c’est qu’un autre maître communique et il
perd l’arbitrage et arrête d’émettre
III. Gestion des conflits
3. Exemple
III. Gestion des conflits
Le maître 2 perd l’arbitrage et arrête d’émettre (un 1 est positionné sur SDA)
Problématique
• En fonctionnement normale, l’esclave positionne
SDA à 0 juste après le dernier bit reçu, D0 (c’est
l’acquittement)
• Mais le périphérique peut être lent : un
convertisseur analogique/numérique par exemple
qui doit attendre la fin de la conversion avant de
renvoyer une donnée et le maître considère que si
ACK n’est pas positionné lors du front montant de
l’horloge (que lui-même génère), l’esclave n’est pas
présent ou ne répond pas (Time-Out)
• Une condition d’arrêt est générée avant que
l’esclave n’ait répondu
IV. Synchronisation
2. Solution
• L’esclave peut forcer la ligne SCL à 0 pour empêcher
le maître de générer un front montant et donc de
manquer la détection de l’ACK (clock stretching)
• L’esclave force SDA à 0 (crée l’ACK), mais aussi SCL
• L’esclave « prend le temps » de traiter les données
• Le maître se place en attente puisqu’il essaie d’imposer un
1 sur SCL alors qu’il lit un 0
• Quand l’esclave a terminé son traitement et peut répondre,
il libère SCL qui repasse à 1. Le maître teste alors SDA qui
est normalement toujours à 0 (l’acquittement est valide)
IV. Synchronisation
2. Solution
IV. Synchronisation
L’esclave force SDA et SCL à 0
L’esclave libère SCL
2. Solution
• Il existe une seconde solution qui consiste à
envoyer un message se terminant par un stop au
circuit qui va alors lancer le traitement des données.
• Plus tard, le maître interroge (mode lecture)
l’esclave pour obtenir le résultat
• Si le résultat n’est pas encore disponible, l’esclave n’émet
pas d’acquittement
• Entre le message de demande d’information et la
lecture du résultat, le bus est disponible pour
d’autres communications
IV. Synchronisation
• 0000 0000 : appel général (plusieurs esclaves peuvent
répondre)
• Un second octet est envoyé :
• 0000 0110 : RESET et rechargement des adresses esclaves
• 0000 0100 : rechargement des adresses esclaves
• 0000 0000 : interdit
• xxxx xxx1 : interruption
• Les autres valeurs seront ignorées
• 0000 0001 : octet de start (synchronisation des
périphériques lents et rapides)
• 0000 001x : rend temporairement (jusqu’à réception
d’une condition d’arrêt) les périphériques I2C sourds
• 0000 0110 à 0000 1111 : adresses ignorées (débugage)
V. Adresses réservées
Horloge Temps réel DS1307
• fournit les secondes, minutes, heures, jour, mois et
années
• utilise le protocole I2C pour communiquer avec un
µC
VI. Etude de composants I2C
• Registres de données
• CH : si bit 7 à 1, l’horloge est stoppée
• heures, minutes … en BCD !
• 12/24h : si bit 6 à 1, horloge en mode 24h
VI. Etude de composants I2C
• Registres de configuration
• SQWE : permet d’autoriser l’oscillation de la broche
SQW/OUT
• OUT : contrôle la valeur de sortie de la broche
SQW/OUT quand SQWE est à 0
• RS[1:0] : choix de la fréquence d’oscillation de
SQW/OUT
VI. Etude de composants I2C
• Modes de fonctionnement I2C
• Esclave récepteur (mode écriture)
• Le maître génère les bits de start et stop
• l’adresse de l’horloge est figée (on ne peut pas en mettre
plusieurs sur le même bus, ce qui n’aurait pas de sens de
toute façon …) : 1101000x
• x = 0 en mode écriture
• On envoie ensuite sur 8 bits l’initialisation du pointeur
d’adresse
• Puis les données à écrire dans les registres (l’adresse est
automatiquement incrémentée)
• On retrouve un acquittement à chaque envoi d’un octet
VI. Etude de composants I2C
• Modes de fonctionnement I2C
• Esclave récepteur (mode écriture)
• Donnez la configuration de l’horloge quand on réalise la
transmission suivante :
VI. Etude de composants I2C
Initialisation du
pointeur
d’adresse : 0x01
écriture dans le
registre d’adresse
0x01 (minutes) : 2 5 écriture dans le
registre d’adresse
0x02 (heures) :
mode 24h,
1 3
réglage de l’horloge sur 13h25
• Modes de fonctionnement I2C
• Esclave transmetteur (mode lecture)
• R/W est maintenant à 1
• Le transfert des registres commence par celui pointé par le
pointeur d’adresse
• Le maître doit arrêter le transfert en donnant un ACK
(c’est-à-dire en ne générant pas le bit d’acquittement, SDA
est laissé à 1)
VI. Etude de composants I2C
• Modes de fonctionnement I2C
• Esclave récepteur-transmetteur (initialisation du pointeur
d’adresse)
• R/W est à 0 (écriture)
• Le pointeur est initialisé à une valeur envoyée par le maître
• La condition de START est répétée (Sr)
• R/W passe à 1 (lecture)
• Les données sont envoyées à partir du pointeur
précédemment initialisé
VI. Etude de composants I2C
2. Le capteur de température DS1631
• mesure une température entre -10 et 85°C
• précision de +/- 1°C
VI. Etude de composants I2C
• Registres disponibles
VI. Etude de composants I2C
• Fonctionnement en I2C
• Registres de données sur 16 bits (TH, TL et
TEMPERATURE)
• Registre de configuration
• DONE : placé à 1 quand une conversion est terminée
• THF : flag de dépassement de la température haute
• TLF : flag de dépassement de la température basse
• NVB : à 1, signifie que l’EEPROM est occupée (écriture en
cours)
• R1:R0 : La température peut être donnée sur 9, 10, 11 ou 12
bits (ordre binaire)
VI. Etude de composants I2C
• Fonctionnement en I2C
• Registre de configuration
• POL : Polarité de TOUT (TOUT actif à l’état haut à 1)
• 1SHOT : mode de conversion (la commande de début de
conversion déclenche une seule conversion à 1 ou des
conversions continues à 0)
VI. Etude de composants I2C
• Initialisation de la communication
• Le maître doit générer une condition de start suivi de
l’adresse du DS1631 (1 0 0 1 A2 A1 A0 R/W)
• Comme l’octet suivant sera un octet de commande à
écrire, R/W devra être à 0
• Le DS1631 répond avec un ACK
• Le maître envoie alors l’octet de commande
• Le DS1631 répond avec un ACK
• Si la commande est le début ou la fin de conversion, la
transmission est terminée : le maître envoie un stop
VI. Etude de composants I2C
• Liste des commandes
• Start Convert T (0x51)
• Stop Convert T (0x22)
• Read Temperature (0xAA)
• Access TH (0xA1)
• Access TL (0xA2)
• Access Config (0xAC)
• Soft POR (0x54)
VI. Etude de composants I2C
• Ecriture dans un registre
• Lors des commandes Access Config, TH, ou TL, une
écriture doit être réalisée dans le DS1631
• Après cet octet de commande, le maître peut envoyer la
donnée à écrire dans ces registres
• Les registres TH et TL nécessitent 2 octets en commençant
par le poids fort …
• Que fait cette série de commande ?
VI. Etude de composants I2C
Accès à TH MSB = 0x02 LSB = 0x30
TH = 2,18625°C
• Lecture dans un registre
• Lors des commandes Access Config, TH, ou TL, ou Read
Temperature, une lecture peut être réalisée dans le
DS1631
• Après cet octet de commande, le maître doit envoyer un
repeatStart pour changer le mode de transmission (écriture
→ lecture)
• Les registres TH , TL et T nécessitent 2 octets en
commençant par le poids fort …
• Quelle est la commande à envoyer pour obtenir une lecture
de la température ?
VI. Etude de composants I2C
3. L’EEPROM 24LC512
• Mémoire morte
effaçable
électriquement et
programmable
• 512 kbits (64 k x 8
bits)
• Jusqu’à 8 circuits sur
le même bus
VI. Etude de composants I2C
• Fonctionnement en I2C
• Adressage :
• écriture d’un octet :
VI. Etude de composants I2C
• Fonctionnement en I2C
• écriture d’une page : plusieurs octets successifs
peuvent être écrits en une seule étape :
VI. Etude de composants I2C
On écrit dans une « page » du circuit, de 128 octets maximum. Cette page est
ensuite recopié (après le stop), l’adresse est automatiquement incrémentée à
partir de celle donnée par le maître.
• Fonctionnement en I2C
• Lecture d’un octet à l’adresse courante :
VI. Etude de composants I2C
L’adresse courante est la dernière utilisée en lecture ou en écriture +1 !
• Fonctionnement en I2C
• Lecture d’un octet à une adresse aléatoire :
VI. Etude de composants I2C
- On écrit en mémoire l’adresse à laquelle on veut lire, puis on indique un
changement de sens de transmission par un rS et une réécriture de l’adresse
mais avec R/W à 1.
- La mémoire envoie la donnée à l’adresse écrite précédemment.
- Si le maître envoie un NOACK suivi d’un stop, c’est la fin de la transmission.
• Fonctionnement en I2C
• Lecture d’une série d’octet à une adresse aléatoire :
VI. Etude de composants I2C
- On écrit en mémoire l’adresse à laquelle on veut lire, puis on indique un
changement de sens de transmission par un rS et une réécriture de l’adresse
mais avec R/W à 1.
- La mémoire envoie la donnée à l’adresse écrite précédemment.
- Si le maître envoie un ACK, la transmission continue avec la donnée suivante
en mémoire jusqu’à ce que le maître réponde par un NOACK puis un stop.
Introduction
• Le 18F458 possède un MSSP (Master Synchronous
Serial Port) qui permet une communication série
selon 2 protocoles :
• I2C
• SPI
• En I2C, le module supporte les modes suivants :
• mode maître
• mode multi-maîtres
• mode esclave
• De manière générale, le MSSP a 3 registres :
• SSPSTAT : registre de statut
• SSPCON1 : registre de configuration 1
• SSPCON2 : registre de configuration 2
VII. Gestion de l’I2C par µC
Introduction
• 2 broches sont utilisées pour la connexion au bus
I2C :
• RC3/SCK/SCL
• RC4/SDI/SDA
• Ces broches doivent être configurées en entrée (via
TRISC)
• Les fréquences supportées par le module MSSP
• 100 kHz
• 400 kHz
• 1 MHz
VII. Gestion de l’I2C par µC
Introduction
• En plus des 3 registres de
configuration du MSSP
(SSPSTAT, SSPCON1&2), le
MSSP ajoute 3 registres propres
à l’I2C:
• SSPADD : registre
d’adresse
• SSPBUF buffer de
réception/transmissio
n
• SSPSR : (shift
register) registre à
décalage pour la
transmission/réceptio
n (inaccessible
directement)
VII. Gestion de l’I2C par µC
01101010
01101010
2. Contrôle du module
• En dehors des registres de données, le module se contrôle
avec 4 registres:
1. SSPSTAT
• SMP : activation du contrôle du slew rate
 1 : mode standard (100 kHz et 1 MHz)
 0 : mode High-Speed (400 kHz)
• CKE : control des niveaux de tension en entrée
 1 : SMBus
 0 : I2C
• D/A : en mode esclave, indique si le dernier octet reçu est une
donnée (1) ou une adresse (0)
• P : indique si un bit de stop a été détecté (1)
• S : indique si un bit de start a été détecté (1)
• R/W : - En mode esclave, indique si le maître souhaite lire ou écrire
- En mode maître : indique une transmission en cours
• UA : utilisé lorsqu’on utilise l’extension d’adressage (passage
d’adresses sur 7 bits à 10 bits)
• BF : bit de statut du buffer, à 1 : indique que le buffer est plein
VII. Gestion de l’I2C par µC
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
SMP CKE D/A P S R/W UA BF
SSPSTAT
2. SSPCON1
• WCOL : collision en écriture détectée. Mis à 1 lorsqu’on écrit dans
SSPBUF alors que le bus n’est pas libre en mode maître-transmetteur.
Mis à 1 en mode esclave-transmetteur lorsque SSPBUF est modifié
alors que la transmission de la donnée précédente n’est pas
terminée.
• SSPOV : OVerflow, en réception : passe à 1 lorsqu’une donnée est
reçue alors que la précédente se trouvant dans SSPBUF n’a pas
encore été lue
• SSPEN : mise en fonction du module
• SSPM3:0 : mode de fonctionnement du module
 1111 : I2C esclave, 10 bits d’adressage, interruptions activées sur start et
stop
 1110 : I2C esclave, 7 bits d’adressage, interruptions activées sur start et stop
 1011 : I2C esclave au repos
 1000 : I2C maître, horloge = FOSC/(4 x (SSPAD+1))
 0111 : I2C esclave, 10 bits d’adressage
 0110 : I2C esclave, 7 bits d’adressage
VII. Gestion de l’I2C par µC
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
SSPCON1
3. SSPCON2
• GCEN : Appel général autorisé (esclave)
• ACKSTAT : bit du statut de l’acquittement venant de l’esclave (maître-
transmetteur)
• ACKDT : valeur du bit d’acquittement (maître-récepteur)
• ACKEN : permet de démarrer une séquence d’acquittement à la
valeur de ACKDT
• RCEN : démarre la réception d’un octet
• PEN : démarre une séquence de stop (remis à 0 automatiquement)
• SEN : démarre une séquence de start (remis à 0 automatiquement)
VII. Gestion de l’I2C par µC
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN
SSPCON2
4. SSPADD
• En mode maître, ce registre détermine la fréquence de
transmission
• Les fréquences autorisées sont : 100 kHz, 400 kHz et 1 MHz
• En mode esclave, ce registre contient l’adresse du circuit.
Le bit 0 doit toujours être positionné à 0. Quand on
utilise une adresse sur 10 bits, l’adresse est placée en 2
temps :
• on écrit 1 1 1 1 0 A9 A8 0 dans SSPADD
• on attend le passage à 1 de UA
• on écrit A7 A6 A5 A4 A3 A2 A1 A0 dans SSPADD
VII. Gestion de l’I2C par µC
3. Transmission d’un octet
• Pour transmettre un octet, il suffit d’écrire sa valeur dans
SSPBUF
• Au moment où on écrit dans ce dernier, le bit BF de SSPSTAT
passe à 1 ainsi que le flag d’interruption SSPIF de PIR1
• BF : (Buffer Full) indique une transmission en cours
• Lorsque la transmission est terminée, le bit BF repasse à 0
• Si on veut écrire dans SSPBUF alors que BF est à 1, le bit
WCOL de SSPCON1 passe à 1, indiquant une collision de
données et SSPBUF n’est pas modifié
VII. Gestion de l’I2C par µC
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
SMP CKE D/A P S R/W UA BF
SSPSTAT
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
SSPCON1
4. Réception d’un octet
• A la fin de la réception d’un octet, le bit BF passe à
1 ainsi que le flag SSPIF de PIR1
• Lorsqu’on lit le buffer SSPBUF, le bit BF passe à 0
automatiquement, par contre, il faut remettre le flag
SSPIF à 0 manuellement
• Si la réception de l’octet suivant est terminée alors
que l’octet courant n’a pas encore été lu, le bit
SSPOV (OVerflow) est mis à 1 et l’octet suivant est
perdu
VII. Gestion de l’I2C par µC
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIR1
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
SSPCON1
5. MSSP en mode maître
• Une séquence de communication I2C est toujours
initiée par un bit de start (SSPCON2.SEN)
• Ce start est suivi de l’adresse de l’esclave à
contacter (7 bits) + le bit d’écriture/lecture
permettant d’indiquer le type de transmission
• Le maître envoie ou reçoit les données puis termine
la communication par un bit de stop
(SSPCON2.PEN)
• Chaque octet envoyé ou reçu doit être suivi d’un bit
d’acquittement (négatif dans certains cas …)
• Pour changer le sens de l’échange (passage de
lecture à écriture ou vice versa), il suffit de renvoyer
un bit de start (RepeatStart) puis l’adresse de
l’esclave suivi du nouveau type d’échange (R/W)
VII. Gestion de l’I2C par µC
• Transmission maître → esclave (1/2)
• Sur le maître (µC), on met le bit SEN de SSPCON2 à 1 : la
condition de start est générée sur SDA/SCL et SEN est
remis à 0 automatiquement. Les esclaves se préparent à
recevoir une adresse.
• On écrit dans SSPBUF l’adresse de l’esclave visé (avec le
bit 0 à 0 pour R/W) : les bits BF et R/W de SSPSTAT
passent à 1. Après le 8ème bit envoyé, BF repasse à 0,
après le 9ème bit (ACK), R/W repasse à 0. Le flag SSPIF
passe à 1 et l’horloge SCL est forcée à 0. SSPIF doit être
remis à 0.
• Si l’esclave visé a lu son adresse correctement, il envoie
un ACK (0 sur SDA) ou un NOACK (SDA est laissée à 1) si
ce n’est pas le cas.
VII. Gestion de l’I2C par µC
• Transmission maître → esclave (2/2)
• L’ACK envoyé par l’esclave est recopié dans ACKSTAT de
SSPCON2 du maître. Il faut vérifier l’état de ce bit pour lancer
ou non la suite des opérations : si ACKSTAT = 0, alors le
maître peut envoyer une donnée, sinon, il faut terminer la
transmission (stop) et recommencer.
• Pour envoyer une donnée, il faut l’écrire dans SSPBUF : les
bits BF et R/W passent à 1 puis repassent à 0 à la fin de la
transmission. SSPIF passe à 1. L’esclave renvoie l’ACK (ou
NOACK)
• En lisant ACKSTAT logiciellement, on décide de la suite : si
ACK = 0, on peut continuer, si on a encore des données à
envoyer, à écrire dans SSPBUF. Sinon, on peut terminer la
transmission en positionnant PEN de SSPCONFIG2 à 1 qui
génère la condition de stop et sera remis automatiquement à
0.
VII. Gestion de l’I2C par µC
VII. Gestion de l’I2C par µC
• Réception maître ← esclave (1/2)
• On met le bit SEN à 1 pour générer la condition de start
• On écrit l’adresse de l’esclave visé dans SSPBUF en mettant
le bit 0 à 1. BF et R/W passent à 1, BF repasse à 0 après le
8ème bit et R/W après le 9ème. L’horloge SCL est forcée à 0
• Le slave envoie son ACK (ou son NOACK) et force SCL à 0
pour empêcher le maître de lire avant que les données ne
soient prêtes sur le bus.
• Le maître, si ACKSTAT = 0, doit être préparé à recevoir des
données en positionnant RCEN de SSCONF2 à 1
• L’esclave libère l’horloge, le maître la génère et la réception
commence
VII. Gestion de l’I2C par µC
• Réception maître ← esclave (2/2)
• RCEN passe à 0 automatiquement à la fin de la réception,
l’octet reçu est envoyé dans SSPBUF. BF passe à 1pour
signifier que le buffer est plein. SSPIF passe également à 1.
• L’horloge est forcée à 0 pour donner le temps au programme
de l’utilisateur de positionner l’ACK.
• On écrit 0 ou 1 (ACK/NOACK) dans ACKDT de SSPCON2 puis
on positionne à 1 le bit ACKEN pour valider l’acquittement et
l’envoyer sur la ligne. ACKEN est remis à 0 automatiquement.
SCL génère une impulsion puis est remis en pause. SSPIF est
mis à 1 après l’envoi de l’acquittement.
• Si on attend d’autres données, on envoie un ACK (0)
• Si on attend plus de donnée, on envoie un NOACK (1) suivi
d’une condition de stop si on souhaite libérer le bus ou d’une
condition de start si on souhaite refaire une transmission sans
perdre le contrôle du bus.
VII. Gestion de l’I2C par µC
VII. Gestion de l’I2C par µC
A savoir !
 Une séquence d’échange commence toujours par la
condition de start suivi de l’adresse de l’esclave visé par
la transmission. Cette adresse comprend le bit R/W (bit
0) permettant d’écrire ou de lire une donnée de l’esclave.
 BF repasse toujours automatiquement à 0 lorsque le
programme utilisateur lit SSPBUF.
 SSPIF, le flag d’interruption, doit être remis à 0
manuellement.
 A chaque octet échangé, un acquittement est ou doit
être généré (on peut ne pas le lire, mais il faut qu’il soit
présent)
 On peut changer le sens de transmission (ex : esclave
récepteur-transmetteur partie VI) en envoyant de
nouveau une condition de start (repeatStart) suivi de
l’adresse dont le bit 0 à été modifié. Ceci évite de perdre
le contrôle du bus.
VII. Gestion de l’I2C par µC
5. MSSP en mode esclave
• Si le MSSP reçoit un bit de start ou repeatStart, le
bit S de SSPSTAT passe à 1, il revient à 0
automatiquement
• Si le MSSP reçoit un bit de stop, le bit P de SSPSTAT
passe à 1 et revient automatiquement à 0
• Si le MSSP reçoit un ACK, rien ne se passe
• Si le MSSP reçoit un NOACK, il se réinitialise et se
met en attente d’une condition de start
VII. Gestion de l’I2C par µC
5. MSSP en mode esclave
• Si le MSSP reçoit une adresse égale à la sienne
• le bit D/A de SSPSTAT passe à 0
• le bit 0 de cette adresse est recopié dans R/W
• si BF = 0 et SSPOV = 0 alors l’octet reçu est copié dans
SSPBUF, SSPIF passe à 1 et BF passe à 1 seulement si
R/W = 0 (mode écriture)
• si BF = 1 et/ou SSPOV = 1, SSPBUF n’est pas modifié,
l’octet d’adresse est perdu. BF, SSPOV, et SSPIF passent à
1, un NOACK est transmis.
VII. Gestion de l’I2C par µC
• Si le MSSP reçoit un octet de donnée
• D/A passe à 1
• BF passe à 1 après que le transfert de SSPSR vers SSPBUF
a eu lieu
• Les ACK sont générés automatiquement
• BF repasse à 0 lorsque le programme utilisateur lit SSPBUF
• SSPOV doit être remis à 0 par le programme
• Le bit SKP contrôle l’horloge SCL (la bloque à 0, la libère à
1)
VII. Gestion de l’I2C par µC
BF SSPO
V
SSPSR ->
SSPBUF
Génération ACK Mise à 1 de SSPIF
0 0 Oui Oui Oui
1 0 Non Non Oui
1 1 Non Non Oui
0 1 Oui Non Oui
• Réception de donnée envoyée par un maître
• Le pic esclave détecte le bit de start sur SDA, positionne S de
SSPSTAT à 1 et se prépare à recevoir l’adresse
• L’adresse reçue est comparée à l’adresse du pic esclave
• Si l’adresse ne correspond pas, il entre dans une boucle d’attente
du bit de stop
• Si l’adresse correspond, il recopie le bit 0 dans R/W de SSPSTAT
puis vérifie BF et SSPOV pour savoir s’il peut écrire l’adresse dans
SSPBUF
• Si BF = 0 et SSPOV = 0
 il recopie SSPSR (qui contient toujours l’adresse) dans SSPBUF, BF
passe à 1
 SSPIF passe à 1
 D/A de SSPSTAT passe à 0 puisque c’est une adresse qui vient
d’arriver
 Un ACK est placé sur SDA automatiquement
VII. Gestion de l’I2C par µC
• Réception de donnée envoyée par un maître
• Le programme détecte (par scrutation ou interruption *) que BF
ou/et SSPIF est passé à 1
 On lit SSPBUF pour que BF repasse à 0 et que le système soit
prêt à recevoir les données suivantes
 On lit R/W pour savoir si on va recevoir une donnée ou en
transmettre une (ici à 0, on va recevoir une donnée)
• Le pic attend la réception du 8ème bit de donnée, vérifie BF et
SSPOV puis transfert la donnée dans SSPBUF en mettant BF,
SSPIF et D/A à 1
• Le programme doit lire SSPBUF pour que BF repasse à 0 et pour
stocker ou traiter la donnée
• On peut recevoir directement une autre donnée ou recevoir un bit
de stop ou un repeatStart. Il faut donc tester BF, SSPIF, P et S
pour savoir quoi faire.
VII. Gestion de l’I2C par µC
* Les interruptions de MSSP sont autorisées via le bit SSPIE de PIE1
• Transmission de donnée demandée par un
maître
• Le pic détecte le bit de start, S est mis à 1
• Le pic vérifie l’adresse
• Si elle correspond, il recopie le bit 0 dans R/W (1 dans
notre cas)
• Il vérifie BF et SSPOV puis transfert l’adresse dans SSPBUF
mais BF ne passe pas à 1
• SSPIF passe à 1, D/A passe à 0
• Le pic place un ACK sur SDA automatiquement
VII. Gestion de l’I2C par µC
• Transmission de donnée demandée par un maître
• Dans le programme utilisateur, SSPIF est passé à 1, on doit
vérifier R/W
 ici à 1, on va devoir envoyer un octet vers le maître
 On bloque SCL pour avoir le temps de placer la donnée (CKP =
0)
 On place le premier octet de donnée dans SSPBUF, BF passe
alors à 1
 On libère SCL (CKP = 1)
 Le maître ayant la main sur SCL, il envoie une salve
d’impulsions sur SCL pour récupérer l’octet via le registre à
décalage SSPSR
 BF repasse à 0 et SSPIF passe à 1
 Le maître peut envoyer un ACK ou un NOACK suivi d’un stop ou
d’un repeatStart.
VII. Gestion de l’I2C par µC

Cours Informatique Industrielle : le bus I2C

  • 1.
    Alexandre.ravey@utbm.fr IF71 : CircuitsLogiques Programmables Communications Numériques Introduction Protocole Gestion des conflits Synchronisation Etude de circuits I2C Gestion du bus par µC
  • 2.
    Présentation • I2C :Inter Integrated Circuit • développé au début des années 80. A l’origine pour la communication entre un microprocesseur et les circuits présents dans un téléviseur « moderne ». • Communication entre composants électroniques sur 3 fils : • SDA : le signal de données • SCL : le signal d’horloge • Masse : signal de référence I. Introduction
  • 3.
    2. Caractéristiques • Seulement2 lignes (+masse) • Plusieurs éléments sur le même bus • Une adresse par périphérique • Multi-maître, détection de collision et arbitrage • Bus série, sur 8 bits, bi-directionnel • 100kbps en mode standard • 400kbps en mode fast • 3,2 Mbps en mode high-speed • Filtrage intégré (réjection pic parasites) • Pas de nombre limite de périphérique en théorie (en pratique la capacité totale du bus ne doit pas excéder 400pF) I. Introduction
  • 4.
    3. Principe defonctionnement • Entrées-sorties en collecteur/drain ouvert (fonction ET câblée) • Les lignes SDA et SCL sont au niveau haut au repos • Un composant relié au bus ne peut que forcer les lignes au niveau bas, pas au niveau haut I. Introduction
  • 5.
    3. Principe defonctionnement I. Introduction
  • 6.
  • 7.
    Prise de contrôledu bus • le bus doit être au repos avant d’en prendre le contrôle (SDA et SCL à 1) • Il existe une condition de départ (start) et une condition d’arrêt (stop) • condition de départ : SDA passe à 0 • condition d’arrêt : SDA passe à 1 • SCL reste à 1 • Si le bus est libre, un composant peut prendre le contrôle du bus. Il devient alors maître et doit générer le signal d’horloge II. Protocole
  • 8.
    • Bits destart/stop II. Protocole
  • 9.
    2. Transmission d’unoctet • Le maître applique l’état du bit de poids fort (bit 7) sur SDA • Cet état est validé par la mise à 1 de SCL • Le maître génère la suite de l’horloge en passant SCL à 0 • L’état du bit 6 est alors appliqué sur SDA • … • ainsi de suite jusqu’au bit de poids faible (bit 0) • La ligne SDA est remise à 1 par le maître • Le maître scrute l’état de SDA : si SDA passe à 0 alors c’est que l’esclave vient de positionner SDA à 0 : il s’agit du bit d’acquittement ACK • Si le bit d’acquittement est présent sur SDA, le maître peut passer à la transmission suivante ou libérer la ligne II. Protocole
  • 10.
    • SCL :horloge imposée par le maître • SDA maître : Niveaux de données imposés par le maître • SDA esclave : Niveaux de données imposés par l’esclave • SDA réel : Niveaux logiques réels lus sur le bus II. Protocole
  • 11.
    • L’acquittement :ACKnowledge II. Protocole 1 2 3 4 1. Le maître libère la ligne SDA 2. L’esclave force SDA à 0 3. Le maître génère une impulsion sur SCL 4. Quand l’impulsion retombe à 0, l’esclave libère SDA
  • 12.
    3. Transmission d’uneadresse • Nombre de composants supérieur à 2 : besoin de définir une adresse pour chacun • Chaque adresse est codée sur 7 bits : la valeur de l’adresse est définie par le type de composant et éventuellement certaines broches du circuit permettant de configurer l’adresse. • Adresse transmise sous la forme d’un octet • Du bit 7 au bit 1 ( 7 bits d’adressage) • bit 0 : R/W permet au maître d’indiquer s’il veut lire ou écrire II. Protocole
  • 13.
    3. Transmission d’uneadresse • Exemple sur un circuit (mémoire EEPROM série) II. Protocole Bits 6 à 3 fixé à la conception du circuit Bits 2 à 0 fixés par l’utilisateur du circuit (broche à Vcc ou GND)
  • 14.
    3. Transmission d’uneadresse • Les mémoires ont un espace adressable plus grand que les autres circuits : un premier octet adresse le circuit, un second donne l’adresse interne de la mémoire ; ensuite, on peut lire ou écrire une donnée • Certaines adresses sont réservées à des modes de fonctionnement particuliers : • 00000XXX • 111111XX II. Protocole
  • 15.
    4. Accès àun esclave • Choix du mode d’accès : lecture ou écriture • 8ème bit de l’adresse (0 : écriture, 1 : lecture) • le nombre maximal de circuits sur le bus est donc limité à 128 (7 bits d’adresse) • exemple : A2, A1, A0 reliés à GND • 10100000 : écriture • 10100001 : lecture II. Protocole
  • 16.
    5. Ecriture d’unedonnée • 3 étapes : 1. Envoi de l’adresse de destination 2. Sélection du mode d’écriture (R/W) 3. Envoi de la donnée II. Protocole
  • 17.
    6. Lecture d’unedonnée • 3 étapes : 1. Le maître envoie l’adresse puis attend l’acquittement 2. L’esclave positionne l’ACK puis émet la donnée sur SDA 3. Le maître positionne ACK à 0 pour continuer la lecture ou à 1 pour la stopper II. Protocole
  • 18.
    Problématique • L’I2C estun bus destiné à recevoir plusieurs maîtres -> Nécessité d’arbitrage • Un maître peut prendre le contrôle du bus quand celui-ci est libre. Une possibilité existe que 2 maîtres prennent le contrôle en même temps • La construction en collecteur ouvert permet d’éviter des courts-circuits électriques • Des conflits logiques peuvent cependant exister (2 maîtres voulant positionner respectivement un 1 et un 0 logique sur la même ligne) III. Gestion des conflits
  • 19.
    2. Principe • Vérificationde la possibilité de prendre le contrôle du bus • Si 2 maîtres prennent le contrôle en même temps : • Aucun conflits si les 2 maîtres envoient les même données en même temps (cas exceptionnel …) • Un maître impose un 0 : il relira obligatoirement un 0 sur le bus et continuera à transmettre • Un maître souhaite envoyer un 1 sur le bus : • si il relit un 1, la transmission peut continuer • si il relit un 0, c’est qu’un autre maître communique et il perd l’arbitrage et arrête d’émettre III. Gestion des conflits
  • 20.
    3. Exemple III. Gestiondes conflits Le maître 2 perd l’arbitrage et arrête d’émettre (un 1 est positionné sur SDA)
  • 21.
    Problématique • En fonctionnementnormale, l’esclave positionne SDA à 0 juste après le dernier bit reçu, D0 (c’est l’acquittement) • Mais le périphérique peut être lent : un convertisseur analogique/numérique par exemple qui doit attendre la fin de la conversion avant de renvoyer une donnée et le maître considère que si ACK n’est pas positionné lors du front montant de l’horloge (que lui-même génère), l’esclave n’est pas présent ou ne répond pas (Time-Out) • Une condition d’arrêt est générée avant que l’esclave n’ait répondu IV. Synchronisation
  • 22.
    2. Solution • L’esclavepeut forcer la ligne SCL à 0 pour empêcher le maître de générer un front montant et donc de manquer la détection de l’ACK (clock stretching) • L’esclave force SDA à 0 (crée l’ACK), mais aussi SCL • L’esclave « prend le temps » de traiter les données • Le maître se place en attente puisqu’il essaie d’imposer un 1 sur SCL alors qu’il lit un 0 • Quand l’esclave a terminé son traitement et peut répondre, il libère SCL qui repasse à 1. Le maître teste alors SDA qui est normalement toujours à 0 (l’acquittement est valide) IV. Synchronisation
  • 23.
    2. Solution IV. Synchronisation L’esclaveforce SDA et SCL à 0 L’esclave libère SCL
  • 24.
    2. Solution • Ilexiste une seconde solution qui consiste à envoyer un message se terminant par un stop au circuit qui va alors lancer le traitement des données. • Plus tard, le maître interroge (mode lecture) l’esclave pour obtenir le résultat • Si le résultat n’est pas encore disponible, l’esclave n’émet pas d’acquittement • Entre le message de demande d’information et la lecture du résultat, le bus est disponible pour d’autres communications IV. Synchronisation
  • 25.
    • 0000 0000: appel général (plusieurs esclaves peuvent répondre) • Un second octet est envoyé : • 0000 0110 : RESET et rechargement des adresses esclaves • 0000 0100 : rechargement des adresses esclaves • 0000 0000 : interdit • xxxx xxx1 : interruption • Les autres valeurs seront ignorées • 0000 0001 : octet de start (synchronisation des périphériques lents et rapides) • 0000 001x : rend temporairement (jusqu’à réception d’une condition d’arrêt) les périphériques I2C sourds • 0000 0110 à 0000 1111 : adresses ignorées (débugage) V. Adresses réservées
  • 26.
    Horloge Temps réelDS1307 • fournit les secondes, minutes, heures, jour, mois et années • utilise le protocole I2C pour communiquer avec un µC VI. Etude de composants I2C
  • 27.
    • Registres dedonnées • CH : si bit 7 à 1, l’horloge est stoppée • heures, minutes … en BCD ! • 12/24h : si bit 6 à 1, horloge en mode 24h VI. Etude de composants I2C
  • 28.
    • Registres deconfiguration • SQWE : permet d’autoriser l’oscillation de la broche SQW/OUT • OUT : contrôle la valeur de sortie de la broche SQW/OUT quand SQWE est à 0 • RS[1:0] : choix de la fréquence d’oscillation de SQW/OUT VI. Etude de composants I2C
  • 29.
    • Modes defonctionnement I2C • Esclave récepteur (mode écriture) • Le maître génère les bits de start et stop • l’adresse de l’horloge est figée (on ne peut pas en mettre plusieurs sur le même bus, ce qui n’aurait pas de sens de toute façon …) : 1101000x • x = 0 en mode écriture • On envoie ensuite sur 8 bits l’initialisation du pointeur d’adresse • Puis les données à écrire dans les registres (l’adresse est automatiquement incrémentée) • On retrouve un acquittement à chaque envoi d’un octet VI. Etude de composants I2C
  • 30.
    • Modes defonctionnement I2C • Esclave récepteur (mode écriture) • Donnez la configuration de l’horloge quand on réalise la transmission suivante : VI. Etude de composants I2C Initialisation du pointeur d’adresse : 0x01 écriture dans le registre d’adresse 0x01 (minutes) : 2 5 écriture dans le registre d’adresse 0x02 (heures) : mode 24h, 1 3 réglage de l’horloge sur 13h25
  • 31.
    • Modes defonctionnement I2C • Esclave transmetteur (mode lecture) • R/W est maintenant à 1 • Le transfert des registres commence par celui pointé par le pointeur d’adresse • Le maître doit arrêter le transfert en donnant un ACK (c’est-à-dire en ne générant pas le bit d’acquittement, SDA est laissé à 1) VI. Etude de composants I2C
  • 32.
    • Modes defonctionnement I2C • Esclave récepteur-transmetteur (initialisation du pointeur d’adresse) • R/W est à 0 (écriture) • Le pointeur est initialisé à une valeur envoyée par le maître • La condition de START est répétée (Sr) • R/W passe à 1 (lecture) • Les données sont envoyées à partir du pointeur précédemment initialisé VI. Etude de composants I2C
  • 33.
    2. Le capteurde température DS1631 • mesure une température entre -10 et 85°C • précision de +/- 1°C VI. Etude de composants I2C
  • 34.
    • Registres disponibles VI.Etude de composants I2C
  • 35.
    • Fonctionnement enI2C • Registres de données sur 16 bits (TH, TL et TEMPERATURE) • Registre de configuration • DONE : placé à 1 quand une conversion est terminée • THF : flag de dépassement de la température haute • TLF : flag de dépassement de la température basse • NVB : à 1, signifie que l’EEPROM est occupée (écriture en cours) • R1:R0 : La température peut être donnée sur 9, 10, 11 ou 12 bits (ordre binaire) VI. Etude de composants I2C
  • 36.
    • Fonctionnement enI2C • Registre de configuration • POL : Polarité de TOUT (TOUT actif à l’état haut à 1) • 1SHOT : mode de conversion (la commande de début de conversion déclenche une seule conversion à 1 ou des conversions continues à 0) VI. Etude de composants I2C
  • 37.
    • Initialisation dela communication • Le maître doit générer une condition de start suivi de l’adresse du DS1631 (1 0 0 1 A2 A1 A0 R/W) • Comme l’octet suivant sera un octet de commande à écrire, R/W devra être à 0 • Le DS1631 répond avec un ACK • Le maître envoie alors l’octet de commande • Le DS1631 répond avec un ACK • Si la commande est le début ou la fin de conversion, la transmission est terminée : le maître envoie un stop VI. Etude de composants I2C
  • 38.
    • Liste descommandes • Start Convert T (0x51) • Stop Convert T (0x22) • Read Temperature (0xAA) • Access TH (0xA1) • Access TL (0xA2) • Access Config (0xAC) • Soft POR (0x54) VI. Etude de composants I2C
  • 39.
    • Ecriture dansun registre • Lors des commandes Access Config, TH, ou TL, une écriture doit être réalisée dans le DS1631 • Après cet octet de commande, le maître peut envoyer la donnée à écrire dans ces registres • Les registres TH et TL nécessitent 2 octets en commençant par le poids fort … • Que fait cette série de commande ? VI. Etude de composants I2C Accès à TH MSB = 0x02 LSB = 0x30 TH = 2,18625°C
  • 40.
    • Lecture dansun registre • Lors des commandes Access Config, TH, ou TL, ou Read Temperature, une lecture peut être réalisée dans le DS1631 • Après cet octet de commande, le maître doit envoyer un repeatStart pour changer le mode de transmission (écriture → lecture) • Les registres TH , TL et T nécessitent 2 octets en commençant par le poids fort … • Quelle est la commande à envoyer pour obtenir une lecture de la température ? VI. Etude de composants I2C
  • 41.
    3. L’EEPROM 24LC512 •Mémoire morte effaçable électriquement et programmable • 512 kbits (64 k x 8 bits) • Jusqu’à 8 circuits sur le même bus VI. Etude de composants I2C
  • 42.
    • Fonctionnement enI2C • Adressage : • écriture d’un octet : VI. Etude de composants I2C
  • 43.
    • Fonctionnement enI2C • écriture d’une page : plusieurs octets successifs peuvent être écrits en une seule étape : VI. Etude de composants I2C On écrit dans une « page » du circuit, de 128 octets maximum. Cette page est ensuite recopié (après le stop), l’adresse est automatiquement incrémentée à partir de celle donnée par le maître.
  • 44.
    • Fonctionnement enI2C • Lecture d’un octet à l’adresse courante : VI. Etude de composants I2C L’adresse courante est la dernière utilisée en lecture ou en écriture +1 !
  • 45.
    • Fonctionnement enI2C • Lecture d’un octet à une adresse aléatoire : VI. Etude de composants I2C - On écrit en mémoire l’adresse à laquelle on veut lire, puis on indique un changement de sens de transmission par un rS et une réécriture de l’adresse mais avec R/W à 1. - La mémoire envoie la donnée à l’adresse écrite précédemment. - Si le maître envoie un NOACK suivi d’un stop, c’est la fin de la transmission.
  • 46.
    • Fonctionnement enI2C • Lecture d’une série d’octet à une adresse aléatoire : VI. Etude de composants I2C - On écrit en mémoire l’adresse à laquelle on veut lire, puis on indique un changement de sens de transmission par un rS et une réécriture de l’adresse mais avec R/W à 1. - La mémoire envoie la donnée à l’adresse écrite précédemment. - Si le maître envoie un ACK, la transmission continue avec la donnée suivante en mémoire jusqu’à ce que le maître réponde par un NOACK puis un stop.
  • 47.
    Introduction • Le 18F458possède un MSSP (Master Synchronous Serial Port) qui permet une communication série selon 2 protocoles : • I2C • SPI • En I2C, le module supporte les modes suivants : • mode maître • mode multi-maîtres • mode esclave • De manière générale, le MSSP a 3 registres : • SSPSTAT : registre de statut • SSPCON1 : registre de configuration 1 • SSPCON2 : registre de configuration 2 VII. Gestion de l’I2C par µC
  • 48.
    Introduction • 2 brochessont utilisées pour la connexion au bus I2C : • RC3/SCK/SCL • RC4/SDI/SDA • Ces broches doivent être configurées en entrée (via TRISC) • Les fréquences supportées par le module MSSP • 100 kHz • 400 kHz • 1 MHz VII. Gestion de l’I2C par µC
  • 49.
    Introduction • En plusdes 3 registres de configuration du MSSP (SSPSTAT, SSPCON1&2), le MSSP ajoute 3 registres propres à l’I2C: • SSPADD : registre d’adresse • SSPBUF buffer de réception/transmissio n • SSPSR : (shift register) registre à décalage pour la transmission/réceptio n (inaccessible directement) VII. Gestion de l’I2C par µC 01101010 01101010
  • 50.
    2. Contrôle dumodule • En dehors des registres de données, le module se contrôle avec 4 registres: 1. SSPSTAT • SMP : activation du contrôle du slew rate  1 : mode standard (100 kHz et 1 MHz)  0 : mode High-Speed (400 kHz) • CKE : control des niveaux de tension en entrée  1 : SMBus  0 : I2C • D/A : en mode esclave, indique si le dernier octet reçu est une donnée (1) ou une adresse (0) • P : indique si un bit de stop a été détecté (1) • S : indique si un bit de start a été détecté (1) • R/W : - En mode esclave, indique si le maître souhaite lire ou écrire - En mode maître : indique une transmission en cours • UA : utilisé lorsqu’on utilise l’extension d’adressage (passage d’adresses sur 7 bits à 10 bits) • BF : bit de statut du buffer, à 1 : indique que le buffer est plein VII. Gestion de l’I2C par µC Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SMP CKE D/A P S R/W UA BF SSPSTAT
  • 51.
    2. SSPCON1 • WCOL: collision en écriture détectée. Mis à 1 lorsqu’on écrit dans SSPBUF alors que le bus n’est pas libre en mode maître-transmetteur. Mis à 1 en mode esclave-transmetteur lorsque SSPBUF est modifié alors que la transmission de la donnée précédente n’est pas terminée. • SSPOV : OVerflow, en réception : passe à 1 lorsqu’une donnée est reçue alors que la précédente se trouvant dans SSPBUF n’a pas encore été lue • SSPEN : mise en fonction du module • SSPM3:0 : mode de fonctionnement du module  1111 : I2C esclave, 10 bits d’adressage, interruptions activées sur start et stop  1110 : I2C esclave, 7 bits d’adressage, interruptions activées sur start et stop  1011 : I2C esclave au repos  1000 : I2C maître, horloge = FOSC/(4 x (SSPAD+1))  0111 : I2C esclave, 10 bits d’adressage  0110 : I2C esclave, 7 bits d’adressage VII. Gestion de l’I2C par µC Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 SSPCON1
  • 52.
    3. SSPCON2 • GCEN: Appel général autorisé (esclave) • ACKSTAT : bit du statut de l’acquittement venant de l’esclave (maître- transmetteur) • ACKDT : valeur du bit d’acquittement (maître-récepteur) • ACKEN : permet de démarrer une séquence d’acquittement à la valeur de ACKDT • RCEN : démarre la réception d’un octet • PEN : démarre une séquence de stop (remis à 0 automatiquement) • SEN : démarre une séquence de start (remis à 0 automatiquement) VII. Gestion de l’I2C par µC Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN SSPCON2
  • 53.
    4. SSPADD • Enmode maître, ce registre détermine la fréquence de transmission • Les fréquences autorisées sont : 100 kHz, 400 kHz et 1 MHz • En mode esclave, ce registre contient l’adresse du circuit. Le bit 0 doit toujours être positionné à 0. Quand on utilise une adresse sur 10 bits, l’adresse est placée en 2 temps : • on écrit 1 1 1 1 0 A9 A8 0 dans SSPADD • on attend le passage à 1 de UA • on écrit A7 A6 A5 A4 A3 A2 A1 A0 dans SSPADD VII. Gestion de l’I2C par µC
  • 54.
    3. Transmission d’unoctet • Pour transmettre un octet, il suffit d’écrire sa valeur dans SSPBUF • Au moment où on écrit dans ce dernier, le bit BF de SSPSTAT passe à 1 ainsi que le flag d’interruption SSPIF de PIR1 • BF : (Buffer Full) indique une transmission en cours • Lorsque la transmission est terminée, le bit BF repasse à 0 • Si on veut écrire dans SSPBUF alors que BF est à 1, le bit WCOL de SSPCON1 passe à 1, indiquant une collision de données et SSPBUF n’est pas modifié VII. Gestion de l’I2C par µC Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SMP CKE D/A P S R/W UA BF SSPSTAT Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 SSPCON1
  • 55.
    4. Réception d’unoctet • A la fin de la réception d’un octet, le bit BF passe à 1 ainsi que le flag SSPIF de PIR1 • Lorsqu’on lit le buffer SSPBUF, le bit BF passe à 0 automatiquement, par contre, il faut remettre le flag SSPIF à 0 manuellement • Si la réception de l’octet suivant est terminée alors que l’octet courant n’a pas encore été lu, le bit SSPOV (OVerflow) est mis à 1 et l’octet suivant est perdu VII. Gestion de l’I2C par µC Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIR1 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 SSPCON1
  • 56.
    5. MSSP enmode maître • Une séquence de communication I2C est toujours initiée par un bit de start (SSPCON2.SEN) • Ce start est suivi de l’adresse de l’esclave à contacter (7 bits) + le bit d’écriture/lecture permettant d’indiquer le type de transmission • Le maître envoie ou reçoit les données puis termine la communication par un bit de stop (SSPCON2.PEN) • Chaque octet envoyé ou reçu doit être suivi d’un bit d’acquittement (négatif dans certains cas …) • Pour changer le sens de l’échange (passage de lecture à écriture ou vice versa), il suffit de renvoyer un bit de start (RepeatStart) puis l’adresse de l’esclave suivi du nouveau type d’échange (R/W) VII. Gestion de l’I2C par µC
  • 57.
    • Transmission maître→ esclave (1/2) • Sur le maître (µC), on met le bit SEN de SSPCON2 à 1 : la condition de start est générée sur SDA/SCL et SEN est remis à 0 automatiquement. Les esclaves se préparent à recevoir une adresse. • On écrit dans SSPBUF l’adresse de l’esclave visé (avec le bit 0 à 0 pour R/W) : les bits BF et R/W de SSPSTAT passent à 1. Après le 8ème bit envoyé, BF repasse à 0, après le 9ème bit (ACK), R/W repasse à 0. Le flag SSPIF passe à 1 et l’horloge SCL est forcée à 0. SSPIF doit être remis à 0. • Si l’esclave visé a lu son adresse correctement, il envoie un ACK (0 sur SDA) ou un NOACK (SDA est laissée à 1) si ce n’est pas le cas. VII. Gestion de l’I2C par µC
  • 58.
    • Transmission maître→ esclave (2/2) • L’ACK envoyé par l’esclave est recopié dans ACKSTAT de SSPCON2 du maître. Il faut vérifier l’état de ce bit pour lancer ou non la suite des opérations : si ACKSTAT = 0, alors le maître peut envoyer une donnée, sinon, il faut terminer la transmission (stop) et recommencer. • Pour envoyer une donnée, il faut l’écrire dans SSPBUF : les bits BF et R/W passent à 1 puis repassent à 0 à la fin de la transmission. SSPIF passe à 1. L’esclave renvoie l’ACK (ou NOACK) • En lisant ACKSTAT logiciellement, on décide de la suite : si ACK = 0, on peut continuer, si on a encore des données à envoyer, à écrire dans SSPBUF. Sinon, on peut terminer la transmission en positionnant PEN de SSPCONFIG2 à 1 qui génère la condition de stop et sera remis automatiquement à 0. VII. Gestion de l’I2C par µC
  • 59.
    VII. Gestion del’I2C par µC
  • 60.
    • Réception maître← esclave (1/2) • On met le bit SEN à 1 pour générer la condition de start • On écrit l’adresse de l’esclave visé dans SSPBUF en mettant le bit 0 à 1. BF et R/W passent à 1, BF repasse à 0 après le 8ème bit et R/W après le 9ème. L’horloge SCL est forcée à 0 • Le slave envoie son ACK (ou son NOACK) et force SCL à 0 pour empêcher le maître de lire avant que les données ne soient prêtes sur le bus. • Le maître, si ACKSTAT = 0, doit être préparé à recevoir des données en positionnant RCEN de SSCONF2 à 1 • L’esclave libère l’horloge, le maître la génère et la réception commence VII. Gestion de l’I2C par µC
  • 61.
    • Réception maître← esclave (2/2) • RCEN passe à 0 automatiquement à la fin de la réception, l’octet reçu est envoyé dans SSPBUF. BF passe à 1pour signifier que le buffer est plein. SSPIF passe également à 1. • L’horloge est forcée à 0 pour donner le temps au programme de l’utilisateur de positionner l’ACK. • On écrit 0 ou 1 (ACK/NOACK) dans ACKDT de SSPCON2 puis on positionne à 1 le bit ACKEN pour valider l’acquittement et l’envoyer sur la ligne. ACKEN est remis à 0 automatiquement. SCL génère une impulsion puis est remis en pause. SSPIF est mis à 1 après l’envoi de l’acquittement. • Si on attend d’autres données, on envoie un ACK (0) • Si on attend plus de donnée, on envoie un NOACK (1) suivi d’une condition de stop si on souhaite libérer le bus ou d’une condition de start si on souhaite refaire une transmission sans perdre le contrôle du bus. VII. Gestion de l’I2C par µC
  • 62.
    VII. Gestion del’I2C par µC
  • 63.
    A savoir ! Une séquence d’échange commence toujours par la condition de start suivi de l’adresse de l’esclave visé par la transmission. Cette adresse comprend le bit R/W (bit 0) permettant d’écrire ou de lire une donnée de l’esclave.  BF repasse toujours automatiquement à 0 lorsque le programme utilisateur lit SSPBUF.  SSPIF, le flag d’interruption, doit être remis à 0 manuellement.  A chaque octet échangé, un acquittement est ou doit être généré (on peut ne pas le lire, mais il faut qu’il soit présent)  On peut changer le sens de transmission (ex : esclave récepteur-transmetteur partie VI) en envoyant de nouveau une condition de start (repeatStart) suivi de l’adresse dont le bit 0 à été modifié. Ceci évite de perdre le contrôle du bus. VII. Gestion de l’I2C par µC
  • 64.
    5. MSSP enmode esclave • Si le MSSP reçoit un bit de start ou repeatStart, le bit S de SSPSTAT passe à 1, il revient à 0 automatiquement • Si le MSSP reçoit un bit de stop, le bit P de SSPSTAT passe à 1 et revient automatiquement à 0 • Si le MSSP reçoit un ACK, rien ne se passe • Si le MSSP reçoit un NOACK, il se réinitialise et se met en attente d’une condition de start VII. Gestion de l’I2C par µC
  • 65.
    5. MSSP enmode esclave • Si le MSSP reçoit une adresse égale à la sienne • le bit D/A de SSPSTAT passe à 0 • le bit 0 de cette adresse est recopié dans R/W • si BF = 0 et SSPOV = 0 alors l’octet reçu est copié dans SSPBUF, SSPIF passe à 1 et BF passe à 1 seulement si R/W = 0 (mode écriture) • si BF = 1 et/ou SSPOV = 1, SSPBUF n’est pas modifié, l’octet d’adresse est perdu. BF, SSPOV, et SSPIF passent à 1, un NOACK est transmis. VII. Gestion de l’I2C par µC
  • 66.
    • Si leMSSP reçoit un octet de donnée • D/A passe à 1 • BF passe à 1 après que le transfert de SSPSR vers SSPBUF a eu lieu • Les ACK sont générés automatiquement • BF repasse à 0 lorsque le programme utilisateur lit SSPBUF • SSPOV doit être remis à 0 par le programme • Le bit SKP contrôle l’horloge SCL (la bloque à 0, la libère à 1) VII. Gestion de l’I2C par µC BF SSPO V SSPSR -> SSPBUF Génération ACK Mise à 1 de SSPIF 0 0 Oui Oui Oui 1 0 Non Non Oui 1 1 Non Non Oui 0 1 Oui Non Oui
  • 67.
    • Réception dedonnée envoyée par un maître • Le pic esclave détecte le bit de start sur SDA, positionne S de SSPSTAT à 1 et se prépare à recevoir l’adresse • L’adresse reçue est comparée à l’adresse du pic esclave • Si l’adresse ne correspond pas, il entre dans une boucle d’attente du bit de stop • Si l’adresse correspond, il recopie le bit 0 dans R/W de SSPSTAT puis vérifie BF et SSPOV pour savoir s’il peut écrire l’adresse dans SSPBUF • Si BF = 0 et SSPOV = 0  il recopie SSPSR (qui contient toujours l’adresse) dans SSPBUF, BF passe à 1  SSPIF passe à 1  D/A de SSPSTAT passe à 0 puisque c’est une adresse qui vient d’arriver  Un ACK est placé sur SDA automatiquement VII. Gestion de l’I2C par µC
  • 68.
    • Réception dedonnée envoyée par un maître • Le programme détecte (par scrutation ou interruption *) que BF ou/et SSPIF est passé à 1  On lit SSPBUF pour que BF repasse à 0 et que le système soit prêt à recevoir les données suivantes  On lit R/W pour savoir si on va recevoir une donnée ou en transmettre une (ici à 0, on va recevoir une donnée) • Le pic attend la réception du 8ème bit de donnée, vérifie BF et SSPOV puis transfert la donnée dans SSPBUF en mettant BF, SSPIF et D/A à 1 • Le programme doit lire SSPBUF pour que BF repasse à 0 et pour stocker ou traiter la donnée • On peut recevoir directement une autre donnée ou recevoir un bit de stop ou un repeatStart. Il faut donc tester BF, SSPIF, P et S pour savoir quoi faire. VII. Gestion de l’I2C par µC * Les interruptions de MSSP sont autorisées via le bit SSPIE de PIE1
  • 69.
    • Transmission dedonnée demandée par un maître • Le pic détecte le bit de start, S est mis à 1 • Le pic vérifie l’adresse • Si elle correspond, il recopie le bit 0 dans R/W (1 dans notre cas) • Il vérifie BF et SSPOV puis transfert l’adresse dans SSPBUF mais BF ne passe pas à 1 • SSPIF passe à 1, D/A passe à 0 • Le pic place un ACK sur SDA automatiquement VII. Gestion de l’I2C par µC
  • 70.
    • Transmission dedonnée demandée par un maître • Dans le programme utilisateur, SSPIF est passé à 1, on doit vérifier R/W  ici à 1, on va devoir envoyer un octet vers le maître  On bloque SCL pour avoir le temps de placer la donnée (CKP = 0)  On place le premier octet de donnée dans SSPBUF, BF passe alors à 1  On libère SCL (CKP = 1)  Le maître ayant la main sur SCL, il envoie une salve d’impulsions sur SCL pour récupérer l’octet via le registre à décalage SSPSR  BF repasse à 0 et SSPIF passe à 1  Le maître peut envoyer un ACK ou un NOACK suivi d’un stop ou d’un repeatStart. VII. Gestion de l’I2C par µC