Multiplexeur ESP8266 I2C

Murey Tasroc

Multiplexeur ESP8266 I2C


EDIT: J’ai exécuté un programme de numérisation de bus i2c et il a détecté un périphérique à 0x70 (le multiplexeur). J’ai connecté l’appareil avec lequel j’essaie d’interfacer directement au bus i2c et j’ai exécuté ce code et cela a fonctionné exactement comme prévu. Mais quand je lance ce code avec l’appareil connecté à l’un des canaux multiplex, cela ne fonctionne pas. Je suis perplexe!


J’essaie de contrôler un appareil I²C via un multiplexeur sur un ESP8266. Voici le circuit que j’utilise et le code. Ce code exact fonctionne si je change le périphérique à connecter directement à SDA et SCL (en contournant le multiplexeur). Malheureusement, s’il est connecté via le multiplexeur, le code affiche « Aucun TCS34725 trouvé ». J’ai essayé ceci sur deux planches distinctes avec les mêmes résultats sur les deux.

Fiche technique du multiplexeur

Empreinte PCB

La réinitialisation (N $ 5) est tirée jusqu’à 3,3 V via une résistance de 10k.

symbole de la fiche technique

#include <Wire.h>

#include <Adafruit_TCS34725.h>

#define TCAADDR 0x70

uint16_t clear, red, green, blue;

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_2_4MS, TCS34725_GAIN_1X);

void setup() {

  Wire.begin();
  Serial.begin(115200);
  delay(10);
  Serial.println("rn");

   tcaselect(6);
  if (tcs.begin()) {
    Serial.println("Found sensor");
  } else {
    Serial.println("No TCS34725 found ... check your connections");
    while (1); // halt!
  }
}

void tcaselect(uint8_t i) {
  if (i > 7) return;

  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();  
}

Des idées sur pourquoi cela ne fonctionne pas?

Chris Stratton

Qu’avez-vous fait pour vérifier l’activité du bus I2C en aval? Avez-vous cherché un analyseur logique USB à portée ou budget? Avez-vous des pullups sur les bus I2C en amont et en aval? Avez-vous pu vérifier que vous commandez le multiplexeur? Avez-vous essayé d’autres chaînes?

Murey Tasroc

Je n’ai pas vérifié avec une portée mais je vais maintenant – Oui, il y a des tractions sur le bus esp i2c et sur sc6 / sd6. J’ai essayé d’autres canaux, même résultat. Je n’ai pas pu vérifier que je commande le multiplexeur – comment recommanderiez-vous que je fasse cela?

brhans

De la fiche technique du multiplexeur: « la réinitialisation à la mise sous tension désélectionne tous les canaux ». Donc, sauf si vous avez communiqué avec le multiplexeur et lui avez dit de sélectionner le canal auquel vous avez connecté votre TCS34725 – rien ne se passera.

Murey Tasroc

Ma fonction tcaselect ne fait-elle pas cela (sélectionner le canal approprié)?

Glenn Willen

Essayez peut-être de connecter tous les canaux ensemble et de connecter le périphérique en aval à cela, pour exclure la possibilité que vous sélectionniez le mauvais canal? (Ou essayez de changer temporairement tcaselect pour appeler Wire.write (0xFF) pour sélectionner tous les canaux?) Ne faites pas ces deux choses cependant. 🙂

Réponses


 Érable

La première chose à vérifier est que! RESET broche de mux correctement tiré par la résistance et non maintenu bas par le MCU maître. Et je veux dire vraiment vérifier non seulement supposer que c’est OK, car il est censé l’être. Le multiplexeur peut toujours ACK en réinitialisation lorsque vous balayez le bus, mais il ne sélectionnera pas le canal de sortie sur commande.

Si ce n’est pas le cas, voici une procédure simple pour diagnostiquer le problème. Vous auriez besoin d’un autre périphérique I2C « B », par exemple VL53L0X que vous avez mentionné. Vous avez déjà effectué certaines des étapes ci-dessous, vous pouvez donc les ignorer. Assurez-vous également que les appareils avec des ID sélectionnables sont toujours câblés de manière identique dans les tests.

  1. Essayez d’envoyer des sélections de canaux aléatoires à Mux puis de lire le registre de contrôle. Si vous ne récupérez pas les valeurs que vous envoyez -> quelque chose de mal avec Mux.
  2. Connectez A (TCS34725) et B directement au bus I2C principal et exécutez le scanner. Vous devriez voir 3 appareils.
  3. Vérifiez que A et B fonctionnent correctement en envoyant certaines commandes et en lisant les réponses. Si A ne fonctionne pas -> quelque chose de mal avec la bibliothèque.
  4. Connectez A et B au canal Mux et scannez le bus après avoir sélectionné ce canal. Vous devriez voir 3 appareils. De plus, si vous pouvez contourner le multiplexeur et balayer le canal lui-même, vous devriez voir 2 appareils.
  5. Si vous ne voyez pas les 3, essayez d’envoyer FF vers Mux (sélectionnez tous les canaux). Si vous pouvez les voir maintenant -> le câblage des canaux est foiré sur le PCB
  6. Essayez de communiquer avec A et B après avoir sélectionné le canal correct. Si B fonctionne et que A ne fonctionne pas -> il y a une sorte d’incompatibilité entre TCS34725 et Mux.
  7. Essayez d’ajouter un délai entre la commande de sélection de canal et la communication suivante avec les appareils. Vous ne devriez pas en avoir besoin mais cela ne fait pas de mal de vérifier.
  8. Si ni A ni B ne fonctionnent dans les tests ci-dessus lorsqu’ils sont connectés à Mux -> quelque chose de mal avec le Mux.

Vous pouvez diagnostiquer davantage en comparant les tensions et les pull-ups sur le bus principal et les canaux Mux de sortie. Parcourez également les fiches techniques et revérifiez les vitesses prises en charge et recalculez les valeurs de résistance de rappel requises pour les canaux Mux (elles dépendent de la vitesse et de la capacité du bus).

Murey Tasroc

l’étape 1 a été un échec sur les deux appareils – j’en ai essayé un troisième et tout a fonctionné (par hasard, les deux étaient mauvais ou peut-être pas correctement soudés sur la carte, bien qu’il n’y ait pas de ponts) … merci pour les conseils de diagnostic


 Michael Karas

Il y a quelque chose que vous devez vérifier attentivement. Dans le monde I2C et SMBus, il y a toujours eu une utilisation déroutante d’un mélange de valeurs d’adresse 7 bits et de valeurs d’adresse esclave 8 bits. La fiche technique du TCA9548A appelle l’adresse esclave I2C pour la partie MUX en tant qu’adresse 7 bits qui réside dans les 7 bits supérieurs de l’octet d’adresse transmis.

entrez la description de l'image ici

entrez la description de l'image ici

Dans votre code, vous avez défini la définition de TCAADDR sur 0x70, ce qui sera correct pour l’instance où vous avez lié les broches A0, A1 et A2 de la partie MUX à GND. Gardez à l’esprit que cette valeur 0x70 est une adresse esclave 7 bits.

De nombreuses bibliothèques de logiciels pour communiquer sur I2C et SMBus utiliseront une représentation 8 bits pour l’adresse esclave, puis simplement ou dans un 0x01 sur le bit bas pour une opération de type READ. Si le code de bibliothèque utilise une entrée d’adresse esclave 7 bits, le code doit décaler cette valeur d’un endroit vers la gauche afin que l’octet à envoyer soit correct.

Donc, la vérification que vous devez faire est de savoir comment le code de bibliothèque traite l’adresse esclave. Si cela fonctionne en mode 8 bits, vous devrez définir votre TCAADDR sur 0xE0.

Ne vous sentez pas mal si c’est le problème qui vous a rattrapé ici. D’innombrables personnes ont été mordues par ce problème.

Murey Tasroc

Merci pour la réponse – malheureusement, j’ai vérifié et la bibliothèque TCS34725 que j’utilise utilise une représentation 7 bits.

Michael Karas

Il est possible que les fonctions rudimentaires de la bibliothèque aient des caractéristiques codées en dur qui sont entièrement adaptées au TCS34725 et qui rendent les transactions bis incompatibles avec le TCA9548A.

Murey Tasroc

Hmm ok donc je l’ai essayé avec un autre appareil (vl53l0x) et ça ne marche pas non plus avec celui-là, même s’il peut communiquer avec cet appareil quand il est connecté au bus i2c et qu’il reconnaît le multiplexeur …

 

ESP8266, I2C, multiplexeur

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *