LE BUS I2C

Transcription

LE BUS I2C
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
LA FAMILLE 8051
Le 8051 est le chef de file d’une grande famille de microcontroleurs fabriqués par INTEL
,PHILIPS, SIEMENS, HARRIS . Chaque constructeur a développé ses propres versions qui sont en
principe toujours compatibles avec le 8051 de base. Récemment des circuits beaucoup plus rapides
et puissants sont apparus sur le marché en conservant cependant cette compatibilité. Les divers
circuits se distinguent par :
- Le nombre de ports disponibles
- Le nombre de Timers
- La capacité mémoire RAM ou ROM
- L’existence de convertisseurs analogiques numériques et réciproquement
- D’un Watch dog intégré
- La capacité de gérer des liaisons séries particulières telles que le BUS I2C de PHILIPS
La première extension du 8051 est le 8052 d’INTEL dont la structure est reprise par de
nombreux autres circuits .Il se distingue du 8031 par une extension de la mémoire et la présence
d’un troisième timer le TIMER 2
Le 8052 / 8032
Comme pour le 8031 il existe en 3 versions :
- 8052 avec 8K de ROM interne ( au lieu de 4K )
- 8032 sans ROM interne
- 8752 contenant une EPROM programmable 1 seule fois (Version OTP) ou plusieurs par
effacement UV (avec fenêtre de quartz ) .
-Le 8052 est compatible broche pour broche avec son prédécesseur.
La Structure mémoire
65536=FFFF
RAM
ext
ROM
ext
MOVX
MOVC
Interne
MOV
255
1FFFH
Adr
SFR
Indirect Adr Direct
2000H
128
127
Ads Direct
ROM int
8052
EA=1
et indirect
48
32 Adress Bit
Banques
0
0
RD
EA=0
0
WR
0
PSEN
Champ mémoire du 8052 / 8032
Elle est semblable à celle du 8031 et gérée par les mêmes signaux ,avec les différences
suivantes:
- La ROM interne quand elle existe est de 8K au lieu de 4
- Il existe 256 octets de RAM utilisateur au lieu de 128 (plus le SFR) (Figure ci dessus)
constitués par :
40
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
- 128 octets comme pour le 8031 accessibles par adressage direct ou non (@R0
ou1)
- 128 octets de RAM entre les adresses 128 et 255
accessibles seulement par adressage indirect .
comme le SFR mais
Si R0=90H
MOV 90H,A est le chargement de A dans le port P1
mais :MOV @R0,A n’est que le transfert du contenu de A dans une case mémoire interne.
Le TIMER 2
Le 8052 posséde en plus des deux timers du 8051 un TIMER 2 accessible entre autre par
deux bornes extérieures qui sont les bornes P1.0 (T2) et P1.1 (T2EX) du port P1 . C’est un compteur
16 bits qui peut fonctionner sous 3 modes déterminés par l’état des bits RCLK TCLK ,CP/RL2 et TR2
localisés dans un registre de commande spécial T2CON.
Une interruption supplémentaire est associée à ce timer TF2+EXF2 de vecteur 002BH
RCLK + TCLK
CP/RL2/
TR2
Mode
0
0
1
16 bits Auto Reload
0
1
1
16 bits Capture
1
X
1
Générateur de séquence pour liaison série
X
X
0
off
Le registre T2CON regroupe les 8 bits de contrôle de ce TIMER , leur signification est
indiquée par le tableau ci dessous :
T2CON
TF2
Adresse C8H
EXF2
RCLK
Adressable par bits
TCLK
EXEN2
TR2
C/T2
CP/RL2
TF2
EXF2
C’est le bit de débordement il est mis à 1 lorsque le compteur passe de FFFF à 0000
Indicateur externe.Il est mis à 1 par une transition 1↓0 sur la borne T2EX (P1.1) si
EXEN2=1. Si l’interruption du timer 2 est autorisée et que EXF2=1 alors le sous
programme situé en 2BH est exécuté .La remise à zéro de EXF2 doit être assurée par soft.
RCLK
Bit de contrôle de l’horloge de réception. Si RCLK=1 le port série en mode 1 ou 3 utilise
l’impulsion de débordement du timer 2 comme signal d’horloge de réception.. Si RCLK=0
c’est le timer 1 qui joue ce rôle.
TCLK
Bit de contrôle de l’horloge d’emission.. Si TCLK=1 le port série est commandé par le timer
2 , si TCLK=0 c’est le timer 1 qui commande.
EXEN2
Validation du mode externe. Si EXEN2=1 autorisation de capture ou de rechargement lors
d’une transition 1↓0 sur la borne T2EX Ceci n’est possible que si le timer 2 n’est pas utilisé
comme horloge du port série (TCLK=RCLK=0) .En forçant EXEN2 à 0 on neutralise la
borne T2EX.
TR2
Mise en marche du timer 2
C/T2
Mode de fonctionnement
0= Temporisateur c’est l’horloge du microprocesseur
divisée par 12 qui est comptée.
1=Compteur d’évênements extérieurs
CP/RL2 Capture ou rechargement . Si ce bit est à 1 c’est le mode capture .La valeur contenue dans
le compteur 16 bits de timer 2 est chargée dans RCAP2H et RCAP2L au moment de la
transition 1 0 sur T2EX si EXEN2=1 (Avec RCLK et TCLK =0 )
Le mode capture est illustré par la figure ci dessous :Si EXEN2=0 (interrupteur ouvert ) le timer
fonctionne en compteur 16 bits et met TF2 à 1 au débordement.Ce bit peut déclencher une
interruption si elle est autorisée.
Si EXEN2=1 le fonctionnement précédent est conservé mais de plus il y a capture du
contenu du compteur dans RCAP2L et RCAP2H lors d’une transition sur T2EX ,en même
temps EXF2 est positionné à 1 ce qui peut déclencher une interruption. On notera que cette
interruption est la même que celle activée par TF2 ,l’utilisateur devra donc par soft
déterminer quelle est l’origine de l’interruption en explorant TF2 et EXF2, pour permettre
cette exploration ces deux bits ne sont pas remis à 0 lors du saut vers le sous
programme , cette remise à zéro doit être effectuée par soft.
41
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
CT2=0
Osc
TR2
/12
TL2
TF2
TH2
CT2=1
T2
Capture
RCAP2L RCAP2H
Interruption
EXEN2
>=1
T2EX
EXF2
Timer 2
Timer 2 en mode capture
Mode rechargement automatique
Le contenu des deux registres RCAP2L et RCAP2H est chargé dans le compteur
TH2 TL2
lors du débordement du compteur mais en plus si EXEN2=1 lors d’une
transition négative sur T2EX Ce fonctionnement est illustré sur la figure suivante .
Osc
/2
CT2=0
TR2
TL2
TH2
CT2=1
T2
TF2
>=1
Rechargement
>=1
RCAP2L RCAP2H
T2EX
Interruption
Timer 2
EXEN2
EXF2
Timer 2 en rechargement automatique
Mode pilotage de la liaison série
Ce mode est très semblable au précédent ,le signal de débordement est utilisé pour le
rechargement du compteur et comme horloge pour le port série. La figure suivante montre que les
horloges d’emission et réception
Dépassement Timer 1
peuvent être différentes et même
commandées par deux timers
/2
différents. Remarquons également
SMOD=1
SMOD=0
CT2=0 TR2
que l’horloge du CPU est divisée par
1 0
/2
TCLK
Osc
TK clock
TH2
TL2
2 et non par 12 L’indicateur TF2
/16
CT2=1
n’existe plus
la seule source
1 0
T2
d’interruption est T2EX .
RX Clock
/16
Rechargement
RCLK
RCAP2L RCAP2H
La fréquence de l’horloge
fournie par le timer 2 est donnée par
la formule :
T2EX
EXEN2
Interruption
EXF2
Timer 2
Timer 2 en rechargement automatique
avec RCLK+TCLKG=1
42
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
FH =
FOSC
32.[65536 − ( RCAP2 H , RCAP2 L)]
La capacité 16 bits de ce timer autorise pour la liaison série une plus grande souplesse dans le
choix du quartz ,la valeur 11,0592 Mhz préconisée par INTEL pour le 8051 n’est plus nécessaire. La
formule précédente peut se mettre sous la forme:
( RCAP2 H , RCAP2 L) = 65536 −
FOSC
32. FH
Si l’on dispose d’un quartz à 12 Mhz et que l’on désire assurer une transmission à 9600 bauds on
obtient :
(RCAP2H,RCAP2L)=65496,9375
La valeur entiére la plus proche est 65497 soit FFD9H ce qui correpond à une vitesse de
9615 bauds soit une erreur de 1,5% tout à fait acceptable . (La tolérance en général admise est de
±2% ) Le tableau ci dessous donne les valeurs à charger dans RCAP2H et RCAP2L pour différentes
valeurs de la vitesse et du quartz .
Fréquence
transfert
de Fréquence
quartz
19600 (écart 2,34%)
9600
4800
2400
1200
300
110
300
110
12 Mhz
12 Mhz
12 Mhz
12 Mhz
12 Mhz
12 Mhz
12 Mhz
6 Mhz
6 Mhz
du TIMER 2
RCAP2H
FF
FF
FF
FF
FE
FB
F2
FD
F9
RCAP2L
EC
D9
B2
64
C8
1E
AF
8F
57
La communication série 9600 bauds pilotée par le Timer 2 peut être programmée de la façon
suivante :
Initialisation :
MOV SCON,#01011010B Mode 1
MOV RCAPEH,#0FFH
MOV RCAP2L,#0D9H
Vitesse 9600 bauds
MOV T2CON,#00110100
TCLK et RCLK à 1 et TR2=1 pour lancer le timer 2
43
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
D’AUTRES MEMBRES DE LA FAMILLE
Ils sont très nombreux dans le catalogue des divers constructeurs nous citerons seulement
Le 80451 de PHILIPS
Le 80451 fabriqué par PHILIPS est identique
au 8031 mais possède 7 ports d’entrée sortie ( 6 de 8 bits et
un de 4 bits seulement pour la version en boîtier DIL 64
broches).Ces ports ont les adresses suivantes dans le SFR
P4
C0H
P5
C8H
P6
D8H
Le port P6 peut être utilisé de façon normale en
câblant à la masse les quatre bornes AFLAG BFLAG /IDS
/ODS Une utilisation de ces bornes et du port est possible
en configurant le registre de commande (CSR) situé en E8H
.
Ce composant est à retenir lorsqu’un grand
nombre de ports est nécessaire .
Le 80552 de PHILIPS
C’est un gros CPU qui n’est disponible qu’en
boîtier PLCC 68 broches
Il est construit autour d’un coeur de 8031 mais
possède en plus un convertisseur analogique numérique 10
bits ,un convertisseur numérique analogique (DAC) et est
capable de gérer un bus I2C
PLAN MEMOIRE
C’est celui do 8052
octets de RAM interne dont
à la même adresse que le
accessibles seulement par
indirect .
avec 256
128 situés
SFR mais
adressage
Si R0 contient 178
MOV A,178 est la lecture de la
case 178 du SFR alors que
MOV A,@R0 est la lecture de
la case 178 de la RAM
LES PORTS
Ils sont au nombre de 5 ,outre les 4 du 8031 on trouve
P4 adresse C0H du SFR (Comme pour le 80451)
44
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------P5 adresse C4H non programmable en sortie qui regroupe les 8 entrées du
convertisseur analogique numérique .
LE CONVERTISSEUR ANALOGIQUE NUMERIQUE DU 80552
Le 80552 possède 8 entrées analogiques ADC0 à ADC7 (Constituant le Port 5 qui peut être
utilisé aussi comme un port binaire normal ) reliées à un convertisseur 10 bits à approximations
successives. Ce convertisseur possède ses propres entrées d'alimentation (Broche 61 Analogue
Supply 5V - Broche 60 Analogue Ground) et de références ( Broche 59 ref+ et 58 ref - ) Les 1024
niveaux sont répartis entre ref+ et ref- La conversion dure 50 cycles d'horloge c'est à dire 50µS pour
une horloge à 12 Mhz .le mot obtenu est :
R=1024 x (Vin - Vref-)/(Vref+ -Vref-)
Deux registres du SFR servent à piloter ce convertisseur . ADCON (Adresse C5H) et ADCH
(Adresse C6H) à lecture seule.
7 ADC.1
6 ADC.0
5 ADEX
4 ADCI
3 ADCS
2 AADR2
1 AADR1
0 AADR0
La conversion est déclenchée en montant à 1 le bit ADSC du registre ADCON,ce bit est
activé
Par soft seulement ou
Par Hard ou soft.
Le démarrage par soft seulement est choisi en plaçant bit de contrôle ADCON.5=ADEX au
niveau bas .Une conversion est alors lancée lorsque le bit ADCON.3=ADCS est mis à 1 .
Le démarrage Hard ou Soft est sélectionné lorsque ADCON.5=ADEX est au 1 Une conversion
peut alors être lancée en montant ADCON.3 (ADCS) comme ci dessus, ou en appliquant une
transition montante sur la broche extérieure STADC ( Broche 3 )Dans ce dernier cas il faut que la
broche STADC soit restée au niveau bas au moins pendant une période d'horloge et reste ensuite au
niveau haut au moins autant.
La transition montante est reconnue à la fin d'un cycle machine et la conversion commence
au début du cycle suivant . Quand la conversion est lancée par soft elle débute au début du cycle
machine qui suit l'instruction qui à monté ADSC au niveau haut. La conversion débute avec ADCS au
niveau haut ,c'est cette valeur 1 qui est retournée si l'on lit ce bit pendant la conversion. ADSI reste
pendant ce temps à 0.
L'entrée qui est prise en compte est celle dont l'adresse est formée par les 3 bits .(AADR2AADR1-AADR0 ) de ADCON La tension d'entrée doit être stable pendant la conversion, une
vitesse de variation maximale de 10V/mS est tolérée au delà de laquelle le résultat peut être
aléatoire.
Lorsque la conversion est terminée les 8 bits de plus fort poids sont chargés dans le registre
ADCH ou ils peuvent être lus, les 2 bits de plus faible poids (Que l'on peut abandonner si une
conversion sur 8 bits est suffisante ) sont chargés dans ADCON.7 ( ADC.1 ) et ADCON.6 ( ADC.0 ) .
La fin de conversion est caractérisée par la montée à 1 du bit ADCI et le retour à zéro de
ADCS. Le bit ADCI doit être remis à 0 par le programme pour permettre une nouvelle conversion .Ce
bit par contre ne peut pas être monté par soft. Le bit ADCS au contraire est monté par le logiciel pour
démarrer la conversion mais ne peut pas être remis à 0 avant la fin de conversion .
ADCON.4 = ADCI est le flag d’interruption mis à 1 lorsqu’une conversion est terminée si
l’interruption correspondante est validée. Ce flag ne peut pas être mis à 1 par soft mais doit être
remis à 0 pour qu’une nouvelle conversion puisse commencer.
Une routine de conversion peut donc être la suivante:
START:MOV ADCON,#0
;pour une conversion par soft seulement sur l’entrée P5.0
SETB ADCS
;début de conversion
JNB ADCI,$
;boucle sur place tant que ADCI=0 en attendant la fin de conversion
CLR ADCI
;pour permettre une nouvelle conversion
MOV A,ADCH
;récupération des 8 bits de plus fort poids
MOV B,A
;basculés dans B
MOV A,ADCON
ANL A,0C0H
.Masque pour isoler les 2 bits de fort poids
CLR ADCI
;RAZ de ADCI monté à 1 en fin de conversion
RET
;fin de sous programme
45
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
LE CONVERTISSEUR NUMERIQUE ANALOGIQUE DU 80552
Il y a en réalité deux convertisseurs
Ce ne sont pas de vrais DAC mais des convertisseur PWM ,ils délivrent un signal
rectangulaire périodique de fréquence fixe et de rapport cyclique variable. La précision est de 8 bits
seulement .
La fréquence est obtenue à partir de l’horloge du CPU divisée par deux ,le signal obtenu
traverse ensuite un diviseur supplémentaire programmable ,(le prescaler) La fréquence finale F est
donnée par:
F=
FOSC
2.(1 + PWMP) * 255
ou PWMP est le contenu du registre du même nom situé à l’adresse FE du SFR.
Le contenu de PWMP pouvant varier de 0 à 254 on obtient une fréquence comprise entre
92Hz et 23.5kHz pour un quartz à 12Mhz
L’état du compteur est comparé au contenu de
255
deux registres PWM0 et PWM1 qui sont les octets à
PWMx
convertir .Il y a deux sorties (pattes 4 et 5 du boitier) dont le
niveau est bas si le contenu de PWMx est supérieur à la
valeur du compteur, niveau haut dans le cas contraire. On
obtient ainsi un signal rectangulaire dont le rapport cyclique
0
est proportionnel au contenu de PWMx et qui par
Sortie PWMx
5
intégration fournit la tension analogique de sortie .
Ce système très simple présente l’inconvénient 5*(255-PWMx)/255
d’être lent car il faut utiliser un filtre intégrateur de constante
de temps suffisante pour que l’ondulation résiduelle soit inférieure à un niveau élémentaire (LSB).La
figure ci contre et le raisonnement ci dessous montrent que la constante de temps nécessaire est au
moins 64 fois la période du signal carré .
La valeur moyenne de la tension est kE,
R
C
pendant la durée KT le condensateur reçoit
donc un courant :
E
(E-kE)/R
la tension à ses bornes varie donc de
kE
∆=E(1-k)kT/RC
Si l’on veut que cette ondulation résiduelle soit
inférieure à un LSB il faut :
0
kT
T
E(1-k)kT/RC<E/256
d’ou RC>256k(1-k)T
soit :la condition la plus dure pour k=1/2 : RC>64T Ce qui correspond à une fréquence de
coupure du filtre RC de f=1/2πRC=F/402 A la fréquence maximale 23,5kHz la fréquence
limite à la sortie du convertisseur n’est que de 60 Hz à peine.
Si l’on désire une bande passante plus importante, l’emploi d’un DAC extérieur s’impose.
46
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------LE BUS I2C
Le BUS I2C est un système matériel et logiciel de transmission de données entre plusieurs
équipements. Inventé par PHILIPS il fait partie de la de famille des BUS locaux (LAN) .
La transmission se fait sur 2 fils plus masse L’un des fils SDA transporte les données en
série ,les niveaux logiques étant 0 et 5V ,l’autre SCL porte un signal d’horloge qui synchronise les
échanges.
Les qualités du BUS I2C reposent entièrement sur la structure matérielle adoptée. Tous les
équipements sont accrochés en parallèle sur les deux fils du BUS . Chacun d’entre eux est constitué
d’un MOS destiné à forcer le niveau logique à zéro et un ampli permettant au circuit d’observer le
niveau présent sur le fil considéré. Cette possibilité de s’auto espionner permet de gérer les conflits
entre les divers équipements présents. Ainsi , si un seul
+5V
équipement force un fil du BUS au niveau bas , tous les
autres le verront au 0 ,c’est une structure ET CABLE .
Rp 4k7
Une résistance de PULL UP commune à tous les
SDA ou SCL
circuits remonte à 1 le niveau des fils si tous les circuits
sortent un niveau haut . Une valeur typique de cette
Rs 100
résistance est 4700Ω .Une résistance série de 100Ω
facultative peut être placée en série avec chaque entrée;
elle est surtout utile si les fils sont longs (plusieurs mètres)
Circuit
.
Lorsque aucun composant n’est actif les deux fils
CLC et SDA sont au
niveau haut le bus
est libre. ( F )
SDA
L’état du fil de données SDA ne peut être modifié que
lorsque SCL est bas
SCL
Un bit de donnée (état de SDA ) est émis pendant
l’état haut de SCL Chaque envoi de bit est donc associé à
Envoi d'une donnée
une impulsion sur SCL
La règle de non variation de SDA lorsque SCL
SCL=1
est haut est violée dans deux circonstances
importantes :
SDA
- La condition de Start : (S )
SDA passe de 1 à 0 pendant que SCL est au 1
Condition
de START
Condition
de STOP
- La condition de Stop (P )
SDA passe de 0 à 1 pendant que SCL est haute
Pour les circuits les plus courants (Première génération) la fréquence d’horloge maximale (et
conseillée ) est de 100kHz .
Sur le BUS sont présents :
Un circuit maître qui pilote le transfert ,c’est lui qui génère les signaux d’horloge sur SCL il
peut envoyer des données vers les circuits esclave (émetteur ) ou en recevoir (Récepteur )
Des circuits esclave qui peuvent être des récepteurs recevant des octets venant du maître
ou des émetteurs qui envoient des octets vers le maître . Chaque circuit esclave possède une
adresse sur 7 bits . Les adresses ne sont pas distribuées au hasard mais attribuées par l’organisme
responsable du BUS I2C, chaque type de composant possède son adresse propre ,nous reviendrons
sur ce point plus loin.
FORMAT DU TRANSFERT :
Le transfert commence toujours par une condition de Start générée par le maître .
47
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------Sont envoyés ensuite successivement ,et accompagnés à chaque fois d’une impulsion
d’horloge ; 8 bits dont les 7 premiers constituent l’adresse de l’esclave que l’on veut contacter (
MSB en tête) suivis d’un dernier bit qui indique le sens du transfert 1 pour une lecture esclave vers
maître, 0 pour une écriture maître vers esclave.
Le transfert se termine par un ACQUITTEMENT . Cet acquittement est une procédure
essentielle ;le maître relâche le fil SDA (Ce qui revient à y placer un 1 ) et génère un top d’horloge au
cours duquel le circuit esclave doit forcer à 0 le fil SDA pour indiquer qu’il a bien reçu le message.
0
1
0
0
1
2
3
4
1
1
1
W
6
7
8
Bus relaché
SDA
5
9
SDA piloté par l'esclave
ACK
Demande d'écriture vers l'esclave d'adresse 0100111
Un récepteur esclave peut dans certains cas ne pas accepter la donnée ,par exemple s’il est
occupé à une tâche, dans ce cas il ne valide pas acquittement et le maître peut ,soit générer une
condition de stop, soit s’adresser à un autre esclave plus disponible .
L’adresse étant envoyée le transfert se poursuit par la réception (dans ce cas l’esclave pilote
SDA au rythme de SCL envoyée par le maître ) ou l’émission d’un octet suivi d’un acquittement par
le récepteur .
Exemple :
1
2
3
4
1
0
1
1
5
6
7
0
0
8
9
1
2
3
4
5
6
7
8
9
SCL
SDA
0
R
Lecture
S
P
Par l'esclave
A
Dans la suite nous simplifierons ce
dessin en :
1
0
0
0
1
0
Envoyé par l'esclave 8BH
1
S Adrs Escl R/W A Data
1
A P
La gestion du BUS peut être obtenue ; soit en écrivant un logiciel approprié ,mais ce n’est
pas simple si l’on veut tenir compte de tous les cas possibles ,soit en utilisant des unités centrales
qui intègrent une interface I2C câblée c’est le cas du 80652 , compatible broche pour broche avec le
8031, ou le gros 80552 .
GESTION DIRECTE DU BUS I2C
C’est une méthode simple, efficace dans les cas simples ( Un seul maître , peu de circuits sur
le BUS ) et pour des liaisons courtes peu perturbées par les signaux parasites qui introduisent des
erreurs de transmission. Les deux fils SDA et SCL sont prélevés sur un port quelconque, n’importe
quel circuit de la famille 8051 (ou tout autre microprocesseur ) peut être mis en œuvre..
Les routines reproduites ci dessous gèrent de façon élémentaire le bus
START Qui génère une condition de START .
48
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------:
Place SDA à 1 et SCL à 0 puis après 6 NOPs nécessaires pour respecter les temps
caractéristiques du BUS descend SDA alors que SCL est haute ,c’est la condition de START , et
après un nouveau temps d’attente baisse SCL .
STOP Qui génère une condition de STOP :
Place SDA au niveau bas, SCL au niveau haut et après un temps d’attente (6 NOPs ) monte
SDA .
ACK Réalise un acquittement c’est à dire place SDA au niveau bas pendant un top d’horloge
.Cette routine utilise la routine CLOCK Cette routine devra être lancée chaque fois que le maître
devra acquitter le BUS .
NACK non acquittement Le SDA est mis au niveau haut alors qu’un top d’horloge est envoyé,
le fil correspondant est alors positionné en entrée et l’état de SDA est le niveau envoyé par l’esclave.
L’acquittement n’est pas vérifié mais il est facile de le faire en observant le contenu de CY et en
effectuant ensuite l’action convenable ; suite du transfert, émission d’un nouveau START ou d’un
STOP. Pour une liaison courte peu perturbée une non vérification de l’acquittement est acceptable .
CLOCK génère un top d’horloge. SCL est monté et après un temps d’attente l’état de SDA est
transféré dans CY, SCL est ensuite redescendu à 0.Dans le cas d’une opération de lecture CY
contient le bit transmis, dans le cas d’une écriture ce transfert SDA ⇒CY est inutile mais sans
conséquence.
OUTBYT :transmet sur le BUS les 8 bits de l’octet contenu dans le registre BUFF (Dont la
position en mémoire doit être définie au début du programme .) Le registre R0 du microprocesseur
est utilisé comme compteur
INBYT lit sur le BUS un octet envoyé par un circuit esclave et le charge dans le registre
BUFF.
;================================================================
;ROUTINES DE BASE DE L'I2C
;Utilise SDA SCL L'accumulateur, R0,et une case BUFF
;qu'il faut précédemment définir
;****************************************************************
;Emet un pulse d'horloge .Pendant que SCL est haut la valeur de *
;la ligne SDA est placée dans le CARRY .Quand l'instruction en *
;cours est une lecture la valeur du CARRY est donc le bit envoyé*
;par le composant sous test (DUT device under test )
*
;****************************************************************
CLOCK:NOP
SETB SCL ;montée de l'horloge
NOP
NOP
NOP
NOP
NOP
MOV C,SDA
;lecture du bit sur SDA
CLR SCL
;descente d'horloge
RET
;---------------------------------------------------------------;
;****************************************************************
;Emet une condition de START
*
;****************************************************************
START:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
;descente de SDA lorsque SCL est haute = START
49
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
;horloge basse
RET
;----------------------------------------------------------------;
;******************************************************************
;Emet une condition de STOP
*
;******************************************************************
STOP:CLR SDA
SETB SCL ;pour émettre un STOP il faut partir de SCL=1 SDA=0
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA ;montée de SDA alors que SCL est haute = STOP
RET
;------------------------------------------------------------------;
;******************************************************************
;Réalise un acquittement (acknowledge)
*
;******************************************************************
ACK:CLR SDA
LCALL CLOCK
;émet un pulse d'horloge alors que SDA est bas
RET
;-----------------------------------------------------------------;
;*****************************************************************
;Non Acquittement
*
;Le SDA est mis au 1 , donc ligne en entrée et un pulse d'horloge*
;est émis .Ce Sous programme ne teste pas si le DUT a bien forcé *
;le SDA au 0 mais l'état de SDA est dans CY
*
;*****************************************************************
NACK:SETB SDA ;SDA haut donc en réception
LCALL CLOCK
RET
;----------------------------------------------------------------;
;****************************************************************
;Lit 8 bits émis par le composant branché (DUT)
*
;L'octet recueilli est placé dans la case BUFF
*
;****************************************************************
INBYT:SETB SDA ;pour que la ligne SDA soit en entrée
MOV R0,#8 ;Le registre R0 sert de compteur
LOOP1:LCALL CLOCK
MOV A,BUFF
;construction de l'octet dans BUFF
RLC A
;CY contient le bit envoyé par le DUT
;qui a été saisi pendant le pulse de
;CLOCK , il est poussé dans A
MOV BUFF,A ;sauvetage
DJNZ R0,LOOP1
;Boucle jusqu'à ce que 8 bits aient été recueillis.
RET
;---------------------------------------------------------------;
;*****************************************************************
;Ecrit 8 bits vers le DUT
*
;l'octet à envoyer est dans BUFF
*
;*****************************************************************
OUTBYT:MOV R0,#8
; chargement compteur
LOOP0:MOV A,BUFF
;charge dans A l'octet à envoyer
RLC A
;charge dans CY le bit le plus à gauche
;donc MSB en tête.
*
50
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------MOV SDA,C
;bascule le CY dans SDA
MOV BUFF,A
;sauve l'état de l'octet à transmettre
LCALL CLOCK
;envoie un signal d'horloge
DJNZ R0,LOOP0
RET
;==================================================================
Ces 6 routines suffisent pour gérer un BUS I2C dans une configuration simple. Elles peuvent
être très facilement écrites pour tout autre microcontroleur .
Exemple de gestion d’un PORT I2C PCF8574 .
Le PCF8574 est un circuit à 16 broches constituant un port d’entrée sortie 8 bits
pilotable via le BUS I2C. Il possède 3 broches permettant de personnaliser son adresse
Comme pour les ports du 8031 un fil positionné
Vcc
A0
au niveau haut peut être utilisé en entrée (ou sortie )
SDA
A1
Le maître via le BUS I2C peut lire les valeurs
SCL
A2
successives présentes sur le port, mais lors de la réception
INT
PCF8574
P0
du dernier bit du dernier octet il doit procéder à un non
P1
P7
acquittement pour indiquer qu’il prend congé .
P2
P2
GND
P6
P5
P4
Ce circuit grâce à une procédure d’interruption
particulière prévient d’une modification de l’état du port ,en effet , en position lecture , un signal
d’interruption est crée dès qu’il y a modification de l’état d’un fil c’est à dire qu’une transition est
acquitement par l'esclave
Start
SDA
Procédure d'ar
S 0 1 0 0 A2 A1 A0 1 A
Adresse circuit
R/W=1 lecture
(PCF8574)
Donnée
A
Donnée
A
non acquitement
acquittement par le maître
le 80552
détectée sur l’un des accès .
Le programme doit d’abord définir la position des deux fils sur les ports et des registres
utilisés , seront également précisées les adresses du ou des composants accrochés au BUS en
lecture ou écriture .
;Gestion d'un port I2C PCF8574
;ce programme réalise un compteur sur P1 et le port I2C
;--------------------------------------------------------------------SDA EQU P3.2
SCL EQU P3.3
ADRS EQU 127
;Contiendra l’adresse de la source ou destination
DATA1 EQU 126
;Contient l’octet à transmettre
BUFF EQU 125
;Buffer utilisé par les routines I2C
PCF8574R EQU 0100 0001B
;Adresse du PCF8574 en lecture
PCF8574W EQU 0100 0000B
;Adresse du PCF8574 en écriture
Le programme de démonstration proposé effectue un comptage sur le port P1 du 8031,une
routine de retard est nécessaire pour limiter la vitesse d’affichage.
DELAY:MOV R7,#3 ;Retard d’environ une seconde avec un quartz 11,0592Mhz
MOV R6,#0
MOV R5,#0
BOUCLE:DJNZ R5,BOUCLE
DJNZ R6,BOUCLE
DJNZ R7,BOUCLE
RET
;
Il suffit alors de définir le départ du programme et de gérer le BUS pas à pas :
51
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
ORG 0
MOV P1,#0
Pour faire partir le comptage de zéro
DEBUT:INC P1
;Gestion du circuit I2C
MOV ADRS,#PCF8574W
;chargement de l'adresse en écriture
MOV DATA1,P1
;chargement de l'octet à envoyer
LCALL START
;condition de Start
MOV BUFF,ADRS
;chargement du buffer
LCALL OUTBYT
;envoi de l'adresse sur le bus
LCALL NACK
;SDA haut pour l'acquittement du DUT, non vérifié
MOV BUFF,DATA1
;l'octet à sortir est chargé
LCALL OUTBYT
;envoi de l'octet sur le bus
LCALL NACK
;SDA haut pour acquittement du DUT , non vérifié
LCALL STOP
;condition de Stop
LCALL DELAY
;pause une seconde
SJMP DEBUT
;boucle sans fin
END
De la même façon le programme suivant ( Reproduit ici dans sa totalité ) lit en permanence le
port I2C (8 bornes sur le boîtier du PCF8574) et présente son état sur 8 leds reliées au port P1 .
;Gestion d'un port I2C PCF8574
;ce programme lit en permanence le port I2C et l'affiche sur P1
;--------------------------------------------------------------------SDA EQU P3.2
SCL EQU P3.3
ADRS EQU 127
DATA1 EQU 126
BUFF EQU 125
PCF8574R EQU 41H
PCF8574W EQU 40H
;
ORG 0
;
MOV P1,#99H
LCALL DELAY
;affichage de 99 pendant une seconde
MOV DATA1,#0
;initialisation de DATA1
DEBUT:MOV P1,DATA1
;----------------------------------------------------------------------;Gestion du circuit I2C
;
MOV ADRS,#PCF8574R
;chargement de l'adresse en lecture
LCALL START
;condition de Start
MOV BUFF,ADRS
;chargement de l'adresse pour envoi sur BUS
LCALL OUTBYT
;envoi de l'adresse sur le bus
LCALL NACK
;SDA haut pour l'acquittement du DUT, non vérifié
LCALL INBYT
;lecture de l'octet sur le bus
LCALL NACK
;SDA haut pour non acquittement car un seul octet
LCALL STOP
;condition de Stop
MOV DATA1,BUFF
;récupération de l'octet lu
;---------------------------------------------------------------------NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SJMP DEBUT
;
DELAY:MOV R7,#3
MOV R6,#0
MOV R5,#0
BOUCLE:DJNZ R5,BOUCLE
DJNZ R6,BOUCLE
DJNZ R7,BOUCLE
RET
52
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------;
;================================================================
;ROUTINES DE BASE DE L'I2C
;Utilise SDA SCL L'accumulateur, R0,et une case BUFF
;qu'il faut précédemment définir
;****************************************************************
;Emet un pulse d'horloge .Pendant que SCL est haut la valeur de *
;la ligne SDA est placée dans le CARRY .Quand l'instruction en *
;cours est une lecture la valeur du CARRY est donc le bit envoyé*
;par le composant sous test (DUT device under test )
*
;****************************************************************
CLOCK:NOP
SETB SCL ;montée de l'horloge
NOP
NOP
NOP
NOP
NOP
MOV C,SDA;lecture du bit sur SDA
CLR SCL
;descente d'horloge
RET
;---------------------------------------------------------------;
;****************************************************************
;Emet une condition de START
*
;****************************************************************
START:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
;descente de SDA lorsque SCL est haute = START
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
;horloge basse
RET
;----------------------------------------------------------------;
;******************************************************************
;Emet une condition de STOP
*
;******************************************************************
STOP:CLR SDA
SETB SCL ;pour emettre un STOP il faut partir de SCL=1 SDA=0
NOP
NOP
NOP
NOP
NOP
NOP
SETB SDA ;montée de SDA alors que SCL est haute = STOP
RET
;------------------------------------------------------------------;
;******************************************************************
;Réalise
un acquittement (acknowledge)
*
;******************************************************************
ACK:CLR SDA
LCALL CLOCK
;émet un pulse d'horloge alors que SDA est bas
RET
;-----------------------------------------------------------------;
;*****************************************************************
;Non Acquittement
*
;Le SDA est mis au 1 , donc ligne en entrée et un pulse d'horloge*
53
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------;est émis .Ce Sous programme ne teste pas si le DUT a bien forcé *
;le SDA au 0 mais l'état de SDA est dans CY
* *
;*****************************************************************
NACK:SETB SDA
;SDA haut donc en réception
LCALL CLOCK
RET
;----------------------------------------------------------------;
;****************************************************************
;Lit 8 bits émis par le composant branché (DUT)
*
;L'octet recueilli est placé dans la case BUFF
*
;****************************************************************
INBYT:SETB SDA ;pour que la ligne SDA soit en entrée
MOV R0,#8;Le registre R0 sert de compteur
LOOP1:LCALL CLOCK
MOV A,BUFF
;construction de l'octet dans BUFF
RLC A
;CY contient le bit envoyé par le DUT
;qui a été saisi pendant le pulse de
;CLOCK , il est poussé dans A
MOV BUFF,A
;sauvetage
DJNZ R0,LOOP1
;Boucle jusqu'à ce que 8 bits aient été recueillis.
RET
;---------------------------------------------------------------;
;*****************************************************************
;Ecrit 8 bits vers le DUT
*
;l'octet à envoyer est dans BUFF
*
;*****************************************************************
OUTBYT:MOV R0,#8
; chargement compteur
LOOP0:MOV A,BUFF
;charge dans A l'octet à envoyer
RLC A
;charge dans CY le bit le plus à gauche
;donc MSB en tête.
MOV SDA,C;bascule le CY dans SDA
MOV BUFF,A
;sauve l'état de l'octet à transmettre
LCALL CLOCK
;envoie un signal d'horloge
DJNZ R0,LOOP0
RET
;==================================================================
;
END
LES CIRCUITS I2C
Les circuits commandables par BUS I2C sont fabriqués par divers constructeurs qui
ont passé des accords avec PHILIPS . Chacun d’entre eux à une adresse sur 7 bits totalement ou
partiellement imposée. Nous citerons :
PCF8571
PCF8573
PCF8574
PCF8574A
PCF8583
PCF8591
etc.....
RAM statique 128x8
Horloge calendrier
Port d’entrée sortie
Adresse I2C :
Horloge calendrier + RAM 256x8
Convertisseur AD DA 8 bits
A0 à AE
D0 à D6
40 à 4E
70 à 7E
A0 à A2
90 à 9E
Un composant n’ayant qu’une seule adresse ne possède aucun fil d’adresse alors qu’avec
3 fils on peut gérer 8 adresses donc utiliser sur le BUS I2C 8 boîtiers en même temps.
GESTION DU BUS I2C PAR LE 80552 ( OU 80652)
Ces deux unités centrales sont capables de gérer de façon très efficace le BUS I2C par une
procédure d’interruption assez complexe. Tous les cas possibles ont été prévus et la fiabilité de la
liaison est presque totale.
Pour ces deux boîtiers les fils SCL et SDA sont portés par deux accès du port P1
SCL= P1.6 et SDA=P1.7
La gestion est assurée grâce à 4 registres du SFR S1CON (D8H) S1STA(D9H)
S1DAT(DAH) S1ADR(DBH)
54
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------S1DAT contient les données qui doivent être transmises ou celles qui arrivent lors d’une
procédure de lecture .
S1ADR contient l’adresse du maître émetteur ,elle n’est utilisée que si ce circuit devient
esclave, le rôle du maître étant assuré par un autre circuit . Nous n’aborderons pas dans un premier
temps cette configuration multi maître .
S1CON est le registre de contrôle
N°bit
S1CON(
D8)
7
CR2
6
ENS1
5
STA
4
STO
3
SI
2
AA
1
CR1
0
CR0
CR2 CR1 CR0 ont pour rôle de définir la fréquence d’horloge. Le tableau ci dessous donne les
valeurs de cette fréquence en fonction de ces bits et du quartz utilisé
CR2
CR1
CR0
Fréquence du Quartz du CPU
fosc/par
6Mhz
12Mhz
16Mhz
0
0
0
23kHz
47
63
256
0
0
1
27
54
71
224
0
1
0
31
63
88
192
0
1
1
37
75
100
160
1
0
0
6,25
12,5
17
960
1
0
1
50
100
133
120
1
1
0
100
200
267
60
Une fréquence particulière peut être obtenue avec CR2-CR1-CR0=111 et en programmant le timer 1 .
ENS1 est le bit de validation ,au 0 l’interface I2C n’est pas en fonction et les fils P1.6 et P1.7
peuvent être utilisés normalement . Attention pour ces CPU les broches P1.6 et P1.7 n’ont pas de
résistance de pull up interne .
Au niveau haut l’interface I2C est active ,attention il faut au préalable avoir programmé
des 1 sur ces fils pour les libérer.
STA La mise à 1 de ce bit positionne le CPU en maître émetteur et génère une condition de
START
STO La mise à 1 de ce bit génère une condition de STOP Ce bit revient à 0 lorsque la
condition réalisée.
SI est le bit d’interruption. Si on veut utiliser l’interruption (ce qui est quasiment obligatoire ) il
faut d’abord autoriser les interruptions par EA=1 et valider l’interruption I2C par ES1=1 Alors dès
qu’un envoi est effectué une interruption est demandée. SI est mis à 1 par le soft et lorsque
l’interruption est lancée doit être remis à 0 par logiciel.
AA est le bit commandant acquittement ,il doit être mis à 1 pour qu’un acquittement soit
retourné durant le 9eme coup d’horloge .
S1STA registre d’état qui contrôle le bon ,ou mauvais , déroulement du transfert.
seul les 5 bits de poids fort sont positionnés les 3 derniers restent à 0 .Cette configuration n’est pas
innocente car elle définit une série d’adresses qui sont écartées de 8 octets ,cette place est suffisante
pour y loger le début d’un sous programme.
Après chaque action ou transfert S1STA est chargé et une interruption activée. (SI=1)
Au début du transfert lorsque la condition de START est générée S1STA est chargé par
08H ,lorsque acquittement est reçu la valeur devient 18H ,puis 28H a la fin du transfert d’un octet.
Mais si acquittement n’a pas été effectué c’est 20H qui est chargé au lieu de 18H. Ainsi après chaque
action le contenu de S1STA permet de savoir ce qui s’est passé et donc d’agir en conséquence. On
pourrait imaginer de lire S1STAT par programme et de lancer ensuite l’action convenable (Gestion
par scrutation ) mais l’expérience montre que la fiabilité de cette méthode est très mauvaise. Il faut
impérativement travailler par interruptions . Les contenus de S1STA vont former les adresses de sous
programmes
d’interruptions qui sont
exécutés
S Adrs Escl R/W A Data
A P
automatiquement .
Il
existe
26
28H
08H
18H
S1STA
valeurs possibles pour
le contenu de S1STA
Déroulement normal d'un transfert
55
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------qui correspondent à 26 sous programmes spécifiques.
La documentation du constructeur donne dans chaque cas les opérations à définir dans
chaque sous programme pour assurer la fiabilité du transfert.
Les lignes qui suivent sont tirées de la documentation du 80552 de PHILIPS ,elles ne
concernent que le cas ou le 8031 joue le rôle de maître. Pour d’autres configurations , se reporter à la
documentation constructeur.
Transmission en mode maître
Dans le mode maitre emetteur un certain nombre de bits sont transmis vers l’esclave
récepteur. Préalablement S1CON doit être initialisé de la façon suivante:
7
S1CON (D8H) CR2
BV
6
5
4
3
2
1
0
ENS1 STA
STO
SI
AA
CR1
CR0
1
0
0
X
Bits de vitesse (BV)
0
CR0,CR1,CR2 définissent la vitesse de transfert comme il a été précisé plus haut.
ENS1 doit être mis à 1 pour autoriser le transfert sur bus I2C
Si le bit AA est au 0
SI01 ne reconnaitra pas sa
ou plusieurs DATA et leur A associé
propre adresse ou l’adresse
d’appel général , dans le cas Transmission avec succès
S
SLA
W A
DATA
A
P
ou un autre
dispositif vers l'esclave récepteur
deviendrait
maitre sur le
8H
18H
28H
Contenu S1STA
bus, c’est à dire SIO1 ne
peut pas passer en mode
esclave .
Nouveau transfert avec
SLA
S
répétition du START
STA,ST0,et
SI
doivent être mis à 0 (reset )
W
10H
Non acquitement
recu aprés l'envoi
de l'adresse esclave
Le
mode
maitre
/A
P
transmetteur doit alors être
Non acquitement
lancé en activant STA
/A
P
après envoi
Maitre vers esclave
grace à une instruction SETB
20H
d'une donnée
. La logique associée à SIO1
Esclave vers maitre
30H
teste le bus I2C et génére
une condition de Start dès
que le BUS devient libre. Quand la condition de Start est transmise le bit d’interruption série est mis à
1 et le code d’état 08H chargé dans S1STA . Ce code doit être utilisé comme vecteur vers une
routine d’interruption qui charge S1DAT avec l’adresse de l’esclave et le bit de direction. (SLA+W)
Le bit SI dans S1CON doit alors être baissé avant que le transfert ne puisse continuer .
Quand l’adresse et la direction ont été transmis et un bit d’acquitement reconnu, le flag SI est
activé de nouveau et un code chargé dans S1STA. Ce code peut être 18H 20H ou 38H pour le mode
maître,68H,78H,ou B0H,si le mode esclave était autorisé (AA=1) L’action appropriée à effectuer dans
chaque cas est précisée sur le tableau suivant. ENS1,CR1,CR0 ne sont pas affectès par le transfert
.Après une répétition de la condition Start (état 10H) SIO1 peut commuter en mode maitre récepteur
en chargeant S1DAT avec SLA+R.
Code
dans
S1STA
Etat du BUS et
action
Soft à exécuter par l’interruption
De ou vers
S1DAT
Action suivante effectuée
par le gestionnaire du
BUS
Vers S1CON
STA STO SI
AA
08H
Une condition de START Charger SLA+W
a été transmise
X
0
0
X
SLA+W sera transmis
le bit d’acquitement sera reçu
10H
Une
répétition
de Charger SLA+W X
condition de START a été ou
transmise
SLA+R
0
0
X
Comme au dessus
SLA+W sera transmis
SIO1 sera commuté
en mode
56
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------maitre récepteur
18H
20H
28H
SLA+W a été transmis
Le bit d’acquitement
été reçu
Charger octet à
a transmettre ou
Pas
d’action
surr S1DAT ou
pas d’action sur
S1DAT
pas d’action sur
S1DAT
0
0
0
X
Octet transmis
ACK reçu
1
0
0
X
Re START transmis
0
1
0
X
1
1
0
X
STOP transmis
STO reset
STOP suivi se START transmis
STO reset
Charger octet de 0
données ou
Pas d’action sur 1
S1DAT
Pas d’action
0
0
0
X
0
0
X
1
0
X
Pas d’action
1
1
0
X
L’octet dans S1DAT a été Charger Donnée 0
transmis
ou
ACK reçu
pas d’action
1
pas d’action
0
0
0
X
Donnée sera transmise
ACK reçu
0
1
0
0
X
X
1
1
0
X
Re START transmis
STOP transmis
STO reset
STOP suivi de START transmis
STO reset
0
0
0
X
pas d’action
1
0
0
X
pas d’action
pas d’action
0
1
1
1
0
0
X
X
STOP transmis STO reset
STOP suivi de START transmis
STO reset
Pas d’action
0
0
0
X
Le BUS I2C est relâché
Pas d’action
1
0
0
X
Une condition de START sera
transmise lorsque le BUS sera
libre
SLA+W a été transmis
ACK non reçu
pas d’action
30H
38H
Donnée dans
transmise
ACK non reçu
S1STA Charger donnée
Arbitrage perdu dans
SLA+R/W ou
données
Octet transmis
ACK reçu
ReStART transmis
STOP transmis
STO reset
STOP suivi de START
STO reset
L’octet sera transmis
et ACK reçu
Re START transmis
Réception en mode maître
En mode maître récepteur un certain nombre d’octets sont reçus d’un circuit esclave
émetteur. Le transfert est initialisé comme dans le mode maître émetteur. Quand la condition START
a été transmise la routine d’interruption doit charger S1DAT avec l’adresse esclave sur 7 bits et le
bit de direction (SLA +R).Le bit SI dans S1CON doit alors être mis à zéro avant que le transfert
série puisse continuer.
Quand l’adresse esclave et le bit de direction ont été transmis et un bit d’acquittement reçu le
bit d’interruption SI est activé de nouveau et un certain nombre de codes peuvent se trouver dans
S1STA. ce sont 40H 48H 38H pour le mode maître et aussi 68H, 78H, ou B0H si le mode esclave a
été validé (par AA=1 ).L’action appropriée à chaque code est décrite dans le tableau suivant .Après la
répétition d’un START (Etat 10H) SIO1 peut être basculé en mode maitre transmetteur en
chargeant S1DAT avec SLA+W.*
Code
dans
S1STA
Etat du BUS et
action
Soft à exécuter par l’interruption
De ou vers
S1DAT
Action suivante effectuée
par le gestionnaire du
BUS
Vers S1CON
STA STO SI
AA
08H
Une condition de START Charger SLA+R
a été transmise
X
0
0
X
SLA+W sera transmis
le bit d’acquitement sera reçu
10H
Une
répétition
de Charger SLA+R X
condition de START a été ouSLA+W
0
0
X
Comme au dessus
SLA+W sera transmis
57
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------transmise
38H
40H
48H
50H
58
SIO1 sera commuté
maitre transmetteurr
en mode
Arbitrage perdu dans
SLA+R ou
non ACK bit
Pas d’action
0
0
0
X
Le BUS I2C est relâché
Pas d’action
1
0
0
X
SLA +R a été transmis
et ACK reçu
Pas action
0
0
0
0
Pas d’action
0
0
0
1
Une condition de START sera
transmise lorsque le BUS sera
libre
L’octet sera reçu
NOT ACK retourné (dernier octet)
Octet sera reçu
ACK envoyé
Pas d’action
1
0
0
X
ReSTART sera transmis
Pas d’action
0
1
0
X
Pas d’action
1
1
0
X
STOP sera transmis
et STO reset
STOP suivi d’un STRART
transmis STO reset
Un octet a été reçu ACK a Lire octet ou
été retourné
Lire octet
0
0
0
0
0
0
0
1
Octet a été reçu
pas d’ACK renvoyé
Lire octet
1
0
0
X
ReSTART sera ctransmis
Lire octet
0
1
0
X
Lire octet
1
1
0
X
STOP sera transmis
STO reset
STOP suivi de START
transmis
STO reset
SLA + R a été transmis
ACK non reçu
sera
Octet ders reçu
Pas d’ACK renvoyé (dernier octet)
Octet sera reçu
ACK renvoyé
sera
1 ou olusieurs data et leur A associé
Rèception avec succès
de l'esclave émetteur
Contenu S1STA
S
SLA
8H
R
A
DATA
A
50H
40H
DATA
/A
P
58H
Nouveau transfert avec
répétition du START
SLA
S
R
10H
Non acquitement
recu aprés l'envoi
de l'adresse esclave
/A
W
P
A
48H
autres transmissions
38H
Perte d'arbitrage
A ou /A
autres transmissions
Maitre vers esclave
38H
Esclave vers maitre
STRUCTURE du LOGICIEL
Un logiciel de gestion du BUS I2C doit comprendre
Des déclarations pour préciser les adresses utilisées et les noms attribués utilisés par
l’assembleur.
Une routine d’initialisation des ports et interruptions.
Les routines d’interruption et d’aiguillage des 26 cas cités plus haut
58
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------Les valeurs chargées dans S1STA sont toutes des multiples de 8 c’est à dire se
terminent par3 zéros. Elles peuvent constituer les l’octet bas des adresses de départ ,espacées de 8
en 8 , des sous programmes de traitement adaptés à chaque cas. L’octet haut de ces adresses est
préalablement défini ,sous le nom HADD par exemple :
Adresse HADD_08 =début du sous programme de traitement en début de transfert.
( Envoyer adresse esclave suivie de R/W )
Adresse HADD18 =début du sous programme d’envoi ou réception de donnée
etc...
La routine d’interruption débute alors à l’adresse 2BH par 4 octets jouant un rôle
essentiel ( Ref : Doc PHILIPS PCB83C552/562 ou livre de D PARET le BUS I2C chez DUNOD ) :
1
2
PUSH PSW
PUSH S1STAT
; sauvetage du registre d’état (éventuellement )
; l’octet bas de l’adresse du SP de traitement est
chargé dans la pile
3
PUSH HADD ;
ainsi que l’octet haut de cette même adresse
4
RET
; Le CPU croit qu’il vient d’exécuter un sous
programme appellé par un CALL et bascule dans le compteur programme les deux
derniers octets montés dans la pile. Le compteur programme se trouve donc chargé par
HADD-S1STAT et le logiciel se poursuit à partir de cette adresse .
Le logiciel spécifique de traitement écrit à partir de HADD S1STAT constitue la suite du
sous programme d’interruption , il contient au minimum:
⇒ Le chargement dans S1DAT de l’octet ou de l’adresse à transmette si nécessaire
⇒ La remise à zéro du bit d’interruption SI . Cette RAZ est fondamentale car ce bit est
réactivé par le logiciel ce qui permet l’enchainement des sous programmes d’interruption
⇒ Des actions spécifiques comme par exemple le pointage du prochain octet à
transmettre
⇒ Il se termine enfin par POP PSW (si le PUSH a été utilisé ) et RETI..
Par exemple à l’adresse HADD08 on trouvera :
Chargement dans S1STAT de l’octet représentant l’adresse esclave + R/W
Chargement dans S1CON de l’octet provoquant la RAZ de SI ,le relâchement du
BUS et examen de l’acquittement .
Pop psw
;pour récupérer l’état sauvé lors de l’appel d’interruption
RETI
Retour d’interruption
Attention : si les tâches à accomplir nécessitent plus de 8 octets il faudra faire un saut
LJMP et terminer ailleurs le sous programme
Le logiciel de gestion du BUS aura donc la structure élémentaire suivante:
Une partie initialisation et définition citée plus haut
Les routines d’interruption
puis:
SETB STA
pour créer une condition de start
Le mécanisme de transfert est lancé S1STA se charge avec la valeur de départ 08 et
le CPU passe en interruption (adresse 2BH)
A cette adresse 2B on trouve les 3 ou 4 instructions assurant le saut à l’adresse
convenable (HADD-S1STA) .A cette adresse la suite du sous programme d’interruption
charge éventuellement S1DAT puis envoie dans S1CON la RAZ de SI ( qui sera
ensuite réactivée par le soft ) et l’état convenable des autres bits .
Suivent les opérations necessaires par exemple pour pointer la donnée suivante , et
enfin l’instruction de retour RETI .
L’exécution de ces taches se traduit par une nouvelle valeur chargée dans S1STA .
Gràce à la remise à zéro de SI qui à été effectuée et du réarmement automatique de ce
bit le CPU rebascule immédiatement dans le sous programme d’interruption suivant..
59
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
EXEMPLE UTILISATION D’UN PORT I2C PCF8574
Le PCF8574 est un circuit à 16 broches constituant un port d’entrée sortie 8 bits
pilotable via le BUS I2C. Il posséde 3 broches permettant de personnaliser son adresse
Comme pour les ports du 8031 un fil positionné
Vcc
A0
au niveau haut peut être utilisé en entrée (ou sortie )
SDA
A1
Le maître via le BUS I2C peut lire les valeurs
SCL
A2
successives présentes sur le port, mais lors de la réception
INT
PCF8574
P0
du dernier bit du dernier octet il doit procéder à un non
P1
P7
acquittement pour indiquer qu’il prend congé .
P2
P2
GND
P6
P5
P4
Ce circuit grâce à une procédure d’interruption
particulière prévient d’une modification de l’état du port.,en effet , en position lecture , un signal
d’interruption est crée dès qu’il y a modification de l’état d’un fil c’est à dire qu’une transition est
acquitement par l'esclave
(PCF8574)
Start
SDA
Procédure d'arr
S 0 1 0 0 A2 A1 A0 1 A
Adresse circuit
R/W=1 lecture
Donnée
A
Donnée
A
non acquitement
acquittement par le maître
le 80552
détectée sur l’un des accès .
Le logiciel ci dessous utilise le PCF8574 en entrée et transfert l’octet qui lui est présenté
sur le port P1 .Le 8574 est câblé avec A2-A1-A0=111 son adresse est donc 0100111 soit si on lui
associe le bit de direction 01001111 en lecture et 01001110 en écriture .
Nous définirons les deux octets PCF8574R= 01001111 et PCF8574W= 01001110
STRUCTURE DU LOGICIEL
Ce programme lit
permanence sur le Port P1
un octet présenté sur le port supplémentaire I2C
et le recopie en
; définition des adresses système
--------------------------------------------S1CON
EQU 0D8H
S1STA
EQU 0D9H
S1DAT
EQU 0DAH
S1ADR
EQU 0DBH
IEN0
EQU 0A8H
;registre d’interruption
IP0
EQU 0B8H
;prioritès d’interruption
---------------------------------------------;position des bits ,adresses bits
---------------------------------------------STA
EQU 0DDH
SIO1HP
0BDH
; bit de priorité de SIO1 dans IP0
-----------------------------------------------------------------------------------------------------------------------; Données à écrire dans S1CON pour fréquence 100 kHz avec quartz 12mhz (ou 11,0592 M)
------------------------------------------------------------------------------------------------------------------------NOTSTA_STO_NOTSI_AA
EQU 0D5H
; génère un STOP
NOTSTA_NOTSTO_NOTSI_AA
EQU 0C5H
;relâche BUS et envoie acquitement
NOTSTA_NOTSTO_NOTSI_NOTAA EQU 0C1H
; relâche BUS
; relâche le BUS et reprend avec STA
STA_NOTSTO_NOTSI_AA
EQU 0E5H
;noter la RAZ de SI et AA=1 pour gérer l’
------------------------------------------
60
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
-----------------------------------------------------------------------------------------------------------------------------------
-
;Données générales
------------------------------------------MONADRS
EQU 31H
ENSIO1
EQU 0A0
; EA et ES1 au 1 doit être écrit dans IEN0
PCF8574W
EQU 4EH
; adresse du boitier 8574 en écriture
PCF8574R
EQU 4FH
;adresse du boitier 8574 en lecture
-----------------------------------------------------------------------------------------;Adresses en RAM
------------------------------------------------------------------------------------------SLA
EQU 71H
HADD
EQU 70H
;octet haut de l’adresse des sous programmes de SISTA
;octet lu sur le port I2C
LU
EQU 72H
ENVOI
EQU 73H
;octet à envoyer (inutile dans ce cas
====================================================
ORG 0
;début programme
LJMP DEBUT
;------------------------------------------------------------------------------------------------------------------ORG 200H
;le programme est écrit dans l’EPROM à partir de 200H
DEBUT:
mov S1ADR,#MONADRS
;chargement de l’adresse personnelle du
8031 pour utilisation éventuelle en mode esclave, (facultatif)
SETB P1.6
SETB P1.7
;préparation des fils SDA et SCL
Mov HADD,#01
: octet haut de l’adresse des routines de gestion
orl IEN0,#ENSIO1
;autorisation d’interruption
setb SIO1HP
;interruption SIO1 basse priorité ( Nécessaire pour
;que l’enchainement de interruptions puisse s’effectuer )
;initialisation CPU en
mov S1CON,# NOTSTA_NOTSTO_NOTSTI_AA
maître
REPET:
acall LITI2C
mov P1,LU
sjmp REPET
-----------------------------------------------------------------------------; Sous programme de lecture du port I2C
;-----------------------------------------------------------------------------LITI2C:
mov SLA,#PCF8574R
;chargement de l’adresse du port I2C en
:lecture
:
setb STA
;lancement du transfert
Déclenchement du processus d’interruption
Le CPU va exécuter les routines définies par les états de S1STA
et seulement à la fin exécuter l’instruction suivante qui affiche la
donnée lue .
Si tout se passe bien le déroulement est le suivant :
S1STA=08 : Envoi de l’adresse de l’esclave et du bit 1 indiquant que l’on
désire mettre le maître en lecture. La routine 08 force SI à zéro ,SI est
réactivé par le système et S1STA chargé avec 40H .RETI est exécuté et le
système bascule sur l’interruption 40
S1STA=40H la donnée transmise par l’esclave est lue dans S1DAT et
comme il s’agit d’une donnée unique le maître n’acquite pas . Comme
plus haut SI est baissé par le soft et réactivé par le système alors que S1DAT
est chargé avec 58H .RETI est exécuté et le système entre dans l’interruption
58
S1DAT=58H SI est désactivé par soft et un stop est généré ,cette fois SI
n’est pas réactivé et S1DAT non chargé Le microprocesseur sort du régime
d’interruption et exécute l’instruction suivante.
(mov P1,LU
;affichage de l’octet lu
sjmp LITI2C)
===================================================================
ROUTINES D’ INTERRUPTION
------------------------------------------
61
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------Dans le cas présent le maître est toujours récepteur, les seules routines d’interruption
nécessaires sont celles qui correspondent aux valeurs suivantes de S1STA : 08-40-50-58-10-38-48
D’autre part il n’y a qu’un seul octet à lire ,le maître ne doit donc pas renvoyer d’acquitement
après réception de l’octet.
ORG 2BH
; l’interruption SIO1 est placée en 2BH
push S1STA
push HADD
ret
.saut à l’adresse HADD-S1STA
Attention ret et non reti
#################################################################
; ETAT 0 Erreur sur le BUS Relachement BUS (NOTSTA) et STOP
--------------------------------------------------------------------------------------------------------ORG 100H
mov S1CON,# NOTSTA_STO_NOTSI_AA
;RAZ SI
reti
###################################################################
;ETAT 08
La condition de départ a été transférée
Concernent le CPU en mode maître émetteur ou récepteur
Le bit R/W décide si l’étape suivante est une réception ou une émission
ACTION: SLA+R ou W sont transférés et ACK est reçu
---------------------------------------------------------------------------------------------------------------ORG 108H
mov S1DAT,SLA
;chargement de SLA +R/W dans registre de données
mov S1CON,# NOTSTA_NOTSTO_NOTSI_AA
;RAZ SI
si on doit introduire plus d’instructions il faut sauter et finir ailleurs dans la mémoire car on ne dispose ici
que de 8 octets au plus Ce n’est pas nécessaire ici .
reti
#####################################################################
ETAT 18
L’étape précédente était 8 ou 10
SLA+W a été transmis et ACK reçu
ACTION: transmettre donnée et ACK reçu
-----------------------------------------------------------------------------------------------------------------ORG 118H
mov S1DAT,#ENVOI
; octet à transférer chargé
mov S1CON,# NOTSTA_NOTSTO_NOTSI_AA
reti
#####################################################################
ETAT 40
état précédent 08 ou 10 SLA+R transmis et ACK reçu
ACTION recevoir la donnée envoyée par l’esclave et ne pas acquiter car
c’est la seule et derniére
------------------------------------------------------------------------------------------------------ORG 140H
mov S1CON,# NOTSTA_NOTSTO_NOTSI_NOTAA
reti
##########################################################################
ETAT 48
SLA+R a été transmis et ACK non reçu
ACTION Envoi d’un STOP
Le CPU revient au programme principal qui est dans le cas présent une
boucle sans fin de lecture ,l’échec du transfert passe inaperçu.
-------------------------------------------------------------------------------------------------------------------------ORG 148H
mov S1CON,# NOTSTA_STO_NOTSI_AA
reti
##########################################################################
ETAT 50
Donnée reçue et ACK retourné
ACTION Lire la donnée dans S1DAT
Si une seule donnée il ne faut pas envoyer d’acquitement
sinon envoyer ACK
dans le cas général il faudrait donc ici gérer le compteur de données
62
----------------------------------------------------------------------------------------------------------------------------------
Le microcontroleur 8051
----------------------------------------------------------------------------------------------------------------------------------Dans le cas présent il n’y a qu’une valeur pas de ACK
--------------------------------------------------------------------------------------------------------------------------ORG 150H
mov LU,S1DAT
mov S1CON,# NOTSTA_NOTSIO_NOTSI_NOTAA
reti
##########################################################################
ETAT 58
Donnée reçue pas d’ACK retourné C’est le cas ici ou il n’y a qu’un seul octet à
lire
Lecture data dans S1DAT et STOP
------------------------------------------------------------------------------------------------------------------------ORG 158H
mov LU,S1DAT
mov S1CON,# NOTSTA_STO_NOTSTI_AA
reti
###########################################################################
End.
-
63
----------------------------------------------------------------------------------------------------------------------------------