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() {};