Одинаковые адреса i2c

Тема в разделе "Посоветуйте детальки", создана пользователем save.l, 8 янв 2023.

  1. save.l

    save.l Гик

    Добрый день!
    Требуется совместное использование ИК-датчика MLX90621 (сетка 4х16) и внешней FRAM-памяти.
    Суть в том что ИК-датчик занимает весь диапазон адресов 0х50 - 0х57.
    А fram-память серии FM24C (которая у меня в наличии) так же дает выбор только в пределах 0х50 - 0х57. Посоветуйте выход из ситуации:
    1. Заменить память на другую с другой адресацией. Но я не могу такую найти. Если кто знает - подскажите.
    2. Использовать мультиплексор (типа TCA9548A), но как то жирновато для 2-х устройств.
    3. Использовать аналоговый переключатель по линии SDA (например TS5A3159). Забираем дополнительный пин микроконтроллера, но зато стоит копейки. Рабочий вариант?
     
  2. DetSimen

    DetSimen Гуру

    использовать для одного из устройств SoftI2C
     
  3. parovoZZ

    parovoZZ Гуру

    разнести I2C на разные пины.
     
    DetSimen нравится это.
  4. save.l

    save.l Гик

    Данный код читает из памяти число 14, т.е. все ок!
    Код (C++):
    // *** подключения ***
    // FR24C04            <->   Arduino nano V3
    //  (SDA)              -        A4 (подтяжка 4.7КОм к 5V)
    //  (SCL)              -        A5 (подтяжка 4.7КОм к 5V)
    //  (VCC)              -        5V
    //  (GND,RW,A0,A1,A2)  -        GND

    #include <Wire.h>
    #define adr1 0x50
    #define adr2 0x51

    void setup(void) {
      Wire.begin();
      Serial.begin(9600);
      unsigned int FR = 0;
      Fun_FM24C_read(adr1, 0, &FR, sizeof(FR));
      Serial.println(FR);
    }

    int Fun_FM24C_read(byte disk, byte startAddress, void *data, unsigned int len) {
      byte rdata;
      byte *p;
      Wire.beginTransmission(disk);
      Wire.write(startAddress);
      Wire.endTransmission();
      Wire.requestFrom(disk, len);
      for (rdata = 0, p = (byte*)data; Wire.available() && rdata < len; rdata++, p++) {
        *p = Wire.read();
      }
      return (rdata);
    }
    void loop() {}
    А этот код выводит 0.
    Код (C++):
    // *** подключения ***
    // FR24C04            <->   Arduino nano V3
    //  (SDA)              -        D4 (подтяжка 4.7КОм к 5V)
    //  (SCL)              -        D6 (подтяжка 4.7КОм к 5V)
    //  (VCC)              -        5V
    //  (GND,RW,A0,A1,A2)  -        GND

    #include "SoftI2CMaster.h"
    #define sdaPin 4
    #define sclPin 6
    SoftI2CMaster i2c = SoftI2CMaster( sclPin, sdaPin );

    #define adr1 0x50
    #define adr2 0x51

    void setup(void) {
    //  i2c.begin();  // наличие-отсутствие это строки ничего не меняет
      Serial.begin(9600);
      unsigned int FR = 0;
      Fun_FM24C_read(adr1, 0, &FR, sizeof(FR));
      Serial.println(FR);
    }

    int Fun_FM24C_read(byte disk, byte startAddress, void *data, unsigned int len) {
      byte rdata;
      byte *p;
      i2c.beginTransmission(disk);
      i2c.write(startAddress);
      i2c.endTransmission();
      i2c.requestFrom(disk, len);
      for (rdata = 0, p = (byte*)data; i2c.available() && rdata < len; rdata++, p++) {
        *p = i2c.read();
      }
      return (rdata);
    }
    void loop() {}
    тут же загружаю поисковик из примера библиотеки "SoftI2CMaster.h" и на данных портах 4 и 6 вижу свою fram-память:
    Код (C++):
    Scanning...
    I2C device found at address 0x50 !
    I2C device found at address 0x51 !
    Found 2 devices!
     
    что делаю не так?
     
    Последнее редактирование: 10 янв 2023
  5. save.l

    save.l Гик

    DetSimen и parovoZZ, спасибо за помощь. В итоге с оболочкой <SoftWire.h> все получилось.