\section{Module I2C}

Auteur : Pierre Launay

per.launay chez free.fr

Le bus I2C est un bus série synchrone développé par Philips.

Description du bus I2C : \\
\url{http://fr.wikipedia.org/wiki/I2C}

Comprendre le bus I2C en espagnol : \\ \url{http://robots-argentina.com.ar/Comunicacion_busI2c.htm}

Voici les fonctions pour travailler avec le Module I2c en mode Maître Interne dans les PIC.
Avant d'utiliser ce module, on doit définir la fréquence utilisée avec la commande :

\verb! #define FOSC_HZ 4000000 !
\verb! #include <i2c.h> !

Voici quelques définitions prédéfinies:
\begin{verbatim}
#define I2C_400K i2c_find_frec(400000) //frecuencia de 400Khz
#define I2C_100K i2c_find_frec(100000) //frecuencia de 100Khz
#define I2C_40K i2c_find_frec(40000) //frecuencia de 40Khz
#define I2C_10K i2c_find_frec(10000) //frecuencia de 10Khz
#define I2C_4K i2c_find_frec(4000) //frecuencia de 4Khz
#define I2C_1K i2c_find_frec(1000) //frecuencia de 1Khz
\end{verbatim} 

Ces définitions peuvent être utilisées dans la fonction i2c\_init

\subsection{i2c\_init}
Configure le port série synchrone.

\textit{void i2c\_init(unsigned char SPEED\_I2C);}

SPEED\_I2C est le registre SSPADD, reloj\_I2C=FOSC\_HZ/(4*(SSPADD+1))
\subsection{i2c\_wait\_for\_idle}
Attend que le bus soit libre.

\textbf{void i2c\_wait\_for\_idle(void);}
\subsection{ i2c\_start} 
Début de trame, séquence de départ.

\textbf{void i2c\_start(void);}
\subsection{i2c\_restart}
Recommencer une trame, fin de trame et début de trame permet de mettre 2 trames pour lire. Voir la fonction i2c\_read()
 
Exemple pour lire les secondes dans une trame :

Début de trame  (start), 
écrire l'adresse du circuit I2c, 
écrire l'adresse du registre des secondes.
Relancer une trame (restart), 
écrire l'adresse ducircuit I2C, 
lire le registre des secondes, 
fin de trame(stop).

\textbf{void i2c\_restart(void);}
\subsection{i2c\_stop}
Fin de trame, séquence d'arrêt.

\textbf{void i2c\_stop(void);}
\subsection{i2c\_delay}
Temps d'attente entre fin de trame et début de trame $>=4,7\mu s$ (fréquence d'horloge de 100KHz).

\textbf{void i2c\_delay(void);}
\subsection{i2c\_ack\_read}
Réception de l'acquittement

unsigned char i2c\_ack\_read (v oid);

"0" bonne réception.\\
"1" mauvaise réception.

\subsection{i2c\_ack\_write}
�?mission de l'acquittement.

void i2c\_ack\_write(unsigned char ack);

"0" la trame peut continuer.\\
"1" la trame s'arrête.

\subsection{i2c\_write}
Le maître écrit dans l'esclave le caractère c, le caractère c peut être une adresse, 
un registre interne, une donnée.

\textbf{void i2c\_write(unsigned char c);}
\subsection{i2c\_write\_with\_ack}
Le maître écrit dans l'esclave le caractère c, et reçoit l'acquittement (ack).

Cette routine rassemble i2c\_write(c) et reception\_ack()

unsigned char i2c\_write\_with\_ack(unsigned char c) ;

\subsection{i2c\_read}
Le maître lit le caractère envoyé par l'esclave.

unsigned char i2c\_read(void);

\subsection{i2c\_read\_with\_ack}
Le maître lit le caractère envoyé par l'esclave et envoie l'acquittement (ack).

unsigned char i2c\_read\_with\_ack(unsigned char ack);

\subsection{Exemple du Module I2C}
Pour compiler vous avez besoin des commandes suivantes :

Exemple de compilation : ./compila.sh ej\_i2c 16f877a

ej\_i2c.c
\verbatiminput{source/ej_i2c.c}