Forum: Mikrocontroller und Digitale Elektronik XMega128A1 SDRAM mit EBI Problem


von Felix W. (m4pp3t)


Lesenswert?

Vorgeschichte:

Ich bin vor kurzem angefangen mit der Programmierung von µC.
Ich verwende das Atmel XPlain Board mit dem XMega128A1. Auf dem Board 
ist auch ein externer SDRAM mit 8Mb verbaut. Dabei handelt es sich um 
ein 48LC16M4A2. Diesen SDRAM möchte ich über das EBI ansprechen. Aus der 
Appnote1312, die sich mit genau diesem Thema befasst bin ich leider auch 
nicht schlau geworden.

Nun zum Problem:

Die Konfiguration des EBI für das ansprechen eines SDRAM habe ich 
genauso wie in der Appnote und in den Datenblättern des SDRAM und des 
XMega angegeben ausgeführt. Ich verstehe aber nicht, wie ich in den 
SDRAM Daten reinschreibe. Ich versuche nun über einen Pointer, dem ich 
die Basisadresse des SDRAM übergebe auf den Speicher zuzugreifen und 
dann Daten hinein zu schreiben. Um dann an die nächste Position im 
Speicher zu kommen addiere ich auf den Pointer einfach die Größe von 
uint8_t. Aber irgendwas scheint da nicht zu klappen, denn wenn ich 
abfrage ob die Daten wirklich da sind bekomme ich immer einen Fehler;
Hier der Code:
1
/*
2
 * SDRAM.c
3
 *
4
 * Created: 29.01.2013 20:05:38
5
 *  Author: Felix W.
6
 */ 
7
8
9
#include <avr/io.h>
10
11
#define SDRAM_BASEADDR 0x4000                              //Basisadresse ans Ende vom SRAM
12
13
int main(void)
14
{
15
  uint8_t *iDaten0;
16
  
17
  EBI.CTRL = EBI_IFMODE_3PORT_gc | EBI_SDDATAW_4BIT_gc;                //3Port Modus & 4Bit Datenbus
18
  PORTH.DIR = 0xFF;                                  //Ports alle auf Ausgang bis auf Datenleitungen
19
  PORTK.DIR = 0xFF;
20
  PORTJ.DIR = 0xF0;
21
  EBI.SDRAMCTRLA = ~(EBI_SDCAS_bm) | EBI_SDROW_bm | EBI_SDCOL_10BIT_gc;        //CAS-Latenz einstellen 2CLKs & 12Bit Zeilenadressen & 10Bit Spaltenadressen
22
  EBI.SDRAMCTRLB = EBI_MRDLY_2CLK_gc | EBI_ROWCYCDLY_1CLK_gc | EBI_RPDLY_1CLK_gc;    //Mode Register Delay 2CLKs; Rowcycle Delay 1ClK; Rowprecharge Delay 1CLK
23
  EBI.SDRAMCTRLC = EBI_WRDLY_1CLK_gc | EBI_ESRDLY_1CLK_gc | EBI_ROWCOLDLY_1CLK_gc;  //Writerecovery Delay 1CLK; Exit Selfrefresh Delay 1CLK; Row_Column Delay 1CLK
24
  EBI.REFRESH = 0x001F;                                //Refreshperiod 150,5us 31CLKs
25
  EBI.INITDLY = 0x00C8;                                //Init Delay 100us 200CLKs
26
  EBI.CS3.BASEADDR = SDRAM_BASEADDR;                          //Chipselect3 Basisadresse für SDRAM übergeben
27
  EBI.CS3.CTRLA = EBI_CS_ASIZE_8MB_gc;                        //Chipselect3 auf 8Mb einstellen
28
  EBI.CS3.CTRLA |= EBI_CS_MODE_SDRAM_gc;                        //Initialisierung starten
29
  while ((EBI.CS3.CTRLB & EBI_CS_SDINITDONE_bm) == 0)                  //Warten bis Initialisierung abgeschlossen
30
  {
31
  }
32
  
33
  iDaten0 = SDRAM_BASEADDR;                              //Pointer auf Basisadresse des SDRAM setzen
34
  *iDaten0 = 0xFF;                                  //Daten in Speicherschreiben
35
  iDaten0 = SDRAM_BASEADDR+sizeof(uint8_t);                      //Adresse um Größe von uint8_t erhöhen
36
  *iDaten0 = 0xFE;                                  //Daten in Speicher schreiben
37
  
38
    while(1)
39
    {
40
        //TODO:: Please write your application code 
41
    }
42
}

Über eine Rückmeldung würde ich mich sehr freuen.

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.