Здравствуйте!
Этот модуль - восьмиканальный 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;
}
}
}
}