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 ----------------------------------------------------------------------------------------------------------------------------------