Actions

KAmod I2C Hub4 (PL)

From Kamamilabs.com - Wiki

Revision as of 07:26, 3 May 2025 by Grzegorzbecker (talk | contribs) (Created page with "__jzpdf__ ===== Opis ===== <b>KAmod I2C Hub8 - Przełącznik/rozdzielacz interfejsu I2C z funkcją translacji napięć</b><br> <br> Moduł KAmod I2C Hub4 umożliwia przekierowanie sygnałów SCL i SDA wejściowego interfejsu I2C do czterech niezależnie aktywowanych wyjściowych interfejsów I2C (4 pary SCL i SDA). Zastosowany w dowolnej aplikacji pozwala na usunięcie konfliktu zduplikowanych adresów układów na magistrali I2C i zapewnia dwukierunkową komunikację. D...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Opis

KAmod I2C Hub8 - Przełącznik/rozdzielacz interfejsu I2C z funkcją translacji napięć

Moduł KAmod I2C Hub4 umożliwia przekierowanie sygnałów SCL i SDA wejściowego interfejsu I2C do czterech niezależnie aktywowanych wyjściowych interfejsów I2C (4 pary SCL i SDA). Zastosowany w dowolnej aplikacji pozwala na usunięcie konfliktu zduplikowanych adresów układów na magistrali I2C i zapewnia dwukierunkową komunikację. Dodatkowo KAmod I2C Hub4 może działać jako translator napięć magistrali I2C - akceptuje różne poziomy napięć dla każdego wyjścia.

Podstawowe cechy i parametry
  • Dwukierunkowy przełącznik/rozdzielacz interfejsu I2C z czterema wyjściami
  • Dowolna kombinacja przekierowania wejściowego interfejsu I2C do wyjściowych
  • Zawiera układ TCA9546A
  • Trzy wejścia adresowe – możliwe dołączenie 8 modułów do jednego interfejsu
  • Działa z taktowaniem interfejsu I2C do 400 kHz
  • Działa z napięciem 1,8...5,5 V na liniach interfejsu I2C
  • Zawiera rezystory podciągające (pull-up, 10 kΩ) do zasilania V+ na wszystkich liniach interfejsów wyjściowych I2C
  • Umożliwia zastosowanie zewnętrznych rezystorów podciągających
  • Umożliwia translację napięć - akceptuje różne poziomy napięć dla każdego wyjścia
  • Umożliwia translację napięć – interfejs wejściowy I2C toleruje napięcie wyższe (do 5,5 V) od napięcia zasilającego moduł
  • Zasilanie napięciem 1,8...5,5 V



Wyposażenie standardowe
Kod Opis
KAmod I2C Hub8
  • Zmontowany i uruchomiony moduł
  • 1 x prosta listwa goldpin 10-pin raster 2,54 mm
  • 1 x prosta listwa goldpin 8-pin raster 2,54 mm



Schemat elektryczny


Rozmieszczenie linii I/O


Oznaczenie (J1) Funkcja
SD
  • Sygnał SDA (dane) interfejsu I2C
SC
  • Sygnał SCL (zegar) interfejsu I2C
RST
  • Wejście zerujące układ, aktywne w stanie L
A0, A1, A2
  • Wejścia umożliwiające ustawienie adresu interfejsu I2C (bity 2, 1, 0). Domyślnie ustawione na logiczne 0.


Sterowanie modułem KAmod I2C Hub4 odbywa się poprzez interfejs I2C wyprowadzony na złączu J1. Linie SD i SC wymagają zewnętrznych rezystorów podciągających pull-up. Komunikacja może być taktowana sygnałem zegarowym o częstotliwości do 400 kHz.

Wejścia A0, A1, A2 pozwalają ustawić adres (bity nr 2, 1 i 0), jakim będzie dysponował moduł dołączony do interfejsu I2C. Domyślnie wejścia te są połączone do masy poprzez rezystory (pull-down) i przyjmują wartości logiczne 0. Dołączenie dodatniego bieguna zasilania do wejść A0/A1/A2 ustawia logiczne 1 dla najmłodszych bitów adresu. Wszystkie dostępne adresy interfejsu I2C zawierają się w zakresie 0x70...0x77.

Sygnał zerujący (RST) służy do wyzerowania układu TCA9546A na płytce KAmod I2C Hub4. Podanie logicznego stanu niskiego (L) przywraca wszystkie ustawienia do stanu początkowego – wyjścia I2C będą nieaktywne.

Wyjściowe interfejsy I2C


Oznaczenie Funkcja
SD0 Sygnał SDA (dane) interfejsu I2C – wyjście I2C 0
SC0 Sygnał SCL (zegar) interfejsu I2C – wyjście I2C 0
SD1 Sygnał SDA (dane) interfejsu I2C – wyjście I2C 1
SC1 Sygnał SCL (zegar) interfejsu I2C – wyjście I2C 1
SD2 Sygnał SDA (dane) interfejsu I2C – wyjście I2C 2
SC2 Sygnał SCL (zegar) interfejsu I2C – wyjście I2C 2
SD3 Sygnał SDA (dane) interfejsu I2C – wyjście I2C 3
SC3 Sygnał SCL (zegar) interfejsu I2C – wyjście I2C 3


Moduł KAmod I2C Hub4 zawiera 4 wyjściowe interfejsy I2C oznaczone jako I2C0...I2C3. Komunikacja pomiędzy Interfejsem wejściowym, a interfejsami wyjściowymi jest w pełni dwukierunkowa - nazwy „wejściowy” i „wyjściowy są tylko umowne.

Interfejsy I2C0...I2C3 są wyposażone w rezystory podciągające pull-up, o wartości 10 kΩ dołączone do zasilania V+. Rozmieszczenie interfejsów oraz poszczególnych linii SDA i SCL zostało dokładnie oznaczone na płytce modułu oraz na rysunku:

Sterowanie wyjściami I2C

Sterowanie modułem KAmod I2C Hub4 jest możliwe poprzez interfejs I2C na złączu J1 (linie SD i SC). Zastosowany w module układ TCA9546A wymaga wysłania 1 bajtu danych, który ustawia wyjścia I2C0...I2C3 w stan aktywny lub nieaktywny. Podstawowy adres układu to 0x70 i może być zmieniany w zakresie 0x70...0x77 w zależności od stanu wejść A2, A1, A0 na złączu J1. Format ramki sterującej I2C pokazują rysunki.



Szczegółowe informacje dotyczące komunikacji i konfiguracji układu TCA9546A są dostępne w dokumentacji technicznej tego układu.

Rezystory podciągające (pull-up)
Zasilanie
Oznaczenie (J1) Funkcja
V+ wejście zasilania, biegun dodatni
GND wejście zasilania, biegun ujemny (GND)

Moduł KAmod I2C Hub4 może być zasilany napięciem stałym o wartości 1,8...5,5V, dołączonym do styków V+ oraz GND na złączu J1.

Wymiary

Wymiary płytki KAmod I2C Hub4 to 27x18,3 mm. Na płytce znajdują się 2 otwory montażowe o średnicy 3,2 mm.



Program testowy

Program testowy został napisany w środowisku Arduino dla płytki KAmodESP32 POW RS485.

//example code for KAmod I2C Hub4
//control 4x MCP23008 with the same I2C address
//ino board: ESP32-WROOM-DA Module

#include <Wire.h>
//#include <Adafruit_MCP23X17.h>
#include <Adafruit_MCP23X08.h>

#define DEBUG False

//LED
#define LED_PIN         2 
#define MY_DELAY        2000
#define TEST_LED_ON     1
#define TEST_LED_OFF    0

//I2C
#define I2C_SDA         33
#define I2C_SCL         32
#define I2C_FREQ        100000
#define MCP23008_ARD    0x20

#define TCA9546_ARD     0x70
#define TCA9546_CH0     (1<<0)
#define TCA9546_CH1     (1<<1)
#define TCA9546_CH2     (1<<2)
#define TCA9546_CH3     (1<<3)

TwoWire I2Cbus = TwoWire(0);
Adafruit_MCP23X08 MCPIO;
int i;
int sel;
int success;

//--------------------------------------------------
bool i2cHub(uint8_t ch_mask){
  I2Cbus.beginTransmission(TCA9546_ARD);
  I2Cbus.write(&ch_mask, 1);
  return I2Cbus.endTransmission(true);
}

//--------------------------------------------------
bool i2cCheck(uint8_t adr){
  I2Cbus.beginTransmission(adr);
  return I2Cbus.endTransmission(true);
}

//--------------------------------------------------
void setup() {
  Serial.begin(115200);
  while (!Serial) {}
  delay(1000); // wait for native usb
  Serial.println(); Serial.println(); Serial.println();
  Serial.println("Hello. KAmod I2C Hub4 test");

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);

  delay(500);
  while(!I2Cbus.begin(I2C_SDA, I2C_SCL, I2C_FREQ)){
    Serial.println("I2C Bus init failed...");
  }

  success = 0;
  sel = 3;

  while(1){
    sel++;
    if (sel > 3) {
      sel = 0;
      delay(500);
    }
    i2cHub(1<<sel);
    delay(20);

    if (!i2cCheck(MCP23008_ARD)){
      delay(20);
      if (MCPIO.begin_I2C(MCP23008_ARD, &I2Cbus)) {
        Serial.print("MCP init OK at channel ");
        success++;
      } else {
        Serial.print("MCP init FAIL at channel ");
      }
    } else {
      Serial.print("MCP Detect Failed at channel ");
    }
    Serial.print(sel);
    Serial.println();

    if ((sel == 3) && (success > 0)) break;
  }

  Serial.println("Setup finished");
  sel = 3;
  i = 8;
  success = 0;
}

//-------------------------------------------------
void loop() {
  i++;
  if (i  >= 8){
    i = 0;
    Serial.println(); Serial.println();
    while(1){
      sel++;
      if (sel > 3) {
        sel = 0;
        delay(500); 
      }

      i2cHub(1<<sel);
      if (!i2cCheck(MCP23008_ARD)){
        Serial.println(); Serial.println("##################");
        Serial.print("Select I2C channel ");
        Serial.print(sel); Serial.println();
        Serial.print("Out: ");
        success++;
        break;
      } else {
        Serial.print("MCP Detect Failed at channel ");
        Serial.print(sel); Serial.println();
        success = 0;
      }
      delay(50);
    }
  }

  if (i & 1){
    digitalWrite(LED_PIN, TEST_LED_ON);
  } else {
    digitalWrite(LED_PIN, TEST_LED_OFF);
  }
  
  Serial.print(i); Serial.print(" ");
  MCPIO.pinMode(i, OUTPUT);
  MCPIO.digitalWrite(i, TEST_LED_ON);
  delay(200);
  MCPIO.pinMode(i, OUTPUT);
  MCPIO.digitalWrite(i, TEST_LED_OFF);
  delay(100);

  if (success >= 12) {
    Serial.println(); Serial.println(); Serial.println();
    Serial.println("### Verify OK 3 times ###");
    Serial.println("### THATS ALL ###");
    while(1){};
  }
}



Linki