Forum: Mikrocontroller und Digitale Elektronik 4x MCP2515 oder 4x SJA1000 an AT90CAN128


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Karsten K. (karsten42)


Lesenswert?

Moin Moin libe CAN Freaks,

Ich möchte einen CAN-Router/Bridge mit 250kBaud bauen. Die Datenmenge 
ist im normalbetrieb relativ gering. Es werden nur simple Requests 
verschickt. Das ganze ist für eine Modelleisenbahnsteuerung. Ausnahme 
bildet ein software Updatevorgang der jedoch auch nur an ein Bus gehen 
soll.
Der Interne CAN-Bus vom AT90CAN soll an das Steuergerät, an den vier 
Bussen sind dann maximal zwei Endgeräte ( Hardware bedingt wegen 
interner nicht abschaltbarer Endwiderstände ).

Die Frage ist nun ob vier MCP2515 via SPI ausreichen oder ob ich doch 
vier SJA1000 benötige. Die Problematik ist für mich eher das Handling 
mit SMD und relativ kompliziertem Layout von vier SJA1000. Die Dinger 
gibts auch als DIL28 ( wenn auch schwieriger zu bekommen ). Die MCP2515 
sind da viel einfacher anzuschließen.

Ein testaufbau mit zwei MCP2515 und einem ATMEAG88 lief soweit 
problemlos nachdem ich die canlib auf interrupt betrieb umgestellt habe. 
Der AT90CAN hat ja soo hübsch massig externe interrupts :-)

Ich wäre begeistert über ein paar tipps

von Peter D. (peda)


Lesenswert?

So schlimm ist das Layout nicht, die SJA1000 hängen ja alle parallel am 
Memorybus (11 Leitungen).
Dafür kannst Du sie direkt als MMIO ansprechen, also über Pointer.

Beim MCP2515 muß alles erstmal über den Flaschenhals SPI gehen. Und der 
AT90CAN128 hat noch nicht mal die modernen UARTs als gepuffertes SPI.

von Frank K. (fchk)


Lesenswert?

Bei 4 Bussen würde ich nicht mehr über SPI gehen, der SJA1000 ist da die 
bessere Wahl.

Wenn Du SMD vermeiden willst und 16k Flash reichen, dann nimm doch einen 
Mega162, 5 SJA1000 und ggf ein externes 32k RAM, wenn Du das brauchst. 
Das gibts alles als DIL, und der Mega162 hat auch einen externen Memory 
Bus.

Schau hier, da wird das mit einem SJA1000 gemacht. Du musst nur noch 
einen HC138 hinzufügen, um weiteres Adressleitungen auszudekodieren.

Wenn Du SMD akzeptierst, dann würde ich einen Mega1281 und 5 SJA 
verwenden. Der 1281 ist die modernere Version des 128'ers und schafft 
auch 20 MHz und hat 8k RAM statt 4k. Und vom Code ist es einfacher, 5 
SJAs anzusteuern als 4 SJA und den internen vom 90CAN128.

Und das Layout ist so kompliziert nun nicht. Die SJA werden ja alle 
parallel geschaltet, nur !CS muss jeweils getrennt ausdecodiert werden. 
Dann nimmst Du einen 16 Mhz Oszillator und keinen Quarz und kannst damit 
alle SJA und wahlweise auch den Prozessor damit takten. Auf dem Layout 
kannst Du ohne Probleme 8 SJA vorsehen.

fchk

von Karsten K. (karsten42)


Lesenswert?

Hallo Frank,

10000 Dank für die schnelle Antwort.

Nun SJA1000 in SMD "busmäßig" zu routen benötigt auf jeden Fall vias. 
Ich werde dann lieber für den Prototypen auf DIL setzen. Nun, das Olimex 
at90CAN128 header board werde ich dann sicher auch mal nutzen :-)
Der Mega162 ist eine gute Idee!


beste Grüße
Karsten

von Falk B. (falk)


Lesenswert?

@ Karsten K. (karsten42)

>Ich möchte einen CAN-Router/Bridge mit 250kBaud bauen. Die Datenmenge
>ist im normalbetrieb relativ gering. Es werden nur simple Requests
>verschickt. Das ganze ist für eine Modelleisenbahnsteuerung.

Wozu braucht man da einen CAN-Router? Warum nicht einfach alle Knoten an 
einen Strang und fertig?

>Der Interne CAN-Bus vom AT90CAN soll an das Steuergerät, an den vier
>Bussen sind dann maximal zwei Endgeräte ( Hardware bedingt wegen
>interner nicht abschaltbarer Endwiderstände ).

Sehr sinnvoll einen CAN-Bus mit 2 Endgeräten zu betreiben, dazu noch mit 
geringem Datenaufkommen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Das sind ja dann recht alberne "Bus"geräte...
Eh ich mir 5 getrennte Bussysteme aufbauen würde, würde ich erstmal 
versuchen, den Abschlusswiderständen mit nem Lötkolben zu Leibe 
zurücken.
Alternativ sollte es auch Möglichkeiten die seltsamen Teile wirklich 
busfähig zu machen. Oder benutzen die auch etwa gleiche feste IDs?

von Karsten K. (karsten42)


Lesenswert?

Moin Moin,

Ja, alberne Endgeräte: Stimmt! Und natürlich könnte ich die 
Endwiderstände entfernen. Jedoch geht es um Modelleisenbahn und da kann 
eben nun mal nicht jeder 0402 widerstände schadfrei auslöten. Daher 
leider die einzelnen Busse.
Leider ist die steuerung der Zentrale ( und jetzt mal die Nennung der 
Produkte ( MS2, GFP Gleisbox von Mär..n )nicht dafür ausgelegt mehr als 
eine Gleisbox zu betreiben. Die Boxen müssen aber individuell 
initialisiert und angesprochen werden. Eine Gleisbox muss auch noch als 
eine Art Master fungieren um spezielle Programmiermodi ( 
Programmiergleis )zu betreiben.

Ähh: und bei 5 SJA1000 eine gute Idee die Interrupts des SJA mit einem 
MEGA162 zu behandeln weil polling dabei ja flasch fällt ?

Gruß
Karsten

von Frank K. (fchk)


Lesenswert?

Karsten K. schrieb:

> Ähh: und bei 5 SJA1000 eine gute Idee die Interrupts des SJA mit einem
> MEGA162 zu behandeln weil polling dabei ja flasch fällt ?

Die IRQs sind Open Drain (Pullup nicht vergessen) und können 
zusammengeschaltet werden. Wenn ein IRQ kommt, musst Du nur alle SJA 
abklappern und schauen, wer der Verursacher war. Das ist eine gängige 
Vorgehensweise.

fchk

von Karsten K. (karsten42)


Lesenswert?

Moin Frank,

die IRQ´s UND verknüpfen funst aber nur wenn der ext. INT[0] auf "level 
triggered" steht. Ansonsten könnte man ja einen interrupt von einem der 
SJA "verlieren" wenn man in der ISR herumgeistert.

Unklar ist mir noch der Adressraum für die SJA1000. Mit !CS selektiere 
ich dann ja den entsprechenden SJA1000. Dann dürfte der Adressraum für 
jeden gleich sein oder?

Zusätzlich ein externes 32Kx8 SRAM falls der interne SRAM nicht reicht 
sollte eigentlich auch gehen. Ich habe noch zwei MEGA162 in der 
Schublade :-)
Dann wären die Startadressen der SJA1000 bei 0x8500.

Suuupervielen Dank für deine Anregungen und Tipps!

Karsten

von Frank K. (fchk)


Lesenswert?

Karsten K. schrieb:

> Unklar ist mir noch der Adressraum für die SJA1000. Mit !CS selektiere
> ich dann ja den entsprechenden SJA1000. Dann dürfte der Adressraum für
> jeden gleich sein oder?

nein, der muss ja unterschiedlich sein. Jeder braucht 256 Byte.

Nimm einen HC138:
A0 auf Adressleitung A8
A1 auf Adressleitung A9
A2 auf Adressleitung A10
!E1 und !E2 auf GND
E3 auf Adressleitung A15
!Y0 ... !Y7 sind die !CS-Signale für die bis zu 8 SJA.

Dann wiederholen sich die Adressen der SJA alle 2k im oberen Adressraum. 
Beim SRAM hängst Du !CS an A15, dann ist es in den unteren 32k.

fchk

von Karsten K. (karsten42)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

Frank K. schrieb:
> Dann wiederholen sich die Adressen der SJA alle 2k im oberen Adressraum.
> Beim SRAM hängst Du !CS an A15, dann ist es in den unteren 32k.

Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die 
Adressen alle 256 byte. Aber wie GENIAL deine Lösung!
Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist 
doch für den SJA1000 in dieser Weise nicht notwendig. Umschaltung 
zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.

Allerbeste Grüße
Karsten

von Frank K. (fchk)


Lesenswert?

Karsten K. schrieb:

> Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die
> Adressen alle 256 byte. Aber wie GENIAL deine Lösung!
> Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist
> doch für den SJA1000 in dieser Weise nicht notwendig.

Doch klar. Der muss auch wissen, wann eine Adresse und wann Daten 
kommen. Kommt an ALE vom Prozessor.

> Umschaltung
> zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.

Auf Intel stellen. Dann hast Du !RD und !WR wie beim AVR und nicht E und 
R/!W wie bei 68xx und 6502

!RST von den SJA machst Du auf einen Portpin des AVR.

Die !INT der SJA auf INT0 oder INT1 des AVR legen, mit Pullup.

Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.

fchk

von Frank K. (fchk)


Lesenswert?

Karsten K. schrieb:

> Bei Decodierung von A[8-10] für !CS der SJA1000 wiederholen sich die
> Adressen alle 256 byte. Aber wie GENIAL deine Lösung!
> Was mach ich jetzt mit ALE. Das wird ja für das Latch verwendet und ist
> doch für den SJA1000 in dieser Weise nicht notwendig.

Doch klar. Der muss auch wissen, wann eine Adresse und wann Daten 
kommen. Kommt an ALE vom Prozessor.

> Umschaltung
> zwischen Motorola und Intel mode laut Datenblatt sagt mir leider nichts.

Auf Intel stellen. Dann hast Du !RD und !WR wie beim AVR und nicht E und 
R/!W wie bei 68xx und 6502

!RST von den SJA machst Du auf einen Portpin des AVR.

Die !INT der SJA auf INT2 des AVR legen, mit Pullup dran.

Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.

fchk

von Peter D. (peda)


Lesenswert?

Frank K. schrieb:
> Der 16 MHz Oszillator fehlt auch noch, und dann ist der Teil komplett.

Man kann aber auch die CKOUT-Fuse setzen und dann die SJA1000 von PORTB0 
treiben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.