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.