Aventures dans I2C: étirement de l’horloge sur le Raspberry Pi

C’est un peu compliqué, techniquement, mais on m’a demandé de documenter le problème au cas où quelqu’un le rencontrerait.

J’obtenais des erreurs de lecture I2C lors de l’utilisation du nouveau TE AmbiMate Carte de capteur MS4 (examen à venir bientôt!) Avec le Raspberry Pi 4. J’ai contacté TE à ce sujet et ils m’ont demandé d’essayer un Pi 3. Alors je l’ai fait, et cela a fonctionné très bien.

C’était un problème intermittent sur le Pi 4 (le type d’erreur préféré de tout le monde!). J’ai donc fait des recherches et trouvé des informations sur quelque chose appelé ‘étirement de l’horloge«.

Cela affecte apparemment le Raspberry Pi et a été documenté en détail, en 2013 par quelqu’un chez Advamation. Voici ce post.

Bien que j’ai trouvé des preuves sur les forums Raspberry Pi qu’il avait été corrigé sur le Pi 4, ce n’est apparemment pas le cas car c’était un Pi 4 sur lequel je rencontrais le problème.

J’ai essayé une bonne mise à jour et une mise à niveau apt-get à l’ancienne et je l’ai réessayée. Pas de joie.

J’ai été pointé du doigt ce problème GitHub ce qui implique que le problème existe toujours. Il a suggéré d’ajouter une ligne à /boot/config.txt

dtoverlay=i2c-bcm2708

ce qui oblige le Pi à utiliser l’ancien pilote I2C. Cela n’a pas fonctionné, en fait cela a aggravé le problème parce que soudain, il ne lirait pas n’importe quoi du capteur. J’ai inversé cela.

J’ai essayé une mise à jour rpi pour obtenir le dernier firmware, juste au cas où un correctif aurait été implémenté sur une version plus récente. Cela a encore échoué.

Finalement, après quelques recherches (bon vieux Google!), Je suis tombé sur ce problème sur GitHub ce qui suggérait que le problème était la vitesse à laquelle j’essayais de lire le bus I2C. J’ai donc ajouté une option de configuration à /boot/config.txt comme suit pour réduire la vitesse de lecture de 100000 bauds à 10000 bauds:

dtparam=i2c_baudrate=10000

Miraculeusement, cela a fonctionné et j’ai reçu des lectures stables de tous les capteurs de l’AmbiMate sans que les erreurs se produisent.

Je suis tombé sur une solution alternative (que je n’ai pas essayée). Apparemment, le bogue n’affecte que horloge matérielle étirement. Cependant, il est possible d’utiliser un autre jeu de broches pour I2C et d’utiliser étirement d’horloge logicielle. C’est documenté sur GitHub ici. Voici le morceau pertinent:

Raspbian dispose d’un pilote logiciel I2C qui peut être activé en ajoutant la ligne suivante à /boot/config.txt:

dtoverlay=i2c-gpio,bus=3

Cela créera un bus I2C appelé / dev / i2c-3. SDA sera sur GPIO23 et SCL sera sur GPIO24 qui sont respectivement les broches 16 et 18 sur l’en-tête GPIO.

J’espère que cela peut être utile à quelqu’un!