Page Personnelle de Vincent Kerhoas
Vincent Kerhoas
Enseignant du Supérieur
Professeur Agrégé
Page Personnelle de Vincent Kerhoas

LE BUS I2C

Back                  << Index >>


DOCUMENTATION


On s’appuie sur le capteur de température LM75 pour présenter des échanges sur le bus I2C.
Ces explications valent bien entendu pour tout type de composant I2C.
Il est important de faire le parallèle avec la datasheet du LM75 :

datasheet_LM75

Un bus I2C est un bus série :

REMARQUE :

Les composants I2C ont généralement des sorties à collecteur ouvert.
Il est important de vérifier que des résistances de pull-up sont présentes sur le bus pour alimenter les transistors.

Toute communication I2C commence par l’adressage (ou le pointage) d’un registre dans le composant esclave.

Lecture de la Température

Cliquer sur la figure ci dessous:

Configuration du capteur (Mise en Veille)

Cliquer sur la figure ci dessous:

Lecture de deux octets

Un cas fréquent : La lecture de plusieurs registres de l’esclave.
Le maître acquite chaque octet envoyé par l’esclave.
Le non acquitement met fin au transfer.


Programmation du Périphérique I2C

RAPPEL : Les registres sont détaillés dans la documentation RefManual_STM32F411.pdf

L’objectif est d’établir une communication entre le capteur LM75 se trouvant sur le carte mbed shield, et notre microtonctôleur, via la liaison I2C.

Configuration des Broches

Le STM32F411 comporte 3 périphériques I2C ( I2C1, I2C2, I2C3 )
Nous allons utiliser I2C1, qui est relié au capteur de température LM75 ( carte mbed shield ) via les broches PB8 et PB9.

Extrait de la documentation de la carte mbed shield :

REMARQUE : Les résistances de pull up sont déjà présentes sur la carte.

Les broches à configurer sont donc PB8 (SCL) et PB9 (SDA) ( Datasheet STM32F411 ) :

PB8 et PB9 doivent donc être configurées en Alternate Function 04.

Nous utiliserons le périphérique I2C avec des interruptions basées sur des événements ( I2C1_EV_IRQn ) et des erreurs de transmission ( I2C1_ER_IRQn ).

stm32f4xx_hal_msp.c

Configuration du périphérique I2C

Nous allons considérer la structure I2C_HandleTypeDef suivante :

stm32f4xx_hal_i2c.h

I2C_TypeDef Permet d’accéder aux différents registre du périphérique I2C :

stm32f411xe.h

La fonction HAL_I2C_Init() permet de configurer l’horloge I2C et d’autoriser l’utilisation du périphérique.

stm32f4xx_hal_i2c.c

Appel de la Fonction :

main.c

Transmission d’une donnée ( uC –> Capteur )

La fonction HAL_I2C_Master_Transmit_IT initialise le contexte hi2c, en indiquant le nombre d’octets à envoyer, l’ emplacement des données à envoyer et le type d’opération ( écriture ).
Une fois le bit de start envoyé, il y aura interruption sur événement, et c’est dans cette interruption qu’on décidera de la suite pour envoyer toute la trame.
Tant que la trame n’est pas totalement envoyée, on est dans l’état I2C_BUSY.

stm32f4xx_hal_i2c.c

La routine d’interruption HAL_I2C_EV_IRQHandler() est appelée au cours des différentes étapes de l’envoi de la trame :

  1. Un bit de start a été envoyé –> J’envoie l’adresse de l’esclave et le type d’opération
  2. Si l’esclave a acquité l’adresse –> J’envoie un octet de donnée.
  3. Tant qu’il y a des octets à envoyer, je les envoie.
  4. Quand tout est envoyé, j’envoie un bit de stop et je passse de l’état I2C_BUSY à I2C_OK
stm32f4xx_hal_i2c.c

Réception d’une donnée ( Capteur –> uC )

La fonction HAL_I2C_Master_Receive_IT initialise le contexte hi2c, en indiquant le nombre d’octets à recevoir, l’ emplacement des données à recevoir et le type d’opération ( lecture ).
Une fois le bit de start envoyé, il y aura interruption sur événement, et c’est dans cette interruption qu’on décidera de la suite pour envoyer toute la trame.
Tant que la trame n’est pas terminée, on est dans l’état I2C_BUSY.
C’est encore au maître ( le microcontrôleur ) d’initier un dialogue avec le capteur, en envoyant l’adresse de ce dernier après avoir déclenché un bit de start.
Comme il y a opération de lecture, le capteur est autorisé à envoyer des données octet par octet ( tant que le microcontrôleur acquitte chaque octet ).

stm32f4xx_hal_i2c.c

Le Capteur LM75B

Examen de la Doc du capteur

datasheet_LM75

L’adresse du capteur est par défaut 0x48.
Les 3 bits de poids faible peuvent être modifiés matériellement ( en reliant les broches A2 A1 A0 à la masse ou à 3.3V ).

Un capteur peut être vu comme une sorte de processeur complexe avec lequel il faut dialoguer par l’intermédiaire de lectures ou d’écritures dans des registres.

Le capteur LM75 contient les registres suivants :

Nous nous interesserons uniquement au registre Temp d’adresse 0x00.
La température mesurée est disponible sur 2 octets.

Les 5 bits de poids faible sont à ignorer, les 11 bits restants représentent une température au format virgule fixe 8.3.

Scénario Détaillé pour l’acquisition de la température :

main.c

1. Envoi de la valeur 0x00 au capteur pour désigner le registre Température

scenario_transmission

2. Réception de 2 Octets représentant la température mesurée

scenario_reception


Travaux Pratiques

PROJET SOURCE


WORKSPACE_F411_HAL_STM32CUBE


Q1. Compléter la fonction lm75_read_temp(int* temp) afin de récupérer la mesure de température du capteur.
Cette fonction doit :

Vérifier le bon fonctionnement du programme en observant la donnée mesurée et traitée à l’aide du debugger.

Q2. Réaliser l’enregistrement des trames I2C avec un analyseur logique.

Q3. Réaliser l’affichage de la donnée avec la fonction uart_printf(), de telle sorte qu’on observe sur le terminal la donnée en °C, avec 3 chiffres après la virgule.


Back                  << Index >>