Daten vom Slave zum Master senden

Liebe Forum Freunde,

ich habe eine Frage zum Thema i2 C.

Gibt es eine Möglichkeit Daten vom Slave auch zum Master zu senden.

Wenn ja, würde ich mich über einen einfachen Beispiel Sketch freuen.

Danke im Voraus

Gruß Jürgen

Nein, wenn der Slave die Initiative ergreifen soll.

Ja, wenn der Master danach fragt. Ein Beispiel hängt vom Slave ab, da gibt es verschiedene "Protokolle".

Programm DS3231 EEPROM schreiben und lesen
#include <Wire.h>

void i2c_eeprom_writeByte(int deviceaddress, unsigned int eeaddress, byte data)
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8)); // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(data);
  Wire.endTransmission();
  delay(10);
}

byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress )
{
  byte rdata = 0xFF;
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8)); // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress, 1);
  if (Wire.available()) rdata = Wire.read();
  return rdata;
};

void MemoryDump(byte I2C_EEPROM_ADDRESS, unsigned int NumberOfBytes)
{
  Serial.print(F("Dump of memory content ("));
  Serial.print(NumberOfBytes);
  Serial.print(F(" bytes) from I2C device at address "));
  Serial.println(I2C_EEPROM_ADDRESS, HEX);
  unsigned int addr = 0;
  byte b = i2c_eeprom_read_byte(I2C_EEPROM_ADDRESS, addr);
  char c;
  while (addr < NumberOfBytes)
  {
    Serial.print(addr, HEX);
    Serial.print("  ");
    c = (char)b;
    Serial.print(c); //print content to serial port
    // if ( (b < 0x20) or (b >= 0x7F) )
    // {
      Serial.print(" (0x");
      Serial.print(b, HEX);
      Serial.print(")");
    // };
    Serial.println();
    addr++; //increase address
    b = i2c_eeprom_read_byte(I2C_EEPROM_ADDRESS, addr);
  };
  Serial.println(F("\nEnd of Dump\n"));
};

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  delay(500);
  Serial.println(F("\nAnfang EEPROM 24c32\n"));
  byte i2cadresse = 0x57;
  Serial.print(i2cadresse);
  Serial.print(" (0x");
  Serial.print(i2cadresse, HEX);
  Serial.println(")");
  MemoryDump(i2cadresse, 10);
  i2c_eeprom_writeByte(i2cadresse, 0x01, 0x45);
  MemoryDump(i2cadresse, 10);
};

void loop() {};

Der Slave kann über eine Zusatzleitung den Master informieren, das er Daten hat. z.B. beim PCF8574 die Leitung INT

Was genau, gefällt dir an den Beispielen in der Wire Doku nicht?

Danke für die Antwort

Wo finde ich die Wire Doku?

Da wo die ganzen anderen Arduino Dokus auch sind.
https://www.arduino.cc/reference/en/language/functions/communication/wire/

https://docs.arduino.cc/learn/communication/wire/

Danke für die Info.

Jetzt brauche ich nur noch Zeit um das alles durchzulesen und zu verstehen.

Gruß Jürgen

Oh.. eine gespaltene Persönlichkeit.

Früher war ich schizophren. Heut geht es uns beiden gut :blush:

Welcher Microcontroller? Welcher Slave?

Wenn es zwei Microcontroller die da miteinander kommunizieren sollen
dann bietet sich da eher serielle Schnittstelle an.
Bei einem Arduino Uno als Software-Serial. Da kann man nur nicht so schnell senden.
Es ist wie immer: je mehr Infos über das Gesamtprojekt desto bessere Lösungsvorschläge kann man machen.

vgs

Aua.

Warum nicht I2C?
Wer nur einen Hammer kennt, für den sieht jedes Problem wie ein Nagel aus?

Gruß Tommy

Weil jeder einzelne Flankenwechsel passen muss. Sonst hängt sich der Bus auf weil er ewig auf den Flankenwechsel wartet der nicht mehr kommt.

Und warum funktioniert es dann bei Millionen Anwendungen ohne Deine Probleme?

Gruß Tommy

Die machen bestimmt alle was falsch!
Haben bei der Problemoptimierung versagt, z.B. dummer Weise die Doku gelesen und befolgt.

Weil Elektronik extrem zuverlässig funktionieren kann.

Das ich damit Probleme hätte ist eine ungeprüfte Annahme von dir.
Ich habe mal ein kurzes Posting verfasst und schon ist es auch nicht recht.

Achja ... du weißt schon ..... diese Wortwahl und das dann noch zwischen den Zeilen steht .....

Das kommt auf das Posting an.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.