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?
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?
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; |
Woher kommt die Datei denn? Ich beziehe mich auf die AV1312 von Atmel und da verstehe ich den Teil mit der Start Adresse nicht.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.