PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bootloader via CAN-Bus



hundemuede
14.09.2006, 17:28
Hallo Alle zusammen,

ich habe da so ein kleines Problem. Das da lautet: Wie kann man einen Atmega-Controller über CAN-Bus Bootloaden? Aufgabe ist das es mit einem externen CAN-Controller und Transceiver zu verwirklichen. Hat da jemand schon mal was gemacht damit?

Gruss

ba4_philipp
05.12.2006, 10:49
Hat sich hier in der Zwischenzeit schon was ergeben? Wäre auch sehr daran interessiert. Vielleicht kann man da auch zusammenarbeiten.

Gruß Philipp

hundemuede
05.12.2006, 16:22
Danke, für die Antwort. Ich habe es mit einem Atmega2560 und einem SJA1000 CAN-Controller ausprobiert. Der CAN-Transceiver ist der PCA251T.

Das Problem ist die Ansteuerung des SJA1000. Da dies mit dem Daten/Adress-Bus ausgeführt wird, sehe ich keine Möglichkeit einen Bootloader in dem Atmega zu implementieren. Der geht ja nur seriell zu programmieren. Es sei den Du oder jemand anderes sieht da eine andere Möglichkeit dies machen zu können.

Eine alternative ist der MCP2515 von Microchip. Dieser CAN-Controller kommuniziert mit dem Atmega seriell und da ist es möglich einen CAN-Bootloader zu verwenden.
So sehe ich das ganze momentan.

Danke gruß

ba4_philipp
05.12.2006, 20:24
Möglich sollte es mit beiden sein, einen Bootloader wirst du aber in beiden Fällen schreiben müssen. SPI ist zwar seriell, das hat aber trotzdem nichts mit dem UART zu tun, für den die meiste Bootloader ausgelegt sind.

Ich benutze den MCP2515. Wie hattest du dir das Boot Protokoll über den CAN Bus denn generell so vorgestellt?

Gruß Philipp

hundemuede
06.12.2006, 14:18
Nun es gibt ja dieses Tool von Atmel Flip mit dem man den Chip über CAN-Bus programmieren kann. Aber so geht es nun mal nicht, weil dieses Programm nur Controller mit integriertem CAN-Controller unterstützt. Toll wäre es das ganze direkt im BASCOM auszuführen, aber dat wird nix denke ich.

Man müsste die Initialisierung des SJA1000 mit einbringen in den Bootloader und die Standart Empfangsroutinen bzw. Senderoutinen so umschreiben das ein Hex-file gut empfangen und in die Seiten, Register usw. des Controllers schreiben zu können.
Darüber müsste man ein Tool schreiben das z.B. über einem USB To CAN Dongle das Hex-file schickt und in einem Netzwerk nur der CAN-Knoten angesprochen wird welcher gewünscht ist.

ba4_philipp
06.12.2006, 18:07
Ja genau. Wobei ich ja eher für den MCP2515 Support wäre ;) aber egal

Meine Frage ist halt nur ob man das vernünftig klein bekommt, so dass es bei einem Mega8 noch Sinn macht. Ich möchte ja nicht die hälfte des Flash dafür verwenden um evtl. mal über CAN updaten zu können.

Und dann muss man sich noch überlegen wie man die Übertragung usw macht. Eine bestimmte ID pro Knoten vielleicht mit der dann die Bytes übertragen werden? Die PC Software dazu sollte kein Problem sein. Man muss sich nur ein vernünftiges Protokoll überlegen.

Ich dachte mir das ungefähr so:
Eine Programmiernachricht wird an ein bestimmten Knoten geschickt:
dieser geht dann in eine Endlosschleife und der Watchdog macht daraufhin einen Reset damit wird der Bootloader Code gestartet.
Der Bootloader sendet nun per RTR eine Anfrage an den PC das er die neue Firmware empfangen möchte. Wenn der PC nicht innerhalb der Zeit X antwortet oder ein Paket schickt in dem steht, das er nix bekommt wird die normale Firmware gestartet.
Ansonsten beginnt auf der ID mit der auch das RTR kam die Übertragung. So kann der CAN Bus normal weiterlaufen, während ein Knoten geflasht wird. Theoretisch könnte der PC sogar viele Knoten gleichzeitig flashen. Man könnte per RTR ja vorher noch ne Firmware Version abfragen und wenn der PC ne neuere hat kommt die automatisch drauf.
Mit den RTR Paketen kann man sogar eine Flusskontrolle realisieren, so dass der Controller nur neue Daten bekommt, wenn er soweit ist.

Gruß Philipp

hundemuede
08.12.2006, 11:01
Es geht bestimmt irgendwie. Aber ich denke für die Routinen zum Empfang und Senden der CAN-Frames benötigt man bestimmt einen groß Teil des Flash. Die ID kann man ja einfach mit der Idendifier Matrix festlegen und dem Akzeptanzfilter im CAN-Controller. Aber das ist ja jedem sein Ding wie er das macht, bzw. welche Art an CAN-Bus man benötigt.

Du brauchst denke ich nicht unbedingt einen RTR Frame Senden. Meiner Meinung ist das nicht so elegant, weil man bei einer optimalen Busauslastung Nachrichten mit großem Datenpaket besser geeignet sind. Daher sollte der RTR Frame auch nicht zum Bootloaden verwendet werden.

Die Idee mit dem Watchdog ist cool. Aber Du kannst auch einfach eine Nachricht vom PC senden und, so eine Art Reset Nachricht und den Controller damit Reseten.

Also wie gehen wir weiter vor. Versuchen wir was auf die Beine zu stellen?

Gruß

Alex

ba4_philipp
08.12.2006, 12:15
Ich würde schon ein RTR benutzen, sonst ist es ja nicht möglich einen Flusskontrolle zu machen. Man kann ja ruhig immer alle 8 Byte senden, und wenn der Controller soweit ist fordert er die nächsten 8 Byte an. Das löschen der Page und das schreiben einer Page nimmt ja einige Zeit in Anspruch.

Warum findest du es unelegant mit RTR? Ich finde einfach CAN Pakete drauf los schießen nicht so schön. Bei mir im Auto Frage ich auch immer an, wenn ich etwas wissen möchte. Wozu sollte zB permanent die Öltemp gesendet werden? Wenn ich das wissen möchte (also zB wenn es gerade auf dem Display angezeigt wird), dann sende ich zB alle 500ms eine RTR Nachricht um die Anzeige zu refreshen.
Wie löst du soetwas denn?
Vielleicht können wir nicht nur einen Bootloader machen, sondern generell uns ein wenig über Konzepte usw austuaschen :) das ist immer gut.

BASCOM kann ich leider nicht, habe diesen Thread über die Googel gefunden und erst später gesehen, das es BASCOM ist. Aber einen kleinen Bootloader in BASCOM zu schreiben ist wohl eh nicht realistisch. Ich würde ja C vorschlagen, weil der komplette CAN kram in ASM wohl relativ umfangreich wird, aber von mir aus halt auch ASM.

GRuß Philipp

Steffen1982
08.12.2006, 12:52
CAN Bus bootloader geht nur bei den MEGA Varianten mit CAN BUS drin.

ba4_philipp
08.12.2006, 12:53
Nein, das ist falsch

m4444x
08.12.2006, 17:55
Habe so einen bootloader für Mega8 + MCP2515 gerade fertig gebaut. Allerdings mit avr-gcc und ein bisschen inline assembler. Hier mal spaßeshalber ein Protokollmitschnitt wo zusehen ist wie die ersten 128 bytes geflasht werden. (0x01 ist der Mega8 und 0x00 ist der PC programmer)



# DST SRC FUNCTION COMMAND RTR LEN DATA
================================================== ===================================
1 0xff 0x01 APP_CTRL ALIVE 0 0x0
2 0xff 0x01 FNC 2 GET 0 0x3 0x04 0x00 0x12 "..."
3 0x01 0x00 PRGM_CMD HELLO 1 0x0
4 0x01 0x00 PRGM_CMD HELLO 1 0x0
5 0xff 0x01 APP_CTRL ALIVE 0 0x0
6 0x01 0x00 APP_CTRL RESET 0 0x0
7 0xff 0x01 PRGM_CMD HELLO 0 0x2 0x11 0x00 ".."
8 0x01 0x00 PRGM_CMD PCB 1 0x0
9 0x00 0x01 PRGM_CMD PCB 0 0x8 0x6d 0x38 0x76 0x32 0x20 0x20 0x20 0x20 "m8v2 "
10 0x01 0x00 PRGM_CMD SIZE 1 0x0
11 0x00 0x01 PRGM_CMD SIZE 0 0x8 0x00 0x18 0x00 0x00 0x40 0x00 0xe0 0x01 "....@..."
12 0x01 0x00 PRGM_CMD STA 0 0x4 0x00 0x00 0x00 0x00 "...."
13 0x00 0x01 PRGM_SEQ 0x00 1 0x0
14 0x01 0x00 PRGM_SEQ 0x00 0 0x8 0x1e 0xc0 0x7f 0xc2 0x38 0xc0 0x37 0xc0 "...8.7."
15 0x01 0x00 PRGM_SEQ 0x01 0 0x8 0x36 0xc0 0x35 0xc0 0x34 0xc0 0x33 0xc0 "6.5.4.3."
16 0x01 0x00 PRGM_SEQ 0x02 0 0x8 0x32 0xc0 0x90 0xc5 0x30 0xc0 0x2f 0xc0 "2...0./."
17 0x01 0x00 PRGM_SEQ 0x03 0 0x8 0x2e 0xc0 0x2d 0xc0 0x2c 0xc0 0x2b 0xc0 "..-.,.+."
18 0x01 0x00 PRGM_SEQ 0x04 0 0x8 0x89 0xc2 0x29 0xc0 0x28 0xc0 0x0c 0x10 "..).(..."
19 0x01 0x00 PRGM_SEQ 0x05 0 0x8 0x16 0x1d 0x25 0x2f 0x3a 0x47 0x54 0x63 "..%/:GTc"
20 0x01 0x00 PRGM_SEQ 0x06 0 0x8 0x71 0x80 0x8e 0x9b 0xa7 0xb2 0xbc 0xc5 "q......."
21 0x01 0x00 PRGM_SEQ 0x07 0 0x8 0xcd 0xd3 0xd9 0xde 0xe3 0x00 0x11 0x24 ".......$"
22 0x00 0x01 PRGM_CMD FIN 1 0x0
23 0x01 0x00 PRGM_CMD STA 0 0x4 0x40 0x00 0x00 0x00 "@..."
24 0x00 0x01 PRGM_SEQ 0x00 1 0x0
25 0x01 0x00 PRGM_SEQ 0x00 0 0x8 0x1f 0xbe 0xcf 0xe5 0xd4 0xe0 0xde 0xbf "........"
26 0x01 0x00 PRGM_SEQ 0x01 0 0x8 0xcd 0xbf 0x11 0xe0 0xa0 0xe6 0xb0 0xe0 "........"
27 0x01 0x00 PRGM_SEQ 0x02 0 0x8 0xe2 0xe6 0xfd 0xe0 0x02 0xc0 0x05 0x90 "........"
28 0x01 0x00 PRGM_SEQ 0x03 0 0x8 0x0d 0x92 0xac 0x35 0xb1 0x07 0xd9 0xf7 "...5...."
29 0x01 0x00 PRGM_SEQ 0x04 0 0x8 0x11 0xe0 0xac 0xe5 0xb1 0xe0 0x01 0xc0 "........"
30 0x01 0x00 PRGM_SEQ 0x05 0 0x8 0x1d 0x92 0xa3 0x37 0xb1 0x07 0xe1 0xf7 "...7...."
31 0x01 0x00 PRGM_SEQ 0x06 0 0x8 0xf0 0x92 0x73 0x01 0x29 0xc3 0xc4 0xcf "..s.)..."
32 0x01 0x00 PRGM_SEQ 0x07 0 0x8 0xcf 0x93 0xdf 0x93 0xcd 0xb7 0xde 0xb7 "........"
33 0x00 0x01 PRGM_CMD FIN 1 0x0

hundemuede
12.12.2006, 17:07
Nun dann setze Deinen Bootloader doch mal online das wir auch was davon haben. Wäre nett.