Forum: Mikrocontroller und Digitale Elektronik SDRAM und Xmeaga-A X-Plained


von Matthias L. (mcl024)


Lesenswert?

Hallo Zusammen,

ich habe das AVR XMEGA-A1 X-PLAINED Board von Atmel mit dem externen 8MB 
SDRAM.

Hat jemand bereits damit Erfahrungen gesammelt. Gibt es Code Beispiele 
wie ich es anspreche?

von Matthias L. (mcl024)


Angehängte Dateien:

Lesenswert?

ich habe das hier von Atmel gefunden. Ich denke passt sehr gut. 
Allerdings verstehe ich schon den Anfang in der ebi_sdram_example.c 
nicht und zwar den Teil

#define SDRAM_ADDR (SDRAM_SIZE * MEMORY_BLOCK)

Bei welcher Adresse fängt er denn jetzt an zu schreiben bei 0x800000 ? 
Ist das nicht das Ende?

von Matthias L. (mcl024)


Lesenswert?

Hat das noch keiner gemacht?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Doch, klar . nur - was möchtest du wissen?
Das wird in conf_board.h definiert:
1
#define CONFIG_HAVE_HUGEMEM
2
//! Base address of SDRAM on board
3
#define BOARD_EBI_SDRAM_BASE    0x800000UL
4
5
//! Size of SDRAM on board, given in bytes.
6
#define BOARD_EBI_SDRAM_SIZE    0x800000UL
RAM zu Fuss initialisieren:
1
//! SDRAM initialization delay in number of CLKper2 cycles (100 us)
2
#define BOARD_EBI_SDRAM_INITDLY         \
3
  (100 * 2 * sysclk_get_per2_hz() / 1000000)
4
//! SDRAM refresh interval in number of CLKper2 cycles (16 us)
5
#define BOARD_EBI_SDRAM_REFRESH         \
6
  (16 * 2 * sysclk_get_per2_hz() / 1000000)
7
 /* \brief EBI chip select configuration
8
 *
9
 * This struct holds the configuration for the chip select used to set up the
10
 * SDRAM. The example code will use the EBI helper function to setup the
11
 * contents before writing the configuration using ebi_cs_write_config().
12
 */
13
static struct ebi_cs_config     cs_config;
14
/*
15
 * \brief EBI SDRAM configuration
16
 *
17
 * This struct holds the configuration for the SDRAM.  The example code will
18
 * use the EBI helper function to setup the contents before writing the
19
 * configuration using ebi_sdram_write_config().
20
 */
21
static void InitSDRAM(void) {
22
  /*
23
   * Configure the EBI port with 12 address lines, no address latches or
24
   * low pin count, and set it in SDRAM mode with 3-port EBI port.
25
   */
26
  ebi_setup_port(12, 0, 0, EBI_PORT_3PORT | EBI_PORT_SDRAM);
27
  /*
28
   * Configure the EBI chip select for an 8 MB SDRAM located at
29
   * \ref BOARD_EBI_SDRAM_BASE.
30
   */
31
  ebi_cs_set_mode(&cs_config, EBI_CS_MODE_SDRAM_gc);
32
  ebi_cs_set_address_size(&cs_config, EBI_CS_ASIZE_8MB_gc);
33
  ebi_cs_set_base_address(&cs_config, BOARD_EBI_SDRAM_BASE);
34
35
  /* Configure the EBI chip select to be in SDRAM mode. */
36
  ebi_sdram_set_mode(&cs_config, EBI_CS_SDMODE_NORMAL_gc);
37
38
  /* Setup the number of SDRAM rows and columns. */
39
  ebi_sdram_set_row_bits(&sdram_config, 12);
40
  ebi_sdram_set_col_bits(&sdram_config, 10);
41
  /* Further, setup the SDRAM timing. */
42
  ebi_sdram_set_cas_latency(&sdram_config, 3);
43
  ebi_sdram_set_mode_delay(&sdram_config, EBI_MRDLY_2CLK_gc);
44
  ebi_sdram_set_row_cycle_delay(&sdram_config, EBI_ROWCYCDLY_7CLK_gc);
45
  ebi_sdram_set_row_to_precharge_delay(&sdram_config, EBI_RPDLY_7CLK_gc);
46
  ebi_sdram_set_write_recovery_delay(&sdram_config, EBI_WRDLY_1CLK_gc);
47
  ebi_sdram_set_self_refresh_to_active_delay(&sdram_config,
48
      EBI_ESRDLY_7CLK_gc);
49
  ebi_sdram_set_row_to_col_delay(&sdram_config, EBI_ROWCOLDLY_7CLK_gc);
50
  ebi_sdram_set_refresh_period(&sdram_config, BOARD_EBI_SDRAM_REFRESH);
51
  ebi_sdram_set_initialization_delay(&sdram_config,
52
      BOARD_EBI_SDRAM_INITDLY);
53
54
  /* Write SDRAM configuration into the EBI registers. */
55
  ebi_sdram_write_config(&sdram_config);
56
  /* Write the chip select configuration into the EBI registers. */
57
  ebi_cs_write_config(EBI_SDRAM_CS, &cs_config);
58
59
  ebi_enable_cs(EBI_SDRAM_CS, &cs_config);
60
  do {
61
    // Wait for SDRAM to initialize.
62
  } while (!ebi_sdram_is_ready());
63
}
64
{/c]
65
Lesen und schreiben tust du am besten mit den Hugemem routinen:
66
[c]// write something
67
  hugemem_write32(writeptr ,time);
68
  writeptr +=4;
69
  hugemem_write16(writeptr ,x);
70
  writeptr +=2;
71
//Read something
72
  hugemem_read32(readptr ,time);
73
  readptr +=4;
74
  hugemem_read16(readptr ,x);
75
  readptr +=2;

von Matthias L. (mcl024)


Lesenswert?

Woher kommt die Datei denn? Ich beziehe mich auf die AV1312 von Atmel 
und da verstehe ich den Teil mit der Start Adresse nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

conf_board.h bekommst du dann, wenn du mit AVR Studio 5 ein Projekt fürs 
Xplained A1 board startest. Den Rest hab ich mir selbst 
zusammengefummelt, weil ich ASF umständlich und unnötig kompliziert 
finde.
Und der Schreib- bzw. Lesezeiger sollte auf BOARD_EBI_SDRAM_BASE 
initialisiert werden ( als uint32_t ) und von da ab aufsteigen bis er 
BOARD_EBI_SDRAM_BASE + BOARD_EBI_SDRAM_SIZE erreicht. Das ist das Ende 
des RAM.
Ich hab mir zum kennenlernen des Boards einen Datenlogger für ein 
Accelerationssensor gebaut , um ADC,Timer, RTC , SDRAM usw. zu lernen. 
Bei Interesse kann ich mal den Sourcecode posten.

von Matthias L. (mcl024)


Lesenswert?

Ahh Ok vielen Dank für die Infos.

Ich möchte Daten in das externe SDRAM schreiben und habe gedacht das ich 
einfach die oben geposteten drei Dateien in mein vorhandenes Projekt 
einbinde und dann das SDRAM nutzen kann.

In der Beispiel main wird ja der EBI und das SDRAM initialisiert und an 
der Stelle
/* Fill SDRAM with data. */
for (uint32_t i = 0; i < 0x40000; i++) {
  __far_mem_write(i+SDRAM_ADDR, TESTBYTE);
}

wird Testbyte ins SDRAM geschrieben. An dieser Stelle verstehe ich die 
Adressierung nicht. Ich hätte i einfach ohne +SDRAM_ADDR laufen lassen. 
Wao ist mein Denkfehler? Und würde das mit den drei Dateien 
funktionieren?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Matthias Laubnitz schrieb:
> Ich hätte i einfach ohne +SDRAM_ADDR laufen lassen.
> Wao ist mein Denkfehler? Und würde das mit den drei Dateien
> funktionieren?

Der RAM fängt ja erst bei
1
 BOARD_EBI_SDRAM_BASE = SDRAM_ADDR
 an, ist also auf tieferen Addressen nicht erreichbar, bzw. wird erst ab 
der RAM Startaddresse in den Addressraum eingeblendet ( durch das CS 
Signal)
Andere Speicherbereiche sind beim Board entweder frei oder durch andere 
Peripherien belegt. Der XMega selber hat ja z.B. internes RAM von 8 
kByte.

von Matthias L. (mcl024)


Lesenswert?

Kannst du mir diesen Teil etwas genauer erklären, dadurch ergibt sich ja 
die SDRAM_ADDR

/*! \brief Size of SDRAM to be accessed. */
#define SDRAM_SIZE 0x800000UL

/*! \brief Memory block to use in the memory map.
 *
 *   This depends on the size of the RAM. It can be up to (16MB/RAM_SIZE 
- 1).
 *   In this example the RAM size is 8MB, so the block can be either 0 
or 1.
 */
#define MEMORY_BLOCK 1

/*! \brief Address where we want SDRAM to be accessed. */
#define SDRAM_ADDR (SDRAM_SIZE * MEMORY_BLOCK)

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.