Flash W29C011A-15 beschreiben mit PIC18F4525

OP #3177300
Lesenswert?

Hi,

Als blutiger Mikrocontrolleranfänger bräuchte ich mal eure Hilfe.
Wir haben an der FH die Aufgabe, einen Flash (W29C011A) mithilfe eines 
PICs (18F4525) zu beschreiben. Allerdings habe ich keine Ahnung, wie ich 
damit anfange, bzw. wie das funktioniert.

Könnte mir jemand ein paar Hinweise geben, wie ich dabei vorgehe.
#3177492
Lesenswert?

So würde ich das machen.
Du hast zwei Latches für die Adressleitungen, eines für A8..A1 und eines 
für A16..A9.

Startbedingung:
!WE=1
!OE=!
!CE=1
ALE_L=0
ALE_H=0
A0=X (egal)
TRISD=0 - Port D auf Ausgang

Schreiben:
Adressbits 8..1 auf Port D/LATD schreiben
ALE_L auf 1
ALE_L auf 0 - damit sind die Bits im Latch gespeichert
Adressbits 16..9 auf Port D/LATD
ALE_H auf 1
ALE_H auf 0 - damit sind die Bits im Latch gespeichert
Adressbit 0 auf A0
Daten auf Port D/LATD schreiben
!CE=0 - Flash aktivieren
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
!CE=1 - Flash deaktivieren

Lesen:
Adressbits 8..1 auf Port D/LATD schreiben
ALE_L auf 1
ALE_L auf 0 - damit sind die Bits im Latch gespeichert
Adressbits 16..9 auf Port D/LATD
ALE_H auf 1
ALE_H auf 0 - damit sind die Bits im Latch gespeichert
Adressbit 0 auf A0
TRISD=255 - Port D auf Eingang
!CE=0 - Flash aktivieren
!OE=0 - Daten aus Flash lesen, Datenausgänge des Flashes anschalten
Daten von PORTD lesen
!OE=1 - Datenausgänge des Flashes abschalten
!CE=1 - Flash deaktivieren
TRISD=0 - Port D auf Ausgang

Auf ein Flash kann man nicht so wie auf ein RAM schreiben, da gibts eine 
spezielle Prozedur, die im Datenblatt steht. Auch Löschen steht da drin.

Durch die Latches sind noch sehr viele Pins des PICs frei für andere 
Sachen. Du willst ja vielleicht noch ein Display oder eine serielle 
Schnittstelle anklemmen. Wenn Du eines der üblichen Text-LCDs 
anschließend willst, kannst Du die Datenleitungen auf auf Port D legen 
und für RS A0 mitbenutzen, nur die Steuerleitungen E und RW brauchen 
extra Pins.

So, jetzt solltest Du das ohne weitere Hilfe schaffen.

fchk
Angehängte Dateien:
OP #3179271
Lesenswert?

Danke, das hat mir schonmal sehr weitergeholfen.

Es gibt noch eine Sache, die ich nicht verstehe.
So wie ich es aus dem Datenblatt verstehe, wird bei einem 
Schreibvorgang, nachdem das erste Byte an den Flash geliefert wurde, 
durch eine fallende Flanke an !WE der byte-load cycle beendet. Wenn man 
aber innerhalb von 200mys weitere Bytes hinschickt, werden diese auch in 
den Buffer geschrieben.
Mein Problem ist jetzt, muss ich vor jedem zusätzlichen Byte !WE wieder 
auf 1 setzen und danach auf 0, oder fällt das dann weg?
Wenn das wegfällt, woher weiß der Flash dann, dass er das neue Byte 
jetzt in den Buffer schreiben darf, bzw. dass der PIC fertig ist?
OP #3179516
Lesenswert?

Heißt quasi

!WE -> 1
schicke byte 1
!WE -> 0
!WE -> 1
schicke byte 2
!WE -> 0
!WE -> 1
schicke byte 3

usw.?

Die Interne Programmierung läuft dann an, sobald !WE lang genug auf 1 
bleibt?
Setz ich den Flash, nachdem eine "Page" geschrieben wurde wieder in den 
Standby, bevor ich mit der nächsten anfange?
#3179526
Lesenswert?

Simon B. schrieb:
> Heißt quasi
>
> !WE -> 1
> schicke byte 1
> !WE -> 0
> !WE -> 1
> schicke byte 2
> !WE -> 0
> !WE -> 1
> schicke byte 3

Erst Daten senden, dann !WE=0, dann !WE=1. Schau Dir mein 
Originalposting an, da steht es exakt drin.

> Die Interne Programmierung läuft dann an, sobald !WE lang genug auf 1
> bleibt?

Entweder wenn eine Page voll ist oder !CE und !WE wieder auf 1 sein 
(Ruhezustand)

> Setz ich den Flash, nachdem eine "Page" geschrieben wurde wieder in den
> Standby, bevor ich mit der nächsten anfange?

!CE=1 setzen, um den Schreibvorgang zu beenden, und dann Data Polling 
(siehe Seite 4 und Seite 14).

fchk
OP #3179556
Lesenswert?

Frank K. schrieb:
>
> Startbedingung:
> !WE=1
> !OE=!
> !CE=1
> ALE_L=0
> ALE_H=0
> A0=X (egal)
> TRISD=0 - Port D auf Ausgang
>
> Schreiben:
> Adressbits 8..1 auf Port D/LATD schreiben
> ALE_L auf 1
> ALE_L auf 0 - damit sind die Bits im Latch gespeichert
> Adressbits 16..9 auf Port D/LATD
> ALE_H auf 1
> ALE_H auf 0 - damit sind die Bits im Latch gespeichert
> Adressbit 0 auf A0
> Daten auf Port D/LATD schreiben
> !CE=0 - Flash aktivieren
> !WE=0 - Schreiben
> !WE=1 - Schreiben Ende
> !CE=1 - Flash deaktivieren
>

Sorry, ich hab grad nen Knoten im Hirn.
Wenn ich das richtig verstehe, müsste ich nach dem "!WE=1 - Schreiben 
Ende" quasi wieder von vorne anfangen.
Wenn ich den Flash deaktiviere, dann schreibt er ja die erste Seite 
voll.

Oder meinst du, dass ich den Schreibvorgang jedesmal komplett durchgehe, 
dabei die Pageadresses gleichlasse und nur die Datenadresse ändere?
#3179579
Lesenswert?

Simon B. schrieb:

> Oder meinst du, dass ich den Schreibvorgang jedesmal komplett durchgehe,
> dabei die Pageadresses gleichlasse und nur die Datenadresse ändere?

Wenn Du schnell genug bist (die byte-load cycle time (TBLC) of 200
µS), dann brauchst Du die Adresse nicht zu ändern, sondern kannst 
einfach Daten mit !WE reintakten.

Adressbits 8..1 auf Port D/LATD schreiben
ALE_L auf 1
ALE_L auf 0 - damit sind die Bits im Latch gespeichert
Adressbits 16..9 auf Port D/LATD
ALE_H auf 1
ALE_H auf 0 - damit sind die Bits im Latch gespeichert
Adressbit 0 auf A0
!CE=0 - Flash aktivieren

Daten auf Port D/LATD schreiben
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
Daten auf Port D/LATD schreiben
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
Daten auf Port D/LATD schreiben
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
Daten auf Port D/LATD schreiben
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
Daten auf Port D/LATD schreiben
!WE=0 - Schreiben
!WE=1 - Schreiben Ende
...
!CE=1 - Flash deaktivieren

fchk

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