INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FRAM am Arduino
10.11.2019, 18:55 (Dieser Beitrag wurde zuletzt bearbeitet: 10.11.2019 19:17 von Tommy56.)
Beitrag #25
RE: FRAM am Arduino
Da Interesse an der Version mit Übergabe der I2C-Adressen geäußert wurde, hier die Version (fRam2.h):
Code:
// Mit Anleihen bei rkuehle (Template), Rob Tillaart (I2C_EEPROM library), Ardu_Arne (FRAM), Tommy56 (fRam.h) und Arduino core (HEX)
// Handling für FRAM Bausteine 16 KBit (1 Adressbyte) und 64KBit (2 Adressbytes)
// für mehrere FRAM IC
#include <Arduino.h>
#include <Wire.h>

// I2C-(Basis)Adresse (Aus 0x5 wird dann die 0xC, die im Datenblatt steht)
//#define F_RAM 0x57  // auf DS3231 mit 7 gebrückt oder 0x50  


// FRAM schreiben - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_write (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++)  Wire.write(wert[i]);
    rc = Wire.endTransmission();
    //Serial.print("rc: ");Serial.println(rc);
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++) Wire.write(wert[i]);
    rc = Wire.endTransmission();
  }
  TWBR = 72;  // 100 kHz (default)
}

// FRAM lesen - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_read (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(devAdr, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    // cast to int for Wirelib
    Wire.requestFrom((int)i2c_adresse, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  TWBR = 72;  // 100 kHz (default)
}


// Schreibt beliebige Werte (auch Arrays beliebiger Typen) in den FRAM
template <class T> int fRamWrite(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  orig = len;
  // Solange Bytes zu senden sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_write (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// liest beliebige Werte aus dem FRAM . Die Länge wird von der Zielvariablen bestimmt
// optionaler Parameter laenge wird nur berücksichtigt, wenn er kleiner, als die Länge der Variablen ist

template <class T> int fRamRead(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert, int laenge = 0) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  // Wunschlänge gesetzt und passt in Variable rein
  if ((laenge > 0) && (laenge < len)) len = laenge;
  orig = len;
  // Solange Bytes zu holen sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_read (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// Hilfsfunktion für Hexdarstellung
// Puffer, Wert, Stellenzahl (2 oder 4), Ein Blank wird voran gestellt
char *fillHex(char *buf, uint16_t val, uint8_t len, boolean withBlank = true) {
  uint16_t m;
  byte str, t;

  if (len == 4) {
    //Adresse
    str = 5;
    buf[0] = ' ';
    for (byte i = 1; i < 5; i++) buf[i] = '0';
  }
  else {
    // Byte
    str = 3;
    buf[0] = ' ';
    buf[1] = '0';
  }
  buf[str] = '\0';
  do {
    m = val;
    val /= 16;
    char c = m - 16 * val;
    buf[--str] = c < 10 ? c + '0' : c + 'A' - 10;
  } while (val);
  if (!withBlank) return buf+1;
  return buf;
}

// Anzeige des Fram im angegebenen Bereich Hex und als (druckbares) Zeichen
void dumpFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis) {
  // Hexformatierer
  char buf[6];
  //Lesepuffer
  byte readBuffer[16];
  // Zeichenpuffer
  char zbuffer[17];
  uint16_t start;
  uint8_t len = 16;
  start = von;

  Serial.print("FRAM Dump I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.println(fillHex(buf, bis, 4, false));
  while (start <= bis) {
    memset(zbuffer, 0, 17); // leeren
    if ((bis - start) < 16) len = bis - start + 1;
    fRamRead(i2c_adresse, num_adressbytes, start, readBuffer, len);
    Serial.print(fillHex(buf, start, 4)); // Adresse
    for (byte i = 0; i < len; i++) {
      Serial.print(fillHex(buf, readBuffer[i], 2));
      if ((readBuffer[i] < 32) || (readBuffer[i] > 126)) zbuffer[i] = '.';
      else zbuffer[i] = readBuffer[i];  // druckbare Zeichen
    }
    // Wenn letzte Zeile < 16, dann auffüllen
    if (len < 16) {
      for (byte i = 0; i < (16 - len); i++) Serial.print("   ");
    }
    Serial.print("   "); Serial.println(zbuffer);
    start += 16;
  }
}

//Füllen des Fram mit einem bestimmten Zeichen in einem Bereich
void fillFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis, uint8_t val) {
  // Hexformatierer
  char buf[6];
  byte writeBuffer[16];
  uint16_t start;
  uint8_t len = 16;
  start = von;
  memset(writeBuffer, val, 16);
  Serial.print("FRAM schreiben I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.print(fillHex(buf, bis, 4, false));
  Serial.print(" mit 0x"); Serial.println(fillHex(buf, val, 2, false));
  len = 0;
  while (start <= bis) {
    if ((bis - start) < 16) {
      len = bis - start + 1;
      F_RAM_write (i2c_adresse, num_adressbytes, writeBuffer, len, start);
    }
    else fRamWrite(i2c_adresse, num_adressbytes, start, writeBuffer);
    start += 16;
  }
}

Und ein paar Beispiele (für 64k FRAM):
Code:
// fram64k_2
#include <Wire.h>
#include "fRam2.h"

char text[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-*/,;.:";
char buffer[45]; // Länge wie text

char text1[] = "1234567890";
char text2[] = "abcdefghij";

float f= 33.44;

typedef struct {
  int i1;
  uint32_t aktMillis;
} teststruct;

teststruct tarr[10];


void setup() {
byte pos;
  Serial.begin(115200);
  Serial.println("Start");
  Wire.begin();
  // Schreib- und Leseteil können auch wechselseitig auskommentiert werden
  // fillFram(0x50, 2, 0xff,0x99);
  //fRamWrite(0x2d,text2);
  //fRamRead(0x0,buffer);
  //Serial.println((unsigned char *)buffer,HEX);
  
  // Schreibteil
  
  //fRamWrite(0x1FB,text1);
  //fRamWrite(0x50, 2,0x100, text);
  
  // Leseteil
  //fRamRead(0x02d,buffer);
  //Serial.println(buffer);
  //fRamRead(0x100,buffer);
  //Serial.println(buffer);

  // Hilfsfunktionen
  fillFram(0x50, 2, 0x00,0xff,0xee);
  fillFram(0x57, 2, 0x00,0xff,0xaa);
  fRamWrite(0x50, 2, 0x2d,text2);
  fRamWrite(0x57, 2,0x70, text);
  fRamRead(0x50, 2,0x2d, buffer);
  Serial.println(buffer);
  fRamRead(0x57, 2,0x70, buffer);
  Serial.println(buffer);
  dumpFram(0x50, 2,0, 0x1ff);
  dumpFram(0x57, 2,0, 0x1ff);
}

void loop() {  
}

Gruß Tommy

Nebenan wurde gerade mit 256k erfolgreich getestet.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle von mir veröffentlichten Codes unterliegen der GPL Version 3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2019, 10:56
Beitrag #26
RE: FRAM am Arduino
(10.11.2019 18:55)Tommy56 schrieb:  Da Interesse an der Version mit Übergabe der I2C-Adressen geäußert wurde, hier die Version (fRam2.h):

Danke Tommy,
jetzt wird es Zeit für mich, auch damit mal zu experimentieren.
Ein derartiger Käfer liegt hier schon länger rum.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.11.2023, 18:31 (Dieser Beitrag wurde zuletzt bearbeitet: 04.11.2023 18:36 von Tommy56.)
Beitrag #27
RE: FRAM am Arduino
Im Zeitalter der ESP etwas erweitert (ungetestet)
Die Puffer-Länge heißt anders und die TWBR-Zeile brauchen wir wohl nicht.
fRam.h:
Code:
// Mit Anleihen bei rkuehle (Template), Rob Tillaart (I2C_EEPROM library), Ardu_Arne (FRAM), Tommy56 (fRam.h) und Arduino core (HEX)
// Handling für FRAM Bausteine 16 KBit (1 Adressbyte) und 64KBit (2 Adressbytes)
#include <Arduino.h>
#include <Wire.h>

// 1 für 16 k, 2 für 64 k
#define ADRESS_BYTES 2
#if defined(ESP8266) || defined (ESP32)
#define BUFFER_LENGTH I2C_BUFFER_LENGTH
#endif
#define TWI_LENGTH BUFFER_LENGTH - ADRESS_BYTES

// I2C-(Basis)Adresse (Das wird dann die 0xC, die im Datenblatt steht)
#define F_RAM 0x57  // auf DS3231 mit 7 gebrückt oder 0x50  


// FRAM schreiben - Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_write (byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  // TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (ADRESS_BYTES == 1) {
    // 16 K
    devAdr = F_RAM | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++)  Wire.write(wert[i]);
    rc = Wire.endTransmission();
    //Serial.print("rc: ");Serial.println(rc);
  }
  else {
    // 64 K
    Wire.beginTransmission(F_RAM);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++) Wire.write(wert[i]);
    rc = Wire.endTransmission();
  }
  // TWBR = 72;  // 100 kHz (default)
}

// FRAM lesen - Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_read (byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  // TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (ADRESS_BYTES == 1) {
    // 16 K
    devAdr = F_RAM | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(devAdr, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  else {
    // 64 K
    Wire.beginTransmission(F_RAM);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(F_RAM, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  // TWBR = 72;  // 100 kHz (default)
}


// Schreibt beliebige Werte (auch Arrays beliebiger Typen) in den FRAM
template <class T> int fRamWrite(uint16_t framAddr, const T& wert) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  orig = len;
  // Solange Bytes zu senden sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > TWI_LENGTH) cnt = TWI_LENGTH;
    // Schreiben
    F_RAM_write (p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// liest beliebige Werte aus dem FRAM . Die Länge wird von der Zielvariablen bestimmt
// optionaler Parameter laenge wird nur berücksichtigt, wenn er kleiner, als die Länge der Variablen ist

template <class T> int fRamRead(uint16_t framAddr, const T& wert, int laenge = 0) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  // Wunschlänge gesetzt und passt in Variable rein
  if ((laenge > 0) && (laenge < len)) len = laenge;
  orig = len;
  // Solange Bytes zu holen sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > TWI_LENGTH) cnt = TWI_LENGTH;
    // Schreiben
    F_RAM_read (p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// Hilfsfunktion für Hexdarstellung
// Puffer, Wert, Stellenzahl (2 oder 4), Ein Blank wird voran gestellt
char *fillHex(char *buf, uint16_t val, uint8_t len) {
  uint16_t m;
  byte str, t;

  if (len == 4) {
    //Adresse
    str = 5;
    buf[0] = ' ';
    for (byte i = 1; i < 5; i++) buf[i] = '0';
  }
  else {
    // Byte
    str = 3;
    buf[0] = ' ';
    buf[1] = '0';
  }
  buf[str] = '\0';
  do {
    m = val;
    val /= 16;
    char c = m - 16 * val;
    buf[--str] = c < 10 ? c + '0' : c + 'A' - 10;
  } while (val);
  return buf;
}

// Anzeige des Fram im angegebenen Bereich Hex und als (druckbares) Zeichen
void dumpFram(uint16_t von, uint16_t bis) {
  // Hexformatierer
  char buf[6];
  //Lesepuffer
  byte readBuffer[16];
  // Zeichenpuffer
  char zbuffer[17];
  uint16_t start;
  uint8_t len = 16;
  start = von;

  Serial.print("FRAM Dump von "); Serial.print(fillHex(buf, von, 4));
  Serial.print(" bis "); Serial.println(fillHex(buf, bis, 4));
  while (start <= bis) {
    memset(zbuffer, 0, 17); // leeren
    if ((bis - start) < 16) len = bis - start + 1;
    fRamRead(start, readBuffer, len);
    Serial.print(fillHex(buf, start, 4)); // Adresse
    for (byte i = 0; i < len; i++) {
      Serial.print(fillHex(buf, readBuffer[i], 2));
      if ((readBuffer[i] < 32) || (readBuffer[i] > 126)) zbuffer[i] = '.';
      else zbuffer[i] = readBuffer[i];  // druckbare Zeichen
    }
    // Wenn letzte Zeile < 16, dann auffüllen
    if (len < 16) {
      for (byte i = 0; i < (16 - len); i++) Serial.print("   ");
    }
    Serial.print("   "); Serial.println(zbuffer);
    start += 16;
  }
}

//Füllen des Fram mit einem bestimmten Zeichen in einem Bereich
void fillFram(uint16_t von, uint16_t bis, uint8_t val) {
  // Hexformatierer
  char buf[6];
  byte writeBuffer[16];
  uint16_t start;
  uint8_t len = 16;
  start = von;
  memset(writeBuffer, val, 16);
  Serial.print("FRAM schreiben von "); Serial.print(fillHex(buf, von, 4));
  Serial.print(" bis "); Serial.print(fillHex(buf, bis, 4));
  Serial.print(" mit "); Serial.println(fillHex(buf, val, 2));
  len = 0;
  while (start <= bis) {
    if ((bis - start) < 16) {
      len = bis - start + 1;
      F_RAM_write (writeBuffer, len, start);
    }
    else fRamWrite(start, writeBuffer);
    start += 16;
  }
}

und die fRam2.h
Code:
// Mit Anleihen bei rkuehle (Template), Rob Tillaart (I2C_EEPROM library), Ardu_Arne (FRAM), Tommy56 (fRam.h) und Arduino core (HEX)
// Handling für FRAM Bausteine 16 KBit (1 Adressbyte) und 64KBit (2 Adressbytes)
// für mehrere FRAM IC
#include <Arduino.h>
#include <Wire.h>

#if defined(ESP8266) || defined (ESP32)
#define BUFFER_LENGTH I2C_BUFFER_LENGTH
#endif

// I2C-(Basis)Adresse (Aus 0x5 wird dann die 0xC, die im Datenblatt steht)
//#define F_RAM 0x57  // auf DS3231 mit 7 gebrückt oder 0x50  


// FRAM schreiben - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_write (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  // TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++)  Wire.write(wert[i]);
    rc = Wire.endTransmission();
    //Serial.print("rc: ");Serial.println(rc);
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++) Wire.write(wert[i]);
    rc = Wire.endTransmission();
  }
  // TWBR = 72;  // 100 kHz (default)
}

// FRAM lesen - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_read (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
  // TWBR = 12;  // 400 kHz (maximum)
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(devAdr, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    // cast to int for Wirelib
    Wire.requestFrom((int)i2c_adresse, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  // TWBR = 72;  // 100 kHz (default)
}


// Schreibt beliebige Werte (auch Arrays beliebiger Typen) in den FRAM
template <class T> int fRamWrite(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  orig = len;
  // Solange Bytes zu senden sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_write (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// liest beliebige Werte aus dem FRAM . Die Länge wird von der Zielvariablen bestimmt
// optionaler Parameter laenge wird nur berücksichtigt, wenn er kleiner, als die Länge der Variablen ist

template <class T> int fRamRead(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert, int laenge = 0) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  // Wunschlänge gesetzt und passt in Variable rein
  if ((laenge > 0) && (laenge < len)) len = laenge;
  orig = len;
  // Solange Bytes zu holen sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_read (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// Hilfsfunktion für Hexdarstellung
// Puffer, Wert, Stellenzahl (2 oder 4), Ein Blank wird voran gestellt
char *fillHex(char *buf, uint16_t val, uint8_t len, boolean withBlank = true) {
  uint16_t m;
  byte str, t;

  if (len == 4) {
    //Adresse
    str = 5;
    buf[0] = ' ';
    for (byte i = 1; i < 5; i++) buf[i] = '0';
  }
  else {
    // Byte
    str = 3;
    buf[0] = ' ';
    buf[1] = '0';
  }
  buf[str] = '\0';
  do {
    m = val;
    val /= 16;
    char c = m - 16 * val;
    buf[--str] = c < 10 ? c + '0' : c + 'A' - 10;
  } while (val);
  if (!withBlank) return buf+1;
  return buf;
}

// Anzeige des Fram im angegebenen Bereich Hex und als (druckbares) Zeichen
void dumpFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis) {
  // Hexformatierer
  char buf[6];
  //Lesepuffer
  byte readBuffer[16];
  // Zeichenpuffer
  char zbuffer[17];
  uint16_t start;
  uint8_t len = 16;
  start = von;

  Serial.print("FRAM Dump I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.println(fillHex(buf, bis, 4, false));
  while (start <= bis) {
    memset(zbuffer, 0, 17); // leeren
    if ((bis - start) < 16) len = bis - start + 1;
    fRamRead(i2c_adresse, num_adressbytes, start, readBuffer, len);
    Serial.print(fillHex(buf, start, 4)); // Adresse
    for (byte i = 0; i < len; i++) {
      Serial.print(fillHex(buf, readBuffer[i], 2));
      if ((readBuffer[i] < 32) || (readBuffer[i] > 126)) zbuffer[i] = '.';
      else zbuffer[i] = readBuffer[i];  // druckbare Zeichen
    }
    // Wenn letzte Zeile < 16, dann auffüllen
    if (len < 16) {
      for (byte i = 0; i < (16 - len); i++) Serial.print("   ");
    }
    Serial.print("   "); Serial.println(zbuffer);
    start += 16;
  }
}

//Füllen des Fram mit einem bestimmten Zeichen in einem Bereich
void fillFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis, uint8_t val) {
  // Hexformatierer
  char buf[6];
  byte writeBuffer[16];
  uint16_t start;
  uint8_t len = 16;
  start = von;
  memset(writeBuffer, val, 16);
  Serial.print("FRAM schreiben I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.print(fillHex(buf, bis, 4, false));
  Serial.print(" mit 0x"); Serial.println(fillHex(buf, val, 2, false));
  len = 0;
  while (start <= bis) {
    if ((bis - start) < 16) {
      len = bis - start + 1;
      F_RAM_write (i2c_adresse, num_adressbytes, writeBuffer, len, start);
    }
    else fRamWrite(i2c_adresse, num_adressbytes, start, writeBuffer);
    start += 16;
  }
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle von mir veröffentlichten Codes unterliegen der GPL Version 3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2023, 10:41 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2023 12:04 von Tommy56.)
Beitrag #28
RE: FRAM am Arduino
Ich habe die TWBR-Zeilen für die AVR mit bedingter Kompilierung doch wieder rein genommen, da sie den Zugriff auf den FRAM dort beschleunigen (Standard war 100 kHz).
fRam.h
Code:
// Mit Anleihen bei rkuehle (Template), Rob Tillaart (I2C_EEPROM library), Ardu_Arne (FRAM), Tommy56 (fRam.h) und Arduino core (HEX)
// Handling für FRAM Bausteine 16 KBit (1 Adressbyte) und 64KBit (2 Adressbytes)
#include <Arduino.h>
#include <Wire.h>

// 1 für 16 k, 2 für 64 k
#define ADRESS_BYTES 2
#undef ESP
#if defined(ESP8266) || defined (ESP32)
#define BUFFER_LENGTH I2C_BUFFER_LENGTH
#define ESP
#endif
#define TWI_LENGTH BUFFER_LENGTH - ADRESS_BYTES

// I2C-(Basis)Adresse (Das wird dann die 0xC, die im Datenblatt steht)
#define F_RAM 0x57  // auf DS3231 mit 7 gebrückt oder 0x50  


// FRAM schreiben - Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_write (byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
#ifndef ESP
  TWBR = 12;  // 400 kHz (maximum)
#endif
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (ADRESS_BYTES == 1) {
    // 16 K
    devAdr = F_RAM | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++)  Wire.write(wert[i]);
    rc = Wire.endTransmission();
    //Serial.print("rc: ");Serial.println(rc);
  }
  else {
    // 64 K
    Wire.beginTransmission(F_RAM);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++) Wire.write(wert[i]);
    rc = Wire.endTransmission();
  }
#ifndef ESP
  TWBR = 72;  // 100 kHz (default)
#endif
  // TWBR = 72;  // 100 kHz (default)
}

// FRAM lesen - Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_read (byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
#ifndef ESP
  TWBR = 12;  // 400 kHz (maximum)
#endif
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (ADRESS_BYTES == 1) {
    // 16 K
    devAdr = F_RAM | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(devAdr, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  else {
    // 64 K
    Wire.beginTransmission(F_RAM);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(F_RAM, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
#ifndef ESP
  TWBR = 72;  // 100 kHz (default)
#endif
}


// Schreibt beliebige Werte (auch Arrays beliebiger Typen) in den FRAM
template <class T> int fRamWrite(uint16_t framAddr, const T& wert) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  orig = len;
  // Solange Bytes zu senden sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > TWI_LENGTH) cnt = TWI_LENGTH;
    // Schreiben
    F_RAM_write (p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// liest beliebige Werte aus dem FRAM . Die Länge wird von der Zielvariablen bestimmt
// optionaler Parameter laenge wird nur berücksichtigt, wenn er kleiner, als die Länge der Variablen ist

template <class T> int fRamRead(uint16_t framAddr, const T& wert, int laenge = 0) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  // Wunschlänge gesetzt und passt in Variable rein
  if ((laenge > 0) && (laenge < len)) len = laenge;
  orig = len;
  // Solange Bytes zu holen sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > TWI_LENGTH) cnt = TWI_LENGTH;
    // Schreiben
    F_RAM_read (p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// Hilfsfunktion für Hexdarstellung
// Puffer, Wert, Stellenzahl (2 oder 4), Ein Blank wird voran gestellt
char *fillHex(char *buf, uint16_t val, uint8_t len) {
  uint16_t m;
  byte str, t;

  if (len == 4) {
    //Adresse
    str = 5;
    buf[0] = ' ';
    for (byte i = 1; i < 5; i++) buf[i] = '0';
  }
  else {
    // Byte
    str = 3;
    buf[0] = ' ';
    buf[1] = '0';
  }
  buf[str] = '\0';
  do {
    m = val;
    val /= 16;
    char c = m - 16 * val;
    buf[--str] = c < 10 ? c + '0' : c + 'A' - 10;
  } while (val);
  return buf;
}

// Anzeige des Fram im angegebenen Bereich Hex und als (druckbares) Zeichen
void dumpFram(uint16_t von, uint16_t bis) {
  // Hexformatierer
  char buf[6];
  //Lesepuffer
  byte readBuffer[16];
  // Zeichenpuffer
  char zbuffer[17];
  uint16_t start;
  uint8_t len = 16;
  start = von;

  Serial.print("FRAM Dump von "); Serial.print(fillHex(buf, von, 4));
  Serial.print(" bis "); Serial.println(fillHex(buf, bis, 4));
  while (start <= bis) {
    memset(zbuffer, 0, 17); // leeren
    if ((bis - start) < 16) len = bis - start + 1;
    fRamRead(start, readBuffer, len);
    Serial.print(fillHex(buf, start, 4)); // Adresse
    for (byte i = 0; i < len; i++) {
      Serial.print(fillHex(buf, readBuffer[i], 2));
      if ((readBuffer[i] < 32) || (readBuffer[i] > 126)) zbuffer[i] = '.';
      else zbuffer[i] = readBuffer[i];  // druckbare Zeichen
    }
    // Wenn letzte Zeile < 16, dann auffüllen
    if (len < 16) {
      for (byte i = 0; i < (16 - len); i++) Serial.print("   ");
    }
    Serial.print("   "); Serial.println(zbuffer);
    start += 16;
  }
}

//Füllen des Fram mit einem bestimmten Zeichen in einem Bereich
void fillFram(uint16_t von, uint16_t bis, uint8_t val) {
  // Hexformatierer
  char buf[6];
  byte writeBuffer[16];
  uint16_t start;
  uint8_t len = 16;
  start = von;
  memset(writeBuffer, val, 16);
  Serial.print("FRAM schreiben von "); Serial.print(fillHex(buf, von, 4));
  Serial.print(" bis "); Serial.print(fillHex(buf, bis, 4));
  Serial.print(" mit "); Serial.println(fillHex(buf, val, 2));
  len = 0;
  while (start <= bis) {
    if ((bis - start) < 16) {
      len = bis - start + 1;
      F_RAM_write (writeBuffer, len, start);
    }
    else fRamWrite(start, writeBuffer);
    start += 16;
  }
}

fRam2.h
Code:
// Mit Anleihen bei rkuehle (Template), Rob Tillaart (I2C_EEPROM library), Ardu_Arne (FRAM), Tommy56 (fRam.h) und Arduino core (HEX)
// Handling für FRAM Bausteine 16 KBit (1 Adressbyte) und 64KBit (2 Adressbytes)
// für mehrere FRAM IC
#include <Arduino.h>
#include <Wire.h>

#undef ESP
#if defined(ESP8266) || defined (ESP32)
#define BUFFER_LENGTH I2C_BUFFER_LENGTH
#define ESP
#endif

// I2C-(Basis)Adresse (Aus 0x5 wird dann die 0xC, die im Datenblatt steht)
//#define F_RAM 0x57  // auf DS3231 mit 7 gebrückt oder 0x50  


// FRAM schreiben - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_write (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
#ifndef ESP
  TWBR = 12;  // 400 kHz (maximum)
#endif
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++)  Wire.write(wert[i]);
    rc = Wire.endTransmission();
    //Serial.print("rc: ");Serial.println(rc);
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    for (byte i = 0; i < numbytes; i++) Wire.write(wert[i]);
    rc = Wire.endTransmission();
  }
#ifndef ESP
  TWBR = 72;  // 100 kHz (default)
#endif
}

// FRAM lesen - I2C-Adresse, Anzahl Adressbytes (1=16kB oder 2), Variable, anzahl Bytes, Adresse im FRAM
void F_RAM_read (byte i2c_adresse, byte num_adressbytes, byte* wert, int numbytes, uint16_t framAddr) {
  int devAdr, rc;
#ifndef ESP
  TWBR = 12;  // 400 kHz (maximum)
#endif
  // Adressierungsart 1 -> 3 Bit in Adresse
  if (num_adressbytes == 1) {
    // 16 K
    devAdr = i2c_adresse | framAddr >> 8;
    Wire.beginTransmission(devAdr);
    Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    Wire.requestFrom(devAdr, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
  else {
    // 64 K
    Wire.beginTransmission(i2c_adresse);
    Wire.write(framAddr >> 8);  Wire.write(framAddr & 0xFF);
    rc = Wire.endTransmission();
    // cast to int for Wirelib
    Wire.requestFrom((int)i2c_adresse, numbytes);
    for (byte i = 0; i < numbytes; i++) wert[i] = Wire.read();
  }
#ifndef ESP
  TWBR = 72;  // 100 kHz (default)
#endif
}


// Schreibt beliebige Werte (auch Arrays beliebiger Typen) in den FRAM
template <class T> int fRamWrite(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  orig = len;
  // Solange Bytes zu senden sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_write (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// liest beliebige Werte aus dem FRAM . Die Länge wird von der Zielvariablen bestimmt
// optionaler Parameter laenge wird nur berücksichtigt, wenn er kleiner, als die Länge der Variablen ist

template <class T> int fRamRead(byte i2c_adresse, byte num_adressbytes, uint16_t framAddr, const T& wert, int laenge = 0) {
  byte* p = (byte*)(void*)&wert;
  int16_t len, cnt, orig;
  len = sizeof(wert);
  byte twi_length = BUFFER_LENGTH - num_adressbytes;
  // Wunschlänge gesetzt und passt in Variable rein
  if ((laenge > 0) && (laenge < len)) len = laenge;
  orig = len;
  // Solange Bytes zu holen sind
  while (len > 0) {
    cnt = len;
    // Wenn  länger als TWI-Buffer - Adresslänge, dann begrenzen
    if (cnt > twi_length) cnt = twi_length;
    // Schreiben
    F_RAM_read (i2c_adresse, num_adressbytes, p, cnt, framAddr);
    // Restbytes berechnen
    len -= cnt;
    // neue FRAM-Adresse
    framAddr += cnt;
    // neue Quelladresse
    p += cnt;
  }
  return orig;
}

// Hilfsfunktion für Hexdarstellung
// Puffer, Wert, Stellenzahl (2 oder 4), Ein Blank wird voran gestellt
char *fillHex(char *buf, uint16_t val, uint8_t len, boolean withBlank = true) {
  uint16_t m;
  byte str, t;

  if (len == 4) {
    //Adresse
    str = 5;
    buf[0] = ' ';
    for (byte i = 1; i < 5; i++) buf[i] = '0';
  }
  else {
    // Byte
    str = 3;
    buf[0] = ' ';
    buf[1] = '0';
  }
  buf[str] = '\0';
  do {
    m = val;
    val /= 16;
    char c = m - 16 * val;
    buf[--str] = c < 10 ? c + '0' : c + 'A' - 10;
  } while (val);
  if (!withBlank) return buf+1;
  return buf;
}

// Anzeige des Fram im angegebenen Bereich Hex und als (druckbares) Zeichen
void dumpFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis) {
  // Hexformatierer
  char buf[6];
  //Lesepuffer
  byte readBuffer[16];
  // Zeichenpuffer
  char zbuffer[17];
  uint16_t start;
  uint8_t len = 16;
  start = von;

  Serial.print("FRAM Dump I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.println(fillHex(buf, bis, 4, false));
  while (start <= bis) {
    memset(zbuffer, 0, 17); // leeren
    if ((bis - start) < 16) len = bis - start + 1;
    fRamRead(i2c_adresse, num_adressbytes, start, readBuffer, len);
    Serial.print(fillHex(buf, start, 4)); // Adresse
    for (byte i = 0; i < len; i++) {
      Serial.print(fillHex(buf, readBuffer[i], 2));
      if ((readBuffer[i] < 32) || (readBuffer[i] > 126)) zbuffer[i] = '.';
      else zbuffer[i] = readBuffer[i];  // druckbare Zeichen
    }
    // Wenn letzte Zeile < 16, dann auffüllen
    if (len < 16) {
      for (byte i = 0; i < (16 - len); i++) Serial.print("   ");
    }
    Serial.print("   "); Serial.println(zbuffer);
    start += 16;
  }
}

//Füllen des Fram mit einem bestimmten Zeichen in einem Bereich
void fillFram(byte i2c_adresse, byte num_adressbytes, uint16_t von, uint16_t bis, uint8_t val) {
  // Hexformatierer
  char buf[6];
  byte writeBuffer[16];
  uint16_t start;
  uint8_t len = 16;
  start = von;
  memset(writeBuffer, val, 16);
  Serial.print("FRAM schreiben I2C-Adresse: 0x"); Serial.print(fillHex(buf,i2c_adresse,2, false)); Serial.print(" von 0x"); Serial.print(fillHex(buf, von, 4, false));
  Serial.print(" bis 0x"); Serial.print(fillHex(buf, bis, 4, false));
  Serial.print(" mit 0x"); Serial.println(fillHex(buf, val, 2, false));
  len = 0;
  while (start <= bis) {
    if ((bis - start) < 16) {
      len = bis - start + 1;
      F_RAM_write (i2c_adresse, num_adressbytes, writeBuffer, len, start);
    }
    else fRamWrite(i2c_adresse, num_adressbytes, start, writeBuffer);
    start += 16;
  }
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle von mir veröffentlichten Codes unterliegen der GPL Version 3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2023, 17:34
Beitrag #29
RE: FRAM am Arduino
Hallo
Nach dem Kompilieren der fRam.ino/fRam.h in der IDE 1.8.19 mit Wemos D1 Mini ESP32 und der RTC DS3231 mit dem AT24C32 an 0x57
Sieht die Ausgabe in der Konsole für mich merkwürdig aus, ist das ein Denkfehler von mir oder ist das so OK
Das gleiche trift auch für die Kombination mit der fRam2.ino/fRam2.h zu.

Hier die log mit fRam2.ino/fRam2.h
Code:
16:35:55.995 -> Start
16:35:56.989 -> FRAM schreiben I2C-Adresse: 0x57 von 0x0000 bis 0x00FF mit 0xAA
16:35:56.989 -> Buffer Schreiben :
16:35:58.017 -> Buffer Lesen :⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮
16:35:58.017 -> FRAM Dump I2C-Adresse: 0x57 von 0x0000 bis 0x01FF
16:35:58.017 ->  0000 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA   ................
16:35:58.017 ->  0010 51 52 53 54 55 56 57 58 59 5A FF FF FF FF FF FF   QRSTUVWXYZ......
16:35:58.017 ->  0020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0070 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.061 ->  0090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.083 ->  00A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.083 ->  00B0 AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA   ................
16:35:58.083 ->  00C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.083 ->  00D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.116 ->  00E0 36 37 38 39 30 00 FF FF FF FF FF FF FF FF FF FF   67890...........
16:35:58.116 ->  00F0 FF FF FF FF FF FF FF FF FF FF FF 31 32 33 34 35   ...........12345
16:35:58.116 ->  0100 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.116 ->  0110 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.116 ->  0120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.116 ->  0130 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.116 ->  0140 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.149 ->  0150 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.149 ->  0160 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.149 ->  0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:35:58.183 ->  0180 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  0190 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  01A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  01B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  01C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  01D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.183 ->  01E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
16:35:58.216 ->  01F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
#
fillFram(0x57, 2, 0x00,0x1f,0);
16:41:30.760 -> FRAM schreiben I2C-Adresse: 0x57 von 0x0000 bis 0x001F mit 0x00
16:41:31.788 -> FRAM Dump I2C-Adresse: 0x57 von 0x0000 bis 0x01FF
16:41:31.788 ->  0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:41:31.788 ->  0010 51 52 53 54 55 56 57 58 59 5A FF FF FF FF FF FF   QRSTUVWXYZ......
#
fillFram(0x57, 1, 0x00,0x1f,0);
16:42:47.942 -> FRAM schreiben I2C-Adresse: 0x57 von 0x0000 bis 0x001F mit 0x00
16:42:48.937 -> FRAM Dump I2C-Adresse: 0x57 von 0x0000 bis 0x01FF
16:42:48.937 ->  0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:42:48.937 ->  0010 51 52 53 54 55 56 57 58 59 5A FF FF FF FF FF FF   QRSTUVWXYZ......
#
fillFram(0x57, 2, 0x10,0x1f,0);
16:44:33.427 -> FRAM schreiben I2C-Adresse: 0x57 von 0x0010 bis 0x001F mit 0x00
16:44:34.422 -> FRAM Dump I2C-Adresse: 0x57 von 0x0000 bis 0x01FF
16:44:34.422 ->  0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:44:34.422 ->  0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:44:34.455 ->  0020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................
#
fillFram(0x57, 2, 0x10,0x2f,0);
16:46:03.611 -> FRAM schreiben I2C-Adresse: 0x57 von 0x0010 bis 0x002F mit 0x00
16:46:04.639 -> FRAM Dump I2C-Adresse: 0x57 von 0x0000 bis 0x01FF
16:46:04.639 ->  0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:46:04.639 ->  0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
16:46:04.639 ->  0020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   ................

Bei Bedarf kann ich die log mit fRam.ino/fRam.h auch liefern.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2023, 17:48 (Dieser Beitrag wurde zuletzt bearbeitet: 12.11.2023 17:51 von Tommy56.)
Beitrag #30
RE: FRAM am Arduino
Der AT24C32 ist aber ein EEPROM und kein FRAM! Die haben ein ganz anderes Zeitverhalten. Für die ist die Lib nicht gedacht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle von mir veröffentlichten Codes unterliegen der GPL Version 3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2023, 17:56
Beitrag #31
RE: FRAM am Arduino
(12.11.2023 17:48)Tommy56 schrieb:  Der AT24C32 ist aber ein EEPROM und kein FRAM! Die haben ein ganz anderes Zeitverhalten. Für die ist die Lib nicht gedacht.

Gruß Tommy

Ok Danke dann werde ich auf die FRAMs warten und nochmal Testen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2023, 18:03
Beitrag #32
RE: FRAM am Arduino
Wie bereits geschrieben, die Lib ist am ESP nicht getestet. Da müsstest Du dann evtl. einige Tests durchführen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle von mir veröffentlichten Codes unterliegen der GPL Version 3
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  FRAM als nicht flüchtiger Datenspeicher bei Stromunterbrechungen oder Deep-Sleep jahnbes 12 6.087 04.03.2023 13:21
Letzter Beitrag: hotsystems
  Betriebsstundenzähler mit Arduino und FRAM Ralf992 45 15.623 04.10.2022 20:48
Letzter Beitrag: Bitklopfer
  FRAM Speichergröße Fragen rev.antun 30 7.966 14.03.2021 22:59
Letzter Beitrag: Tommy56
  Arduino Mega 2560 vs Arduino DUE Batucada 24 22.359 11.07.2020 15:46
Letzter Beitrag: Tommy56
  LCD Anzeige für Arduino Mega2560 an Arduino Due? DaniDD 1 8.183 03.06.2015 12:16
Letzter Beitrag: DaniDD
  Arduino Pin mit anderem Arduino auslesen - geht das? Gelegenheitsbastler 8 15.116 08.05.2015 20:49
Letzter Beitrag: Bitklopfer
  Original Arduino MEGA 2560 und Original Arduino TFT LCD screen funzt nicht Odiug 6 11.329 12.12.2014 15:28
Letzter Beitrag: Odiug
  Arduino XBee mit XBee Arduino Werte versenden th3Khem 2 8.337 23.08.2013 10:12
Letzter Beitrag: th3Khem
Question Arduino Mega ADK oder Arduino Due? Baja-Junky 1 16.471 14.08.2013 21:16
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste