Chargement / déploiement maximal de l'appareil sur le bus I2C du RPi?

Aug 19 2020

J'ai un RPi4 et j'utilise le bus I2C avec 4 expandeurs gpio MCP23017 et cela fonctionne très bien. Mon intention est d'utiliser 8 périphériques MCPMCP23017, car ils n'ont qu'un adressage 3 bits, c'est le maximum sur 1 bus I2C. Ma question est la suivante: le bus I2C du RPi a-t-il un chargement / déploiement maximal de périphérique?

Réponses

2 Milliways Aug 20 2020 at 14:37

Vous ne comprenez pas I²C - il s'agit d'un bus de drain ouvert, donc le concept de fanout ne s'applique pas. La charge est davantage limitée par la capacité - qui à son tour est liée à la longueur et à la disposition du bus en plus du nombre d'appareils. Vous pouvez maximiser le nombre de périphériques en utilisant des pullups ou une mise en mémoire tampon de faible valeur.

Voir Mise en mémoire tampon et multiplexage dans https://en.wikipedia.org/wiki/I²C

"Voir Lorsqu'il y a de nombreux périphériques I2C dans un système, il peut être nécessaire d'inclure des tampons de bus ou des multiplexeurs pour diviser de grands segments de bus en plus petits. Cela peut être nécessaire pour maintenir la capacité d'un segment de bus en dessous de la valeur autorisée ou pour permettre à plusieurs appareils avec la même adresse d'être séparés par un multiplexeur. "

Avec n'importe quelle disposition sensible, vous ne devriez pas avoir de problèmes de chargement avec 8 périphériques MCPMCP23017.

GeertVc Aug 21 2020 at 12:45

Si vous êtes préoccupé par une capacité de bus trop élevée, une répartition trop élevée (si cela est pertinent dans ce cas ...) ou si vous souhaitez connecter plus de 8 modules d'extension MCP23017 IO au RPi, il existe une solution très simple : connectez un switch I2C comme le PCA9548 (8 bus I2C) - ou similaire - aux broches I2C d'origine du RPi. Étant donné que le noyau Linux a un support implicite pour cela depuis quelques années, la seule chose que vous devez faire est d'ajouter la ligne suivante au fichier /boot/config.txt(as sudo):

dtoverlay=i2c-mux,pca9548,addr=0x70

De cette façon, vous aurez un supplément de 8 bus I2C auxquels vous pourrez connecter vos appareils supplémentaires (utilisez i2cdetect -lpour voir les bus supplémentaires et leurs noms). La seule chose que vous devez faire dans votre code est d'indiquer à votre logiciel à quel /dev/i2c-xappareil vos appareils I2C sont connectés.

Quelques avantages:

  • Propagation de la capacité du bus
  • Vous n'avez pas à vous soucier des commandes de commutation de l'I2C MUX, le module du noyau Linux le fait pour vous en fonction du /dev/i2c-xbus.
  • Vous pouvez ajouter un total de 64 périphériques MCP23017 au RPi (indirectement, c'est-à-dire), ce qui signifie un total (fou) de 64 x 16 = 1024 IO (que voulez-vous de plus ...)
  • Important : vous pouvez travailler avec un mix d'alimentations "de l'autre côté" de l'I2C MUX. Cela peut être 3V3, mais aussi 1V8 ou 5V. Extrêmement pratique! Notez que l'extrémité avant du I2C MUX doit obéir à l'alimentation du RPi (c'est-à-dire 3V3) pour éviter d'endommager les broches d'entrée / sortie.

Désavantage:

Oui, il y en a un: vous devez ajouter du matériel supplémentaire (bien que limité) à votre projet mais vous en récupérez beaucoup pour ce petit effort supplémentaire.