Forum: Mikrocontroller und Digitale Elektronik STM32H745 DISCO - SDRAM Problem


von Louis (Gast)


Lesenswert?

Hallo,

ich versuche gerade mich ins Board einzuarbeiten, es funktioniert alles 
ganz gut bis auf ein erstaunliches Problem beim Zugriff auf das SDRAM.

Das Board hat ein SDRAM vom Typ MT48LC4M32B2 (1Meg x 32 x 4 Bänke) 
verbaut.
Von den 32 Datenleitungen sind nur 16 zum Prozessor verbunden, ich denke 
also dass ich nur die Hälfte des Speichers nutzen kann (oder weiss da 
wer mehr?)

Im Prozessor ist das SDRAM auf SD Bank #2 gemappt.

Folgendes Problem:
Wenn ich irgendwohin im Speicher schreibe, erscheinen die Daten beim 
Lesen nicht auf der Adresse auf die geschrieben wurde, sondern auf der 
Adresse - 2

z.B.
uint16_t * pui = (uint16_t)0xd0000004;
pui[0] = 0x1234;
if (pui[0] == 0x1234)
  {
  // Hierher komme ich nicht
  }
if (pui[-1] == 0x1234)
  {
  // Hierher komme ich immer
  }

Dabei ist es egal ob ich uint8, uint16 oder uint32 Zugriffe mache, die 
Verschiebung ist immer 2 Bytes.
Natürlich weiss ich nicht ob der Offset beim Schreiben oder beim Lesen 
passiert. Die Speicheranzeige im Debugger zeigt dasselbe was ich bei 
Lesezugriffen erhalte.

Das ganze ist komplett stabil, wenn ich einfach beim Lesen die Adresse 
um 2 reduziere funktioniert alles dauerhaft ohne Probleme.
(Dann kann ich aber keine uint32 Zugriffe machen wegen falschen 
Alignment)

Ich arbeite mit einem SD-Clock von 120 MHz.
Den Takt sowie alle Timing Parameter habe ich schon stark Richtung 
langsam gedreht ohne irgendeine Änderung.

Hat jemand schon einmal etwas ähnliches erlebt?
Für jeden Tipp wäre ich sehr dankbar.

liebe Grüße

Louis

von PittyJ (Gast)


Lesenswert?

uint16_t * pui = (uint16_t)0xd0000004;

Ist das OK so?

0xd0000004 nach uint16_t gecastet ergibt 4 ?
Der Pointer zeigt also auf Adresse 4?


Oder bin ich jetzt komplett daneben?

von Louis (Gast)


Lesenswert?

Hallo,

Du hast recht, das sollte natürlich
  uint16_t * pui = (uint16_t *)0xd0000004;
heissen.

lg
Louis

von Guest (Gast)


Lesenswert?

Louis schrieb:
> Von den 32 Datenleitungen sind nur 16 zum Prozessor verbunden, ich denke
> also dass ich nur die Hälfte des Speichers nutzen kann (oder weiss da
> wer mehr?)

Nein du hast die halbe Bandbreite zum Übertragen, da du nur 16 statt 32 
Bit auf einen Schlag lesen bzw. schreiben kannst. Der SDRAM sollte 
gesondert noch Addressleitungen haben.

von A. B. (Gast)


Lesenswert?

Louis schrieb:

> Das Board hat ein SDRAM vom Typ MT48LC4M32B2 (1Meg x 32 x 4 Bänke)
> verbaut.
> Von den 32 Datenleitungen sind nur 16 zum Prozessor verbunden, ich denke
> also dass ich nur die Hälfte des Speichers nutzen kann (oder weiss da
> wer mehr?)

Da ist nur die Hälfte nutzbar, denn das RAM hat keinen Multiplexer für 
16-Bit oder gar 8-Bit Breite eingebaut.

Beim STM32F746G-Disco (mit dem gleichen RAM und auch nur 16 
Datenleitungen) steht das auch im UM ausdrücklich drin. Beim H745I-Disco 
hat man diesen Kommentar wohl vergessen ...

Zu dem Problem mit dem "Versatz": MWID auf 01 (16-Bit)?

von Louis (Gast)


Lesenswert?

Bitte entschuldige die Leitung auf der ich gerade stehe,  aber was 
meinst Du mit MWID?
Die konfigurierte Datenbusbreite? Die ist auf 16 gesetzt.
Mir fällt auch keine Fehlerquelle ein, z.B. falsch konfigurierte IO, die 
zu diesem Fehlerbild passen könnte.
Wie gesagt sind alle Bytes da, auch in der richtigen Reihenfolge, nur 
halt um 2 versetzt.
Natürlich habe ich dennoch die IO Konfiguration überprüft...

Danke jedenfalls für die Antwort!

von Louis (Gast)


Lesenswert?

Hallo,

nur zur Info, das Problem is gelöst.
Es ist an einer falsch konfigurierten CAS Latency im Mode-Register des 
SDRAM gelegen.

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.