FM25W256 funktioniert nicht

Gast #5159309
Lesenswert?

Hallo,
im Anhang finden Sie ein Datasheet zum 25fm256. Ich habe den fm25w256 
auf eine Platine gelötet und alle Pins mit der Platine ohne weitere 
Schaltungselemente (Pull-UP/ -DOWN, etc.) verbunden. Dabei sind der HOLD 
sowie der WP PIN nicht mit der Platine verbunden (wie auf dem 2. Bild 
von 
https://learn.adafruit.com/adafruit-spi-fram-breakout/wiring-and-test).
Ich habe ebenfalls die MISO, MOSI und SCK PINs mit den dort angegebenen 
Arduino Pins verbunden. Ich habe dann versucht den dort gezeigten 
Sketch-Code MB85RS64V (vgl. Bild 3) hochzuladen, was alles perfekt 
funktioniert hat. Doch das Serielle Kommunikations Fenster zeigt nur "No 
FRAM found, check your Connections...". Ich weiß auch nicht, was ich 
jetzt noch versuchen kann.

Hier der Code:

#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

/* Example code for the Adafruit SPI FRAM breakout */
uint8_t FRAM_CS = 10;

//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware 
SPI

uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 11;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, 
FRAM_MOSI, FRAM_CS);

uint16_t          addr = 0;

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using 
programming port to program the Zero!
   #define Serial SerialUSB
#endif

void setup(void) {
  #ifndef ESP8266
    while (!Serial);     // will pause Zero, Leonardo, etc until serial 
console opens
  #endif

  Serial.begin(9600);

  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }

  // Read the first byte
  uint8_t test = fram.read8(0x0);
  Serial.print("Restarted "); Serial.print(test); Serial.println(" 
times");

  // Test write ++
  fram.writeEnable(true);
  fram.write8(0x0, test+1);
  fram.writeEnable(false);

  fram.writeEnable(true);
  fram.write(0x1, (uint8_t *)"FTW!", 5);
  fram.writeEnable(false);

  // dump the entire 8K of memory!
  uint8_t value;
  for (uint16_t a = 0; a < 8192; a++) {
    value = fram.read8(a);
    if ((a % 32) == 0) {
      Serial.print("\n 0x"); Serial.print(a, HEX); Serial.print(": ");
    }
    Serial.print("0x");
    if (value < 0x1)
      Serial.print('0');
    Serial.print(value, HEX); Serial.print(" ");
  }
}

void loop(void) {

}
Angehängte Dateien:
Persönliche Seite #5159316
Lesenswert?

T800w schrieb:
> Dabei sind der HOLD sowie der WP PIN nicht mit der Platine verbunden

Das sind beides Eingänge. Offene Eingänge sind ein Fehler, die nehmen 
dann nämlich keinen definierten Pegel an.

> (wie auf dem 2. Bild von ...)

Da kann man die Platine erkennen, auf der ein Widerstand verbaut ist. 
Und der verbindet /HOLD mit VCC, ist also ein Pullup.

Mindestens den solltest Du in Deiner Schaltung auch vorsehen, oder den 
/HOLD-Pin direkt mit VCC verbinden, wenn sicher ist, daß Du den niemals 
benutzen willst.
Gast #5159341
Lesenswert?

Die Device ID vom MB85RS64V Fram wird eine andere sein
als vom FM25W256. Deshalb kommt vermutlich "No SPI FRAM found".
Schau mal in fram.begin() rein. Da wird vermutlich irgendwo
die Device ID gelesen. Dort musst du dann deine ID eintragen.
Gast #5159362
Lesenswert?

>Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu
>ziehen, hat aber beides nicht funktioniert.

CS darf nicht dauerhaft an VCC. Wenn schon dann GND weil es low aktiv 
ist. Aber das muss von einem Pin angesteuert werden, sonst geht gar nix.
Persönliche Seite #5159363
Lesenswert?

T800w schrieb:
> Das habe ich schon probiert, CS und HOLD gleichzeichtig auf VCC zu
> ziehen

Jetzt ist plötzlich von /CS die Rede. Wenn Du /CS auf VCC-Pegel legst, 
ist das IC dauerhaft deaktiviert.

Wie wäre es, wenn Du Dir erst mal in Ruhe das Datenblatt durchliest, 
welches der verschiedenen Eingangssignale welche Bedeutung hat?

Auf Seite 3 sind sie alle recht schön beschrieben.
Gast #5159391
Lesenswert?

@holger
> Die Device ID vom MB85RS64V Fram wird eine andere sein
> als vom FM25W256. Deshalb kommt vermutlich "No SPI FRAM found".
> Schau mal in fram.begin() rein. Da wird vermutlich irgendwo
> die Device ID gelesen. Dort musst du dann deine ID eintragen.

Im Anhang finden Sie eine Tabelle mit verschiedenen FRAMs. Wenn ich die 
Tabelle richtig Interpretiere liegt für den fm25w256 kein Device ID vor, 
soll ich dann die Device ID aus dem fram.begin() komplett entfernen odr 
gibt es noch andere Wege.
Angehängte Dateien:
Gast #5159397
Lesenswert?

>liegt für den fm25w256 kein Device ID vor,

Das Teil hat tatsächlich keine.

>soll ich dann die Device ID aus dem fram.begin() komplett entfernen oder
>gibt es noch andere Wege.

Das musst du wohl.
Gast #5161983
Lesenswert?

Hallo,
ich habe jetzt ein eigenes Programm geschrieben(siehe Anhang), aber auch 
das Funktioniert nicht. Ziel des Programms ist es das Statusregister zu 
lesen und es umzuschreiben, damit ich den FRAM Speicher beschreiben und 
lesen kann. Das Programm kann das Statusregister und den allgemeinen 
Speicher lesen aber in beiden fällen nicht beschreiben, obwohl das 
Programm so ausgelegt ist. Hat jemand eine Idee woran das liegen könnte.

Nötige Kommentare sind im Skript enthalten, bei Fragen einfach melden.
Angehängte Dateien:
Gast #5162227
Lesenswert?

T800w schrieb:

> lesen kann. Das Programm kann das Statusregister und den allgemeinen
> Speicher lesen aber in beiden fällen nicht beschreiben, obwohl das
> Programm so ausgelegt ist. Hat jemand eine Idee woran das liegen könnte.

Wie äußert sich, dass es das nicht kann? Wiehert das Programm, oder 
pfeift es? Es wäre hilfreich, das Problem halbwegs vernünftig zu 
beschreiben. Ein "geht nicht" ist absolut nichtssagend.

Zur Info: Fallende Flanke an /CS startet ein neues Kommando, beendet 
wird die Sequenz (Kommando und event. Daten) mit der steigenden Flanke 
von /CS.

Also: /CS auf Low, WREN-Kommando herausschieben, /CS auf High, dann z. 
B. /CS wieder auf Low, WRITE-Kommando, Adressebytes und Daten-Bytes 
herausschieben, /CS auf High.

Zwischen dem WREN-Kommando und WRITE-Kommando (oder was immer ...) muss 
/CS mal auf High gehen!

Zum Testen sollte man vielleicht erst nur WREN senden, danach 
(zwischendurch /CS auf High nicht vergessen) das Statusregister lesen, 
um festzustellen, ob das WE-Bit gesetzt wurde.
Gast #5162273
Lesenswert?

> Wie wäre es, wenn Du Dir erst mal in Ruhe das Datenblatt durchliest,
> welches der verschiedenen Eingangssignale welche Bedeutung hat?
>
> Auf Seite 3 sind sie alle recht schön beschrieben.

Hm, manche Leute sind halt beratungsresistent. Mehr als das und mein 
Hinweis auf das /CS (findet man schön in Fig. 6 und Fig. 10) kann man 
wohl nicht machen ..., seufz. Anscheinend ist die Erwartungshaltung 
wohl, dass jemand eine korrekte Version zum Copy&Paste hier einstellt.
Gast #5162278
Lesenswert?

T800w schrieb:
> Aber das Programm kann nur lesen anstatt lesen und schreiben.

Hallo Beratungsresistenter, das hier funktioniert nicht:
1
void framWrenWrite(int CS, byte Adress_1, byte Adress_2, int framWriteData)
2
{
3
  digitalWrite(CS, LOW);
4
  SPI.transfer(OPCODE_WREN);       //WREN-OP-CODE
5
  SPI.transfer(OPCODE_WRITE);      //WRITE-OP-CODE
6
  SPI.transfer(Adress_1);          //Speicheradresse wird gesendet
7
  SPI.transfer(Adress_2);          //Speicheradresse wird gesendet
8
  SPI.transfer(framWriteData);     //FRAM speichert Daten
9
  digitalWrite(CS, HIGH);
10
}

da man nicht zwei Opcodes hintereinander senden kann wie
A. B. bereits beschrieben hat.
Gast #5163963
Lesenswert?

Schön, dass es jetzt geht.

Da der betreffende Chip (ebenso wie die meisten EEPROMs) leider keine 
auslesbare Chip-Id hat, ist es durchaus sinnvoll, vor und nach einem 
WREN das Statusregister zu lesen und zu kontrollieren, ob vorher Bit 0 
gelöscht und hinterher Bit 1 (das WE-Bit) dann auch gesetzt ist. Damit 
weiß man, dass tatsächlich "wer da" ist.

Bit 0 ist bei diesem Chip zwar immer 0, bei EEPROMs ist's aber das 
BUSY-Bit.
Baut man die Abfrage mit Warteschleife ein, kann man problemlos mal 
wechseln ...

Nur ob man 2 oder 3 Adressbytes braucht, findet man leider nicht 
automatisch heraus :-(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren