Forum: Mikrocontroller und Digitale Elektronik Externer Speicherbus UC3A0


von Christian O. (reflexx)


Lesenswert?

Hallo zusammen,

ich hoffe jemand kann mir helfen,

ich benutze den smc Controller im uc3a im 8 Bit Mode an NCS2. Das 
eingestellte Timing (Setup,Pulse und Cycle) verhält sich genauso wie 
erwartet.

Laut Datenblatt wird im 8-Bit mode A0 und A1 auch als A0 und A1 benutzt,
das ist aber nicht so.
Die lese Adresse beginnt erst mit A2.
Also meine Adresse wird nicht von A0..A7 ausgegeben, sondern von A2..A9.

A0 wechselt mit jedem CE.      (1.CE A0=0  2.CE A0=1  3.CE A0=1 etc.)
A1 wechslet mit jedem 2tem CE.

Das sieht aus, als wäre der Controller im Byte select mode, sollte er 
aber nicht sein.
Folgende Einstellungen im Mode Register


// No Page Mode
  AVR32_SMC.cs[2].MODE.pmen=0;
  AVR32_SMC.cs[2].MODE.ps=0;
  AVR32_SMC.cs[2].MODE.tdf_mode=0;
  AVR32_SMC.cs[2].MODE.tdf_cycles=0;

  // 8 Bitmode
  AVR32_SMC.cs[2].MODE.dbw=0;
  AVR32_SMC.cs[2].MODE.bat=0;

  AVR32_SMC.cs[2].MODE.read_mode =  1;
  AVR32_SMC.cs[2].MODE.write_mode = 1;
// Parameter for NCS2



Kann man A0 und A1 nicht als Adressbus nutzen?

bin dankbar für jeden Tipp.


Gruß CH.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian O. schrieb:
> Laut Datenblatt wird im 8-Bit mode A0 und A1 auch als A0 und A1 benutzt,
> das ist aber nicht so.
> Die lese Adresse beginnt erst mit A2.

Machst Du zufälligerweise 32-Bit-Zugriffe? Dann haben A0 und A1 keine 
Funktion, die sind nur bei 8- oder 16-Bit-Zugriffen relevant.

von Christian O. (reflexx)


Lesenswert?

Hi

thx für schnelle Antwort.

Genau so verhält sich der Controller, aber ich mache einen 8 Bit 
Zugriff,
und der Channel ist ja auch im 8 Bit mode Parametriert.

Gruß Ch

von Christian O. (reflexx)


Lesenswert?

hmm ich denke gerade nach, mein Zugriff sieht so aus:

#define SRAM              ((void *)AVR32_EBI_CS2_ADDRESS)


volatile uint32_t *sram = SRAM;
uint8_t mydummy1=0;
mydummy1 = sram[63];


das sollte doch passen oder?

von Christian O. (reflexx)


Lesenswert?

in einer Atmel App note hab ich folgendes gefunden

//! SMC Write Macro Function in 8-bit mode.
#define smc_write_8(b,o,d) (((volatile U8 *)(b))[(o)] = (U8)(d))
smc_write_8(SRAM,i,i);

mir ist nicht ganz klar was das bedeutet.

Kann mich jemand erleuchten?
hat das auch was mit dem lesezugriff zu tun?

Gruß Ch.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian O. schrieb:
> volatile uint32_t *sram = SRAM;
> uint8_t mydummy1=0;
> mydummy1 = sram[63];
>
> das sollte doch passen oder?

Nö, das ist ein 32-Bit-Zugriff, denn sram ist ein Pointer auf uint32_t.

Ändere das zu

> volatile uint8_t *sram = SRAM;
> uint8_t mydummy1=0;
> mydummy1 = sram[63];

und die Angelegenheit dürfte anders aussehen.

von Christian O. (reflexx)


Lesenswert?

Hi Rufus,

1000 Dank, das war der Fehler, nu geht's.

Es wäre schön wenn Du mir meinen Fehler erklären kannst.
Meine Überlegung war folgende:


Die Speicheradresse im AVR32 an NCS2 ist
0xc8000000, folglich liegt da mein erstes Byte. Deshalb dachte ich ich 
brauche eine 32Bit ....

Ach quatsch, das ist ja nur der Zeiger auf die Variable, und so zeige 
ich auf ne 32 Bit Variable.
Klar muss 8 Bit sein weil wegen Byte.

Vielen Dank nochmal Gruß Ch.

von .... (Gast)


Lesenswert?

ahjeehh.. das sind aber Programmierbasics....

Ein Pointer ist IMMER so breit wie der Adressbereich der Architektur. 
Das Weiß der Compiler von selbst, denn der compiliert schließlich für 
diese. Beim AVR sinds 16 bit, AVR32 32Bit, x64 sinds 64bit.

Es ist völlig unabhängig was für Daten du damit Adressierst.
Auch ein 8-bit wert kann in einem 32bit adressraum verteilt sein.

Bei der Pointerdeklaration legt man nur die Datenbreite fest. Die 
Adressbreite ist wie gesagt, vom Compiler vorgegeben.
Das sagen die aber auch die Tutorials über Pointer, Pointerarithmetik 
usw.

von Christian O. (reflexx)


Lesenswert?

Du hast recht, man sollte nicht jeden chemischen Kurzschluss im Hirn für 
bare Münze halten, und auchnoch was anderes schreiben als man denkt.

thx für Klarstellung.

Gruß Ch.

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.