Hallo, eigentlich wollte ich hier: Beitrag "XMega 128 mit 32MByte SDRAM betreiben" fragen, aber da wurde ich aufgefordert, einen neuen Thread aufzumachen. Hallo, auch wenn der Beitrag hier recht alt ist, hab ich doch ein paar Fragen: Alexander, hast Du das EBI-interface des XMega benutzt? Und mit welchem RAM-Baustein? Und mit DMA? Dann wäre ich sehr an etwas Beispielcode/der Beschaltung interessiert ;)! Ich benutze einen XMega um ein im internen RAM abgespeicherte waveform über den DAC abzuspielen. Da wäre mehr Speicher sehr interessant... Danke und Viele Grüße Nicolas
Hallo Nicolas Du kannst die XPlan als Grundlage nehmen für den Speicheraufbau. Der SDRAM ist langsamer als der SRAM. Speicherbaustein habe ich ein 42..16400 mit 16 Bit Datenbus verwenden. Nicht benötigte Datenleitungen(D4..D15) mit Pullup Widerständen versehen und die EBI nach AVR1312 Appl initialisiert. Mein SDRAM brauchte 64MHz. Erst dann funktionierte er fehlerfrei. Schaltplan findest Du in der Appl AVR1907 Atmel Seite für's Testboard XPlan. Gruß Bernhard
Nicolas schrieb: > Ich benutze einen XMega um ein im internen RAM abgespeicherte waveform > über den DAC abzuspielen. Da wäre mehr Speicher sehr interessant... Warum kein externer Flash? SD-Karte?
Anbei den Code den ich benutze (Ist halt für SRAM). Der Xmega berechnet Signale (Foundation Fieldbus + Profibus), schreibt diese in ein externes SRAM und ein FPGA gibt das ganze dann aus. Die Funktionen habe ich hier irgendwo mal gefunden, die Einstellungen fürs EBI stehen in der Dokumentation zum Xmega. Schreiben mit EBI:
1 | /************************************************************************/
|
2 | /*! \brief Writes one byte to a given 24 bit address.
|
3 | *
|
4 | * Since the compiler can't handle 24bit pointers, the external memory has to be accessed
|
5 | * using this function
|
6 | *
|
7 | * \param[in] Address Contains a 24bit pointer for an EBI write access
|
8 | * \param[in] Val The byte to write
|
9 | *************************************************************************/
|
10 | |
11 | inline void WriteEBI(uint32_t Address, uint8_t Val) |
12 | {
|
13 | uint8_t Seg = (uint8_t)(Address >>16); |
14 | uint16_t Off = (uint16_t)Address; |
15 | __asm__ __volatile__ |
16 | (
|
17 | "in __tmp_reg__,%3" "\n\t" /* store RAMPZ */ |
18 | "out %3,%1" "\n\t" /* load new RAMPZ */ |
19 | "st %a2,%0" "\n\t" /* write byte */ |
20 | "out %3,__tmp_reg__" "\n\t" /* restore RAMPZ */ |
21 | :
|
22 | : "r" (Val), /* %0 */ |
23 | "r" (Seg), /* %1 */ |
24 | "z" (Off), /* %2 (Z) */ |
25 | "I" _SFR_IO_ADDR(RAMPZ) /* %3 */ |
26 | );
|
27 | }
|
Lesen:
1 | /************************************************************************/
|
2 | /*! \brief Reads one byte from a given 24 bit address.
|
3 | *
|
4 | * Since the compiler can't handle 24bit pointers, the external memory has
|
5 | * to be accessed using this function
|
6 | *
|
7 | * \param[in] Address Contains a 24bit pointer for an EBI read access
|
8 | *************************************************************************/
|
9 | inline uint8_t ReadEBI(uint32_t Address) |
10 | {
|
11 | uint8_t Seg = (uint8_t)(Address >> 16); |
12 | uint16_t Off = (uint16_t)Address; |
13 | uint8_t Value; |
14 | __asm__ __volatile__ |
15 | (
|
16 | "in __tmp_reg__,%3" "\n\t" /* store RAMPZ */ |
17 | "out %3,%1" "\n\t" /* load new RAMPZ */ |
18 | "ld %0,%a2" "\n\t" /* load Ret */ |
19 | "out %3,__tmp_reg__" "\n\t" /* restore RAMPZ */ |
20 | : "=&r" (Value) /* %0 */ |
21 | : "r" (Seg), /* %1 */ |
22 | "z" (Off), /* a2 */ |
23 | "I" _SFR_IO_ADDR(RAMPZ) /* %3 */ |
24 | );
|
25 | |
26 | return( Value ); |
27 | }
|
EBI Konfigurieren:
1 | void InitializeEBI() |
2 | {
|
3 | /* Set signals which are active-low to high value */
|
4 | PORTH.OUT = 0xFF; |
5 | /* Configure bus pins as outputs(except for data lines). */
|
6 | PORTH.DIR = 0xFF; |
7 | PORTK.DIR = 0xFF; |
8 | |
9 | /* Initialize EBI. */
|
10 | EBI.CTRL=0x09; |
11 | |
12 | /* Initialize Chipselect for SRAM */
|
13 | EBI.CS0.CTRLA = 0x35; |
14 | EBI.CS0.CTRLB = 0x00; |
15 | EBI.CS0.BASEADDRH = 0xE0; |
16 | EBI.CS0.BASEADDRL = 0x00; |
17 | }
|
Hallo, vielen Dank für die Anregungen, und entschuldigt die späte Antwort: @ Travel Rec.: Ich würde gerne viele Daten in möglichst kurzer Zeit speichern können, bei externem Flash (z.B. AT45xx) schreckt mich die Zeit zum Löschen (7-23s Chip Ersase laut Datenblatt). Da eine SD-Karte auch Flash benutzt, dürfte das ja ähnlich sein oder sehe ich das falsch? @ Bernhard, Martin: Danke für die Hinweise, das erleichtert den Anfang. Inzwischen überlege ich, ob ich nicht gleich zu einem der neuen kleinen ARMs wechsel - z.B. den Cortex M3 finde ich sehr nett. Nochmal Danke für die Anregungen! Nicolas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.