Académique Documents
Professionnel Documents
Culture Documents
BUS I2C
A)
Le bus I2C fonctionne avec 2 fils de liaison reliés à tous les circuits utilisant ce même bus I2C
et un fil de masse (permettant la différence de potentiel des signaux). Ces 2 fils de liaison
sont : - SDA (Serial Data) par lequel on transmettra toutes les données.
- SCL (Serial CLock) l’horloge. Tous les changements de bits sont prit en compte lors
d’un état haut de l’horloge.
B)
Lorsqu’un microcontrôleur ne dispose pas de périphérique adapter au bus I2C, il faut établir
une routine de gestion. Cette routine de gestion sera découpée en plusieurs parties.
Les temps choisis sont loin d’être vrais, car ils dépendent en partit de la cadence de
communication voulut entre le master et le slave.
Afin d’afficher l’heure sur un afficheur à cristaux liquides, il faut initialiser le PCF8583
suivant la fonction voulut, lire les données puis convertir de BCD en ASCII et enfin les
afficher.
/**************************************************************************/
ALGORITHME
/**************************************************************************/
DEBUT
VARIABLES :
MSB1, LSB1
MSB2, LSB2
MSB3, LSB3
N
INITIALISATION :
LECTURE :
CONVERSION :
Pour N de 1 à 3
Faire : (
Décalage vers la droite de MSBN
MSBN = MSBN + 0x30 //conversion ASCII
LSBN = MSBN + 0x30) //conversion ASCII
AFFICHAGE :
FIN
A noter que lors d’une écriture si, le slave répond par un NACK il faut répéter l’instruction
précédente.
/**************************************************************************/
PROGRAMME EN C
/**************************************************************************/
/*******************************INITIALISATION****************************/
main( )
{
start( ) ;
send(0xA0) ;
send(0x00); /*registre de contrôle*/
send(0x00); /*initialise le registre, fréquence de travail à 32KHz*/
send(0x04); /*registre des heures*/
send(0x00); /*initialise l’heure: en 24H, AM, 00h00*/
stop( ) ; /*libération de la liaison I2C*/
/*********************************VARIABLE*******************************/
while(1)
{
/****************************LECTURE DONNEE****************************/
/*****mise en place des poids forts (DIZAINES) et faibles (UNITES) des temps acquis****/
/*****************************SOUS PROGRAMMES************************/
/**********************************DELAY*********************************/
void delay (void)
{
/*initialise pour une cadence d’environ 30µs (32khz) et plus*/
}
/***********************************START*********************************/
void start (void)
{
SCL = 1;
SDA = 1;
delay( );
SDA = 0;
delay( );
SCL = 0;
delay( );
}
/******************************ENVOI DONNEE*****************************/
unsigned char envoi (unsigned char donnee)
{
unsigned char mask = 0x80;
int n,a = 1;
while(a == 1)
{
pdX = 0xFF;
For (n=0 ; n<=7; n++)
{
if ((donnee&mask) == 0) SDA = 0;
else SDA = 1;
delay( );
SCL = 1;
delay( );
delay( );
SCL = 0;
delay( );
mask >>= 1;
}
pdX = 0xFE;
delay( ) ;
SCL = 1;
Delay( );
If (SDA = =0) a = 0;
Else a = 1;
Delay( );
SCL = 0;
Delay( );
}
pdX = 0xFF;
delay( );
}
/****************************RECEPTION DONNEE**************************/
unsigned char recep (void)
{
unsigned char donnee;
int n ;
pdX = 0xFE;
donnee = 0x00;
For (n=0 ; n<8 ; n++)
{
donnee <<= 0x01;
SCL = 1;
delay( );
if (SDA == 1) donnee = donnee + 0x01;
delay( );
SCL = 0;
delay( );
}
pdX = 0xFF;
SDA=0
delay( );
Return (donnee);
}
/************************************ACK**********************************/
void ack (void)
{
SCL = 0;
SDA = 0;
delay( );
SCL = 1;
SDA = 0;
delay( );
delay();
SCL = 0;
delay();
}
/***********************************NACK*********************************/
void nack (void)
{
SCL = 0;
SDA = 1;
delay( );
SCL = 1;
SDA = 1;
delay( );
delay( );
SCL = 1;
delay( );
}
/***********************************STOP**********************************/
void stop (void)
{
SCL = 1;
SDA = 0;
delay( );
SDA = 1;
delay( );
SCL = 0;
}
}