www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nand Flash auslesen Atmega 328[Arduino]


Autor: Reinhard Joswig (xaptor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte gestern mal versuchen mit dem Arduino (Atmega 328) einen Nand 
Flash auszulesen. Leider habe ich kein Datenblatt zum Flash Chip 
allerdings scheinen die Standard Tsop48 aus den USB Sticks ja kompatibel 
zu sein oder sehe ich das falsch? Also habe ich einfach auf gut Glück 
auf ein Samsung Datenblatt zurückgegriffen und erstmal versucht die 
Manufacturer und Device ID auszulesen erhalte aber beidesmal 0xFF 
zurück. Würde mich freuen wenn jemand mal einen Blick über meinen Code 
werfen kann und evtl. den Fehler findet.


// Pin Setup
int datapin[8];

int we = 5;
int ale = 4;
int cle = 3;
int re = 14;
int ce = 15;
int rb = 16;

// Vars Setup
int inByte = 0;
unsigned char buffer[528];

void setup()
{
  for(int i=0;i++;i<=7)
  {
    datapin[i] = 6 + i;
  }

  pinMode(we, OUTPUT);
  pinMode(ale, OUTPUT);
  pinMode(cle, OUTPUT);
  pinMode(re, OUTPUT);
  pinMode(ce, OUTPUT);

  digitalWrite(we, LOW);
  digitalWrite(ale, LOW);
  digitalWrite(cle, LOW);
  digitalWrite(re, LOW);
  digitalWrite(ce, LOW);

  ioip();

  // Serial Setup
  Serial.begin(9600);
  Serial.println("NAND Flash Reader v1.0");
}

void ioop()
{
  for(int i=0;i++;i<=7)
  {
    pinMode(datapin[i], OUTPUT);
    digitalWrite(datapin[i], LOW);
  }
}

void ioip()
{
  for(int i=0;i++;i<=7)
  {
    pinMode(datapin[i], INPUT);
  }
}

void ASSERT_WE() {digitalWrite(we, HIGH);}
void DEASSERT_WE() {digitalWrite(we, LOW);}

void ASSERT_ALE() {digitalWrite(ale, HIGH);}
void DEASSERT_ALE() {digitalWrite(ale, LOW);}

void ASSERT_CLE() {digitalWrite(cle, HIGH);}
void DEASSERT_CLE() {digitalWrite(cle, LOW);}

void ASSERT_RE() {digitalWrite(re, HIGH);}
void DEASSERT_RE() {digitalWrite(re, LOW);}

void ASSERT_CE() {digitalWrite(ce, HIGH);}
void DEASSERT_CE() {digitalWrite(ce, LOW);}

void SendCommand(byte cmdByte)
{
  ASSERT_CLE();
  WriteByte(cmdByte);
  DEASSERT_CLE();
}

void SendAddress(byte addByte)
{
  ASSERT_ALE();
  WriteByte(addByte);
  DEASSERT_ALE();
}

void WriteByte(byte outByte)
{
  byte mask = 1;
  int i = 7;
  Serial.println();
  for (mask = 10000000; mask>0; mask >>= 1) {
    if (outByte & mask) {
      digitalWrite(datapin[i], HIGH);
      Serial.print("1");
    }
    else {
      digitalWrite(datapin[i], LOW);
      Serial.print("0");
    }
    i--;
  }
  Serial.println();
  ASSERT_WE();
  DEASSERT_WE();
}

void ReadByte(int length)
{
  int bytecount = 0;
  int pin = 7;
  unsigned char tempByte;

  while(bytecount < length) {
    ASSERT_RE();
    /*for (char bit = 0; bit < 8; bit++) {
      tempByte = tempByte << 1;
      tempByte = tempByte & 0xfe;
      tempByte = tempByte | (digitalRead(datapin[pin]));
      pin--;
    } */
    // Debug
    for (int i = 0; i<8;i++) {
    if (digitalRead(datapin[i]) == HIGH) {
      Serial.print("1");
    }
    else {
      Serial.print("0");
    }
    }

    pin = 7;
    buffer[bytecount] = tempByte;
    bytecount++;
    delay(10);
    DEASSERT_RE();
  }
}

void loop()
{
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    Serial.println("send: ");
    Serial.print(inByte, BYTE);
    if (inByte == 'R') {
      Serial.println("Reading...");
      readDeviceID();
      Serial.println("Done!");
    }
  }
}

void readDeviceID()
{
   ioop();
   delay(5);
   ASSERT_CE();
   delay(1);
   SendCommand(0x90);
   SendAddress(0x00);
   ioip();
   delay(5);
   ReadByte(2); // 2 Bytes einlesen 1 = Manufacturer ID, 2= Device ID
   DEASSERT_CE();

   Serial.print("Manufacturer ID: ");
   Serial.println(buffer[0], HEX);
   Serial.print("Device ID: ");
   Serial.println(buffer[1], HEX);
}

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab nicht alles angeguckt, aber die for schleife im setup ist glaub 
ich falsch...

Autor: Reinhard Joswig (xaptor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHH wie blöd, tja 4 Augen sehen mehr als 2. Danke Dir.

Autor: Reinhard Joswig (xaptor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm leider ist immernoch ein Wurm drin.

// Pin Setup
int datapin[8];

int we = 5;
int ale = 4;
int cle = 3;
int re = 14;
int ce = 15;
int rb = 16;

// Vars Setup
int inByte = 0;
unsigned char buffer[528];

void setup()
{
  for(int i=0;i<8;i++)
  {
    datapin[i] = 6 + i;
  }

  pinMode(we, OUTPUT);
  pinMode(ale, OUTPUT);
  pinMode(cle, OUTPUT);
  pinMode(re, OUTPUT);
  pinMode(ce, OUTPUT);

  digitalWrite(we, LOW);
  digitalWrite(ale, LOW);
  digitalWrite(cle, LOW);
  digitalWrite(re, LOW);
  digitalWrite(ce, LOW);

  ioip();

  // Serial Setup
  Serial.begin(9600);
  Serial.println("NAND Flash Reader v1.0");
}

void ioop()
{
  for(int i=0;i<8;i++)
  {
    pinMode(datapin[i], OUTPUT);
    digitalWrite(datapin[i], LOW);
  }
}

void ioip()
{
  for(int i=0;i<8;i++)
  {
    pinMode(datapin[i], INPUT);
  }
}

void ASSERT_WE() {digitalWrite(we, HIGH);}
void DEASSERT_WE() {digitalWrite(we, LOW);}

void ASSERT_ALE() {digitalWrite(ale, HIGH);}
void DEASSERT_ALE() {digitalWrite(ale, LOW);}

void ASSERT_CLE() {digitalWrite(cle, HIGH);}
void DEASSERT_CLE() {digitalWrite(cle, LOW);}

void ASSERT_RE() {digitalWrite(re, HIGH);}
void DEASSERT_RE() {digitalWrite(re, LOW);}

void ASSERT_CE() {digitalWrite(ce, HIGH);}
void DEASSERT_CE() {digitalWrite(ce, LOW);}

void SendCommand(byte cmdByte)
{
  ASSERT_CLE();
  WriteByte(cmdByte);
  DEASSERT_CLE();
}

void SendAddress(byte addByte)
{
  ASSERT_ALE();
  WriteByte(addByte & 0x000000FF);
  DEASSERT_ALE();
}

void WriteByte(byte outByte)
{
  byte mask = 1;
  int i = 7;
  Serial.println();
  for (mask = 10000000; mask>0; mask >>= 1) {
    if (outByte & mask) {
      digitalWrite(datapin[i], HIGH);
      Serial.print("1");
    }
    else {
      digitalWrite(datapin[i], LOW);
      Serial.print("0");
    }
    i--;
  }
  Serial.println();
  ASSERT_WE();
  delay(5);
  DEASSERT_WE();
}

void ReadByte(int length)
{
  int bytecount = 0;
  int pin = 7;
  unsigned char tempByte;

  while(bytecount < length) {
    ASSERT_RE();
    /*for (char bit = 0; bit < 8; bit++) {
      tempByte = tempByte << 1;
      tempByte = tempByte & 0xfe;
      tempByte = tempByte | (digitalRead(datapin[pin]));
      pin--;
    } */
    // Debug
    for (int i = 0; i<8;i++) {
    if (digitalRead(datapin[i]) == HIGH) {
      Serial.print("1");
    }
    else {
      Serial.print("0");
    }
    }

    pin = 7;
    buffer[bytecount] = tempByte;
    bytecount++;
    delay(10);
    DEASSERT_RE();
  }
}

void loop()
{
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    Serial.println("send: ");
    Serial.print(inByte, BYTE);
    if (inByte == 'R') {
      Serial.println("Reading...");
      readDeviceID();
      Serial.println("Done!");
    }
  }
}

void readDeviceID()
{
   ioop();
   delay(5);
   ASSERT_CE();
   delay(1);
   SendCommand(0x90);
   delay(5);
   SendAddress(0x00);
   ioip();
   delay(10);
   ReadByte(2); // 2 Bytes einlesen 1 = Manufacturer ID, 2= Device ID
   DEASSERT_CE();

   Serial.print("Manufacturer ID: ");
   Serial.println(buffer[0], HEX);
   Serial.print("Device ID: ");
   Serial.println(buffer[1], HEX);
}

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Joswig schrieb:
> ich wollte gestern mal versuchen mit dem Arduino (Atmega 328) einen Nand
> Flash auszulesen. Leider habe ich kein Datenblatt zum Flash Chip
> allerdings scheinen die Standard Tsop48 aus den USB Sticks ja kompatibel
> zu sein oder sehe ich das falsch? Also habe ich einfach auf gut Glück
> auf ein Samsung Datenblatt zurückgegriffen und erstmal versucht die
> Manufacturer und Device ID auszulesen erhalte aber beidesmal 0xFF
> zurück. Würde mich freuen wenn jemand mal einen Blick über meinen Code
> werfen kann und evtl. den Fehler findet.

Reinhard Joswig schrieb:
> Leider habe ich kein Datenblatt zum Flash Chip allerdings scheinen die
> Standard Tsop48 aus den USB Sticks ja kompatibel zu sein oder sehe ich
> das falsch?

Keine Ahnung... Was hältst du davon, uns mal den Typ des ICs zu nennen? 
Vielleicht finden wir ja ein Datenblatt...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Scheiß unten benennst du erstmal um

void ASSERT_CE() {digitalWrite(ce, HIGH);}
void DEASSERT_CE() {digitalWrite(ce, LOW);}

void CE_HIGH() {digitalWrite(ce, HIGH);}
void CE_LOW() {digitalWrite(ce, LOW);}

Dann kann ein normaler Mensch auch was damit anfangen.
Nach meinen Erfahrungen mit Flash sind die meisten Signale
LOW aktiv. Das wären z.B. ce, re, we.

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups... doppelt zitiert - und das in einem Posting.

imbodenversinkentu  ;o)

Autor: Thomas R. (tinman) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
guck dir den Samsung beispiel an, ich denke es fehlt bei dir der 
reset/init teil (oder habe nicht durchblickt)

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meine die NF_CheckId, NF_Init und NF_Reset.

Übrigens, mach ein bild von dem flash oder sag mindestens war drauf 
steht, vllt kann ich da weiter helfen.

Autor: Reinhard Joswig (xaptor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also folgendes steht drauf:

A8M0820C
USLCH0856M
und etwas anders aufgedruckt M7SF1393Q4 vermute ein Produktionscode. 
Müsste ein 32MB Stick gewesen sein.

Danke für den Samsung Code schaue ich mir morgen mal genauer an.


Beste Grüße
Reinhard

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Joswig schrieb:
> Also folgendes steht drauf:
>
> A8M0820C
> USLCH0856M
> und etwas anders aufgedruckt M7SF1393Q4 vermute ein Produktionscode.
> Müsste ein 32MB Stick gewesen sein.

nein, bezeichnung sagt mir nix, ausser das 0856 schon passend sind zum 
8bit x 256M.

Atmel hat in dem NAND driver example auch init und reset vor dem read id

http://www.atmel.com/dyn/resources/prod_documents/...

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reinhard Joswig escribió en el post # 1574208:
> Reinhard Joswig

Reinhard Joswig Hola!

Tengo El Mismo y me gustaria leer El chip de Contenido, ¿puedo "" Como 
Lograr la ESO?


¿Qué Tipo de micro Tengo? ¿Por Qué No Puedo leer ¿Con Ventanas o Linux?

Por adelantado, gracias?

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Reinhard Joswig

I have the same micro, and i would like to read the content, how can 
achieve that?

which kind of micro i have? why i cant read it with linux or windows XP?

thanks in avance

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.