Forum: Mikrocontroller und Digitale Elektronik FM25W256 funktioniert nicht


von T800w (Gast)


Angehängte Dateien:

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) {

}

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Wolfgang (Gast)


Lesenswert?

T800w schrieb:
> https://learn.adafruit.com/adafruit-spi-fram-breakout/wiring-and-test).

Das 2.te Bild (Arduino Wiring) ist falsch
Der VCC-Anschluss darf nicht an Gnd (s. Bildunterschrift)

von T800w (Gast)


Lesenswert?

@Wolfgang

Genau, das habe ich auch nicht so übernommen, klappt aber trotzdem 
nicht.

von T800w (Gast)


Lesenswert?

@Rufus

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

von holger (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

T800w schrieb:
> Ich weiß auch nicht, was ich jetzt noch versuchen kann.

Da ist systematische Vorgehensweise gefragt.

Prüfe, ob die Signale auf dem SPI (SCK, MOSI) ordentlich aussehen und 
gucke nach, ob und wie das F-RAM auf MISO reagiert.

von holger (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von T800w (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> 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.

Tut mir leid ich hatte mich verschrieben, ich meinte ursprünglich WP.

von T800w (Gast)


Angehängte Dateien:

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.

von holger (Gast)


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.

von T800w (Gast)


Angehängte Dateien:

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.

von A. B. (Gast)


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.

von T800w (Gast)


Lesenswert?

@A.B

Das Programm läuft zwar komplett ab, wie man es auch im Serial Monitor 
Bild (Anhang) sieht.
Aber das Programm kann nur lesen anstatt lesen und schreiben.

von A. B. (Gast)


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.

von Dumpfbacke (Gast)


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.

von T800w (Gast)


Lesenswert?

Er funktioniert jetzt, danke!

von A. B. (Gast)


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 :-(

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.