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