Forum: Mikrocontroller und Digitale Elektronik External Memory bei ATmega8515 (mit SJA1000)


von Flo (Gast)


Lesenswert?

Hallo zusammen,
Ich möchte einen SJA1000 mit einem ATmega8515 koppeln.

Hardwaremäßig sollte alles passen (benutze eine bestehende Platine).
Mein Problem ist die Ansteuerung des Speichers vom SJA1000. Ich komme da 
mit dem Datenblatt nicht ganz klar.
Muss ich als Offset jetzt 0x0260 oder 0x1100 oder 0x8000 nehmen? Wie 
müssen die Bits im SFIOR und EMCUCR gesetzt sein?

Lesezugriff will ich wie im Datenblatt so machen:
1
uint8_t result;
2
3
CS_Control(interface, 0);// CS low
4
_delay_ms(1);
5
6
unsigned char *p = (unsigned char *) (OFFSET + 2);
7
result = *p;
8
9
_delay_ms(1);
10
CS_Control(interface, 1); // CS high


Danke schonmal für eure Antworten!
Flo

von Flo (Gast)


Lesenswert?

Es weiß doch bestimmt jemand hier, es hat nur noch nicht der richtige 
gelesen :)
Ich brauch nur nen Tipp, an welcher Adresse ich den externen Speicher 
ansprechen kann.
Danke!

von Flo (Gast)


Lesenswert?

Noch mal push :)
Bin immer noch nicht weiter mit meinem Problem. Der SJA läuft immer noch 
nicht :(

von Michael U. (amiga)


Lesenswert?

Hallo,

ich kenne zwar den SJA1000 nicht und habe nur kurz ins dessen Datenblatt 
geschaut:

er hat ja wohl nur 256 Byte Adressbereich (A0-A7). Wenn Du ihn also an 
das Memoryinterface des 8515 hängst und es nur einschaltest, dann taucht 
er eben alle 256 Byte wieder von vorn auf, weil ja die oberen Adressen 
nicht dekodiert werden.
Wenn weiter nichts an das Memoryinterface ran soll kannst Du den Port 
von A8-A15 umprogrammieren und als normalen Port nutzen.

Die Zuordnung its in der Tabelle im Datenblatt des Mega8515, habe ich 
jetzt nicht zur Hand.

Wenn das Timings des SJA1000 zum Mega8515 passt, kannst Du auch CS des 
SJA an A8 legen, dann mußt Du es nicht getrennt schalten. Ein Zugriff 
auf 0x0000,
ßx0200, 0x0400 usw. selektiert ihn dann über A8 = L.

Den Bereich von 0x0000 bis 0x025F kannst Du dazu nicht nutzen, da liegt 
das interne Ram. Du kannst also erst ab 0x300 (getrennter CS-Pin) oder 
ab 0x400 mit CS an A8 benutzen.

Nach dem Datenblatt ist die längste Wartezeit bei RD Low to Data Output, 
das sollte also eigentlich auch bei 16MHz AVR-Takt und CS an A8 ohne 
Wait States gehen.

Doch noch schnell das Datenblatt des des Mega8515 befragt:
In MCUCR nur SRE auf 1,
EMCUR kann komplett 0 bleiben, wenn der SJA als einziges am 
Memoryinterface hängt.
XMM0, XMM1, XMM2 kannst Du entweder alle auf 1 setzen, dann nur 8 Bit 
Adresse und CS muß zu Fuß gesteuert werden oder XMM2 und XMM1 auf 1 und 
CS an A8, dann ist PC2..7 noch frei verfügbar.

PS: ich beziehe mich natürlich auf die Anschlußweise eines SJA1000 an 
einen Mega8515, wenn ich den da dranlöten wollte.
Wie Deine Platine verdrahtet ist und ob es da Abweichungen gibt, mußt Du 
wohl selbst rausfinden...

Gruß aus Berlin
Michael

von Flo (Gast)


Lesenswert?

Hi,
Danke für die Erklärung.
Mein CS liegt auf einem anderen Pin und ich ziehe den manuell im 
Programm low.
Die Register habe ich eingestellt wie Du geschrieben hast.
Wie spreche ich jetzt den Speicher vom Programm aus an?

Habe es jetzt so probiert:
1
#define CAN_BASE    0x300
2
3
uint8_t result;
4
5
CS_Control(interface, 0);// CS low
6
_delay_ms(1);
7
8
unsigned char *p = (unsigned char *) (OFFSET + 2);
9
result = *p;
10
11
_delay_ms(1);
12
CS_Control(interface, 1); // CS high

Damit will ich das Status Register auslesen.
Aber ohne Erfolg...

von holger (Gast)


Lesenswert?

>Hardwaremäßig sollte alles passen (benutze eine bestehende Platine).

Und wie sieht der Schaltplan aus ?
Michael hat das doch ziemlich gut erklärt.
Wenn du den Memory mapped angeschlossen hast
fehlt dir möglicherweise nur ein simpler Adressdecoder.

von Michael U. (amiga)


Lesenswert?

Hallo,

zur C-Source kann ich wenig sagen, programmiere nur ASM und da wäre es 
eben nur

.equ CAN_PORT = PORTC ; C natürlich nur, wenn CS an PORTC dranhängt...
.equ CAN_CS   = PC0   ; Pin wo CS dranhängt

.equ CAN_BASE = 0x300

cbi CAN_PORT,CAN_CS
nop                   ; viel warten ist laut Datenvlatt nicht nötig.
lds r16,CAN_BASE+2    ; Inhalt von 0x0302 in r16 holen als Beispiel
nop
sbi CAN_PORT,CAN_CS

Gruß aus Berlin
Michael

von Flo (Gast)


Lesenswert?

Also der ist memory mapped angeschlossen.
Ich weiss nur nicht, in welchem Adressbereich ich den ansprechen kann??
0x0260, 0x0300, 0x1100 oder 0x8000?
Woher weiß der ATmel, wann ich auf den externen Speicher will?

von Peter D. (peda)


Lesenswert?

Flo wrote:

> Woher weiß der ATmel, wann ich auf den externen Speicher will?

Ganz einfach.
Wenn Du das externe Memoryinterface enabled hast und auf eine Adresse 
außerhalb des internen Memory zugreifst, wird das automatisch nach 
extern ausgeführt.

Wenn das der einzige Chip am Memorybus ist, kannst Du /CS einfach 
ständig auf Low lassen.

Die Pins AD0..7, /RD, /WR und ALE des AVR mußt Du direkt mit dem SJA1000 
verbinden.

Wichtig ist ALE, damit das Adreßlatch im SJA1000 funktioniert!


Peter

von Flo (Gast)


Lesenswert?

Jo, angeschlossen ist alles korrekt.
Aber mit welcher Adresse erreiche ich Byte 1 im SJA1000??
Wo hört das interne Memory des 8515 auf? Ich weiß, steht im Datenblatt. 
Aber damit komme ich nicht klar bzw. es funktioniert nicht.
Deshalb kann mir bitte jemand die Adresse sagen, damit ich sicher sein 
kann?
Danke!

von Peter D. (peda)


Lesenswert?

0xFF00 ... 0xFFFF sollte immer klappen.


Peter

von Flo (Gast)


Lesenswert?

Ah, damit klappts!
Danke für eure Antworten. Habe wieder viel gelernt :)

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.