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
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.
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
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
@ 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.
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?
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
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
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
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
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
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
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
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.
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.