Вопрос по PCA9548A

Здравствуйте!
Этот модуль - восьмиканальный I2C мультиплексор.
К модулю подключено какое - либо I2C - устройство.
Каким образом модуль отличает сигналы, которые нужны для выбора порта от сигналов, которые он должен передать на I2C - устройство?
Спасибо!

Страница № 16.

1 лайк
//Функция мультиплексирует/переключает адреса для обмена
#define TCAADDR 0x70
void tcaselect(uint8_t i) {
 if (i > 7) return;
 
 Wire.beginTransmission(TCAADDR);
 Wire.write(1 << i);
 Wire.endTransmission();
}

потом общаешься с устройством по его адресу I2C.

1 лайк

А если мне надо записать два байта в PCF8575, то надо делать так?

 Wire.beginTransmission(0x70); // адрес PCA9548A
 Wire.write(B00000100); // выбрал второй порт
 Wire.write(B11110000); // Записываем младший байт (P00...P07)
 Wire.write(B10110111); // Записываем старший байт (P10...P17)
 Wire.endTransmission();

нет, второй транмишин нужен на адрес PCF8575.

 Wire.beginTransmission(0x70); // адрес PCA9548A
 Wire.write(B00000100); // выбрал второй порт
 Wire.endTransmission();

 Wire.beginTransmission(0x20); // адрес PCF8575
 Wire.write(B11110000); // Записываем младший байт (P00...P07)
 Wire.write(B10110111); // Записываем старший байт (P10...P17)
 Wire.endTransmission();
1 лайк

Получается, что адрес PCF8575 я тоже должен знать…

а как же, так устроена шина I2C, БЕЗ АДРЕСА НИКУДА
прелесть PCA9548A в том что на ее 8 каналах могут висеть устройства с одинаковыми адресами и с ними можно безболезненно общаться.

2 лайка

И при этом, при общении с этими устройствами их адреса я должен в скетче указывать. Кое что проясняется.

Теперь понятно, почему корректно работает следующая программа.
Здесь к всего лишь одному порту PCA9548A подключен BMP180. Это так, для эксперимента. Каждые 5 секунд в Serial выводится температура и давление.

#include <SFE_BMP180.h>
#include <Wire.h>
#define ALTITUDE 300.0 //Altitude
SFE_BMP180 pressure;
int st;
bool trigger, start_bmp180;
double cur_p, cur_t;
byte get_tp;
void setup()
{

  Wire.begin();
  Wire.beginTransmission(0x70);
  Wire.write(B00000100);
  Wire.endTransmission();

  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  pressure.begin();
  Serial.begin(9600);
}

void loop()
{
  //для тактового генератора
  static uint32_t period = 500;
  static uint32_t moment;

  //для BMP180
  char status;
  double T, P;

  static uint32_t time_tp;


  if (millis() - moment >= period)
  {
    moment = millis();
    trigger = !trigger;
    digitalWrite(13, trigger);
    if (trigger) //пришел как бы секундный импульс
    {
      st++;
      if (st == 5)
      {
        start_bmp180 = true;
        get_tp = 1;
        st = 0;
      }
    }
  }


  if (start_bmp180 == true)
  {
    status = pressure.startTemperature();
    if (status != 0)
    {
      delay(status);
      status = pressure.getTemperature(T);
      if (status != 0)
      {
        //Переменная T скоро испортится.
        //ее надо срочно сохранить
        cur_t = T;
      }
    }
    status = pressure.startPressure(3);
    if (status != 0)
    {
      delay(status);
      status = pressure.getPressure(P, T);
      if (status != 0)
      {
        //получаем текущее давление P и переводим миллибары в мм рт. ст.
        cur_p = P * 0.750063783; //миллибары в мм рт. ст.
        String stroka = String(cur_t, 2);
        stroka += " ";
        stroka += String(cur_p, 2);
        Serial.println(stroka);
        start_bmp180 = false;
      }
    }
  }
}