Forum: Mikrocontroller und Digitale Elektronik XMega SRAM, EBI und DMA


von Nicolas (Gast)


Lesenswert?

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

von Bernhard (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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?

von Martin (Gast)


Lesenswert?

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
}

von Nicolas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.