SDRAM und Xmeaga-A X-Plained

OP #2468124
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?
Angehängte Dateien:
(Firma: matzetronics) #2468352
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;
(Firma: matzetronics) #2468522
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.
OP #2468554
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?
(Firma: matzetronics) #2468565
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.
OP #2468572
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren