Le bus I2C présente une certaine vulnérabilité en raison de sa conception : les lignes SCL et SDA sont normalement maintenues à un niveau logique haut et sont tirées vers le bas par les différents composants. Dès qu'un capteur se bloque et maintient l'une de ces lignes en permanence à un niveau bas, la communication sur le bus est interrompue pour l’ensemble des dispositifs connectés.

Pas si facile : bus off

Dans l'entreprise de l'auteur, un système de capteurs d'humidité basé sur un STM32 et un HDC2010 de Texas Instruments a été mis en place. Après plusieurs milliers d'échanges, un problème inattendu est apparu : le bus I2C ne répondait plus aux commandes car le capteur maintenait l'une des lignes à un niveau bas. Le problème a été résolu en coupant puis en rétablissant l'alimentation électrique du système.
 

Lorsqu'un bus I2C est en fonctionnement, les résistances de tirage vers le haut (pull-up) sont toujours présentes. Cela signifie qu’un transistor destiné à isoler un périphérique connecté au bus de la ligne VCC n’est pas forcément la solution idéale, car une alimentation fantôme, transmise via les résistances pull-up, peut suffire à continuer d’alimenter les parties logiques défaillantes d’un d'un capteur bloqué.

Je m'abonne
Abonnez-vous à la balise thématique I2C pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !

Isolation par masse

Une solution consiste à désactiver les capteurs en coupant leur référence de masse. Pour ce faire, il suffit d'insérer un MOSFET dans la ligne de masse des capteurs, comme le montre la figure 1. Les capteurs utilisés ici ayant une consommation électrique minimale, la chute de tension est négligeable.

Figure 1. Ce circuit met fin aux problèmes de capteurs.


En cas de dysfonctionnement, le microcontrôleur hôte peut désactiver le MOSFET et ainsi désactiver le capteur. L’avantage de cette approche est qu’elle permet d’éteindre un capteur sans affecter l'alimentation principale du microcontrôleur.

Du côté logiciel, quelques modifications sont nécessaires. Tout d'abord, la routine de lecture doit être capable d’identifier un capteur ou un bus inactif — dans le cas du HDC2010, cela a été fait en renvoyant une valeur de température incohérente. L'étape suivante consiste à couper brièvement l'alimentation électrique :

{

  HAL_GPIO_WritePin(I2C_POWERCTRL_GPIO_Port,

      I2C_POWERCTRL_Pin, GPIO_PIN_RESET);

  HAL_Delay(250);

  HAL_GPIO_WritePin(I2C_POWERCTRL_GPIO_Port,

      I2C_POWERCTRL_Pin, GPIO_PIN_SET);

  HAL_Delay(20);

 

Une fois tous les dysfonctionnements corrigés, une reconfiguration complète du capteur s’impose :

 

  uint8_t configContents;

  configContents = hdc2010_readReg(CONFIG);

 

  configContents = (configContents | 0x80);

  hdc2010_writeReg(CONFIG, configContents);

  HAL_Delay(50);

}

Expérience pratique

Depuis l’intégration des modifications du circuit décrites ici, notre système de capteurs fonctionne de manière fiable. Les prototypes ont fonctionné pendant plusieurs mois jusqu'à l'épuisement des piles. Le faible coût du transistor fait de ce circuit une option particulièrement pertinente à envisager.


Note de l'éditeur : Cet article (250221-03) est paru dans le numéro Elektor Circuit Special 2025.


Questions ou commentaires ?

 

Envoyez un courriel à l'auteur tamhan@tamoggemon.com, ou contactez Elektor redaction@elektor.fr.
 

Je m'abonne
Abonnez-vous à la balise thématique Circuits & Circuit Design pour être averti dès qu'une information relative à ce sujet sera publiée par Elektor !