Forum: Mikrocontroller und Digitale Elektronik Xmega128-a1-explained und ASF


von Christian M. (fpga-fan)


Lesenswert?

Hallo zusammen,

ich habe mir mal zum spielen die Xmega128-A1-explained Platine zugelegt. 
Beim starten von Atmel Studio 6 kann man vom Atmel Software Framework 
diverse Beispielcodes für LED, sogar ein nettes Spiel herunter laden. 
Jedoch gibt es im Framework nichts um z.B. den SDRAM anzusprechen, oder 
das Netzwerk. Ich habe einige Programme für ähnliche Platinen gefunden, 
jedoch nicht für den a1-explained.

Muss ich nun das Rad neu erfinden indem ich Pin für Pin oder Bit für Bit 
programmiere, oder gibt es irgendwo einen Referenzcode dafür?

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


Lesenswert?

Christian Müller schrieb:
> Hallo zusammen,
>
> ich habe mir mal zum spielen die Xmega128-A1-explained Platine zugelegt.
> Beim starten von Atmel Studio 6 kann man vom Atmel Software Framework
> diverse Beispielcodes für LED, sogar ein nettes Spiel herunter laden.
> Jedoch gibt es im Framework nichts um z.B. den SDRAM anzusprechen, oder
> das Netzwerk. Ich habe einige Programme für ähnliche Platinen gefunden,
> jedoch nicht für den a1-explained.
>
> Muss ich nun das Rad neu erfinden indem ich Pin für Pin oder Bit für Bit
> programmiere, oder gibt es irgendwo einen Referenzcode dafür?

Das ist ein bisschen verstreut. Ich habe dafür den RAM Test Code 
umgeschnurzelt, wennn man erstmal weiss, welcher Typ SDRam da nun 
verbaut ist.
Hier der Code zur EBI Init:
1
// Sollte vorne zu den anderen includes
2
#include <ebi.h>
3
#include <ebi_port.h>
4
#include <hugemem.h>
5
// constants for refresh and init
6
//! SDRAM initialization delay in number of CLKper2 cycles (100 us)
7
#define BOARD_EBI_SDRAM_INITDLY         \
8
  (100 * 2 * sysclk_get_per2_hz() / 1000000)
9
10
//! SDRAM refresh interval in number of CLKper2 cycles (16 us)
11
#define BOARD_EBI_SDRAM_REFRESH         \
12
  (16 * 2 * sysclk_get_per2_hz() / 1000000)
13
14
/**
15
 * \brief EBI chip select configuration
16
 *
17
 * This struct holds the configuration for the chip select used to set up the
18
 * SDRAM. The example code will use the EBI helper function to setup the
19
 * contents before writing the configuration using ebi_cs_write_config().
20
 */
21
static struct ebi_cs_config     cs_config;
22
23
/**
24
 * \brief EBI SDRAM configuration
25
 *
26
 * This struct holds the configuration for the SDRAM.  The example code will
27
 * use the EBI helper function to setup the contents before writing the
28
 * configuration using ebi_sdram_write_config().
29
 */
30
static struct ebi_sdram_config  sdram_config;
31
// Init the EBI and the RAM. Note that the RAM will not be cleared here. 
32
static void InitSDRAM(void) {
33
  /*
34
   * Configure the EBI port with 12 address lines, no address latches or
35
   * low pin count, and set it in SDRAM mode with 3-port EBI port.
36
   */
37
  ebi_setup_port(12, 0, 0, EBI_PORT_3PORT | EBI_PORT_SDRAM);
38
39
  /*
40
   * Configure the EBI chip select for an 8 MB SDRAM located at
41
   * \ref BOARD_EBI_SDRAM_BASE.
42
   */
43
  ebi_cs_set_mode(&cs_config, EBI_CS_MODE_SDRAM_gc);
44
  ebi_cs_set_address_size(&cs_config, EBI_CS_ASIZE_8MB_gc);
45
  ebi_cs_set_base_address(&cs_config, BOARD_EBI_SDRAM_BASE);
46
47
  /* Configure the EBI chip select to be in SDRAM mode. */
48
  ebi_sdram_set_mode(&cs_config, EBI_CS_SDMODE_NORMAL_gc);
49
50
  /* Setup the number of SDRAM rows and columns. */
51
  ebi_sdram_set_row_bits(&sdram_config, 12);
52
  ebi_sdram_set_col_bits(&sdram_config, 10);
53
54
  /* Further, setup the SDRAM timing. */
55
  ebi_sdram_set_cas_latency(&sdram_config, 3);
56
  ebi_sdram_set_mode_delay(&sdram_config, EBI_MRDLY_2CLK_gc);
57
  ebi_sdram_set_row_cycle_delay(&sdram_config, EBI_ROWCYCDLY_7CLK_gc);
58
  ebi_sdram_set_row_to_precharge_delay(&sdram_config, EBI_RPDLY_7CLK_gc);
59
  ebi_sdram_set_write_recovery_delay(&sdram_config, EBI_WRDLY_1CLK_gc);
60
  ebi_sdram_set_self_refresh_to_active_delay(&sdram_config,
61
      EBI_ESRDLY_7CLK_gc);
62
  ebi_sdram_set_row_to_col_delay(&sdram_config, EBI_ROWCOLDLY_7CLK_gc);
63
  ebi_sdram_set_refresh_period(&sdram_config, BOARD_EBI_SDRAM_REFRESH);
64
  ebi_sdram_set_initialization_delay(&sdram_config,
65
      BOARD_EBI_SDRAM_INITDLY);
66
67
  /* Write SDRAM configuration into the EBI registers. */
68
  ebi_sdram_write_config(&sdram_config);
69
  /* Write the chip select configuration into the EBI registers. */
70
  ebi_cs_write_config(EBI_SDRAM_CS, &cs_config);
71
72
  ebi_enable_cs(EBI_SDRAM_CS, &cs_config);
73
  do {
74
    // Wait for SDRAM to initialize.
75
  } while (!ebi_sdram_is_ready());
76
77
  /* Debug: Enable LED1: SDRAM is ready. */
78
  LED_PORT.OUTCLR = OLED1;
79
    _delay_ms(100);
80
  LED_PORT.OUTSET = OLED1;
81
}
82
// Clear and Write SDRam
83
static void ClearSDRAM(void) {
84
  hugemem_ptr_t n;
85
  for (n = BOARD_EBI_SDRAM_BASE; n < (BOARD_EBI_SDRAM_SIZE + BOARD_EBI_SDRAM_BASE);n+=4) {
86
    hugemem_write32(n,0);
87
  }
88
}
89
// My application specific write routine, writeptr is a global , as is the time variables 'days, hours, minutes, seconds'
90
static void WriteSet(uint16_t x, uint16_t y , uint16_t z){
91
uint32_t time = ((days * 16777216) + (hours * 65536) + (minutes * 256) + seconds);
92
// Wrap around pointer if its beyond the RAM Range
93
  if (writeptr > (BOARD_EBI_SDRAM_SIZE + BOARD_EBI_SDRAM_BASE)) writeptr = BOARD_EBI_SDRAM_BASE;
94
  hugemem_write32(writeptr ,time);
95
  writeptr +=4;
96
  hugemem_write16(writeptr ,x);
97
  writeptr +=2;
98
  hugemem_write16(writeptr ,y);
99
  writeptr +=2;
100
  hugemem_write16(writeptr ,z);
101
  writeptr +=2;
102
}
Das Lesen funktioniert dann entsprechend mit den 'hugemem_read' 
Funktionen. Denk dran, den Kram auch in asf.h zu inkludieren und die EBI 
Routinen zu compilieren. Oh, das ist in AS 5 geschrieben. Weiss nicht, 
obb AS6 entscheidend anders ist.

von Christian M. (fpga-fan)


Lesenswert?

Danke Dir schon mal...

Bei mir scheitert es bereits an der ersten Zeile. Welche Include .h 
Dateien hast Du dafür verwendet?

Ich habe welche von einem anderen Xplain Xmega Board mit dem 128A1 
gefunden, sobald ich diese hinzufügen will, fehlen noch weitere 
Abhängigkeiten wie sleepmgr.h

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


Angehängte Dateien:

Lesenswert?

Das sind die von asf - die spitzen Klammern deuten ja schon darauf hin.
Ich kann dir gerne mal den gesamten Code anhängen, das ist ein kleiner 
Langzeitlogger für einen Beschleunigungssensor ADXL330, der sowohl mit 
den Onboard Knöpfchen als auch mit UART am PC läuft. Benutzt jede Menge 
der XMega Peripherie und schaltet zum Stromsparen  am Takt rum im 
Betrieb. Deswgen auch die eigenen Delay Routinen und das reinit der 
UART.
Anbei also main.c und setup.h, als auch asf.h. Beachte, das ich nicht 
immer ASF benutze, weil manche Sachen zu Fuss viel einfacher sind.
PC Terminal auf 57600,N,8,1 ; das Board meldet sich dann mit einer Hilfe 
zur Bedienung.
Denke dran, vorm Kompilieren die entsprechenden .c Dateien von ASF auch 
in deine Sourcen zu ziehen, sonst wirds nichts.
Oh, noch zur Begriffsklärung, der Code oben läuft bei mir auf dem blauen 
neueren XMega XPlained A1 Board.

Christian Müller schrieb:
> oder
> das Netzwerk.

Mein Board hat kein Netzwerk. Vllt. hast du doch ein anderes?

von Christian M. (fpga-fan)


Lesenswert?

Es lebt :c) Danke Dir. Ich habe es heute Nacht auch schon irgendwie 
hinbekommen (Du hast bestimmt auch schon meinen anderen Thread über 
Speichergeschwindigkeit gelesen), indem ich den Code von Dir mit dem EBI 
SDRam Example vom ASF verglichen habe. Aber Dein letzter Code hat meine 
Versuche jetzt bestätigt und hab noch ein Quäntchen an Wissen über ASF 
mitbekommen. Hier scheint es unterschiedliche Versionen von Dateien in 
den ASF Pfaden zu geben, weil der Compiler trotzdem noch ein paar 
Befehle nicht erkannte, obwohl ich alles mögliche über ASF schon 
herunter gezogen habe, aber das habe ich mit manuellem Deklarieren im 
C-Code und manueller Suche nach der Dateien im Netz selbst noch 
irgendwie hinbekommen - was ich denke, man eigentlich nicht machen 
sollte, wenn man die Ordnung irgendwie behalten möchte :c)

Danke Dir nochmals....

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.