Forum: Mikrocontroller und Digitale Elektronik In-System-Programming über CAN


von Christian R. (crausch)


Lesenswert?

Hallo zusammen,

kennt jemand einen Mikrokontroller mit CAN-Interface, der von sich aus 
ein Konzept für den SW-Update über den CAN-Bus mitbringt? Ich meine 
damit einen uc mit internem CAN-Bootloader, dessen Flashspeicher man in 
einem CAN-Netz mit mehreren Teilnehmern updaten kann. Gibt es sowas? Die 
Frage wäre dann, wie alle diese Teilnehmer zu adressieren wären, das ist 
schon klar. Mir ist auch klar, dass ich sowas selber programmieren 
könnte, aber dann besteht immer die Gefahr des "brickings"; ein nicht 
überschreibbarer CAN-Bootloader wäre mir da schon lieber.
Kennt jemand so ein Ding?

von Denis_T (Gast)


Lesenswert?


von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Der wird aber keinen vorinstallierten CAN-Bootloader besitzen.

von Christian R. (crausch)


Lesenswert?

Christian H. schrieb:
> Der wird aber keinen vorinstallierten CAN-Bootloader besitzen.

Ja, das ist genau mein Problem: Ich brauche einen uc mit fest 
installiertem Bootloader bzw. Flash-programming-routine

von Michael H. (michael_h45)


Lesenswert?

Was genau spricht gegen selberschreiben?

von Reinhard Kern (Gast)


Lesenswert?

Christian Rausch schrieb:
> ein nicht
> überschreibbarer CAN-Bootloader wäre mir da schon lieber.

Das liegt doch an dir: wenn du einen Bootloader schreibst oder 
modifizierst, kannst du ja leicht dafür sorgen, dass er nicht von CAN 
aus überschreibbar ist. Die Frage ist bloss, wie du ihn dann überhaupt 
reinkriegst, z.B. JTAG.

Gruss Reinhard

von Martin (Gast)


Lesenswert?

Christian Rausch schrieb:
> Mir ist auch klar, dass ich sowas selber programmieren
> könnte, aber dann besteht immer die Gefahr des "brickings"; ein nicht
> überschreibbarer CAN-Bootloader wäre mir da schon lieber.

Viele Microcontroller bieten die Möglichkeit, einen Teil des Flash zur 
Laufzeit mit einem Schreibschutz zu versehen. Also gibt es in diesem 
Fall kein "bricking".
Auch wenn ein Bootloader ab Werk drin ist, wird dieser üblicherweise im 
Flash residieren und kann theoretisch gelöscht werden.

von gero (Gast)


Lesenswert?

LPC11C24

von IngoF (Gast)


Lesenswert?

Der PIC hat die Möglichkeit den "Bootblock" vor Überschreiben zu 
schützen (Configurationsbit). Das wird es doch auch bei anderen 
Controllern mit CAN-Bus geben.

Man kann im Bootloader sonst auch selber eine Funktion einbauen dass der 
Bootloader oder wichtige Teile nicht umzuprogrammieren sind. Das 
Programmieren macht ja der Bootloader selber und dann kann keiner 
dazwischenpfuschen.

Nach einem Reset kann man erst eine Abfrage starten ob der Bootloader 
oder die Betriebssoftware gestartet wird. Und einen Reset durch die 
Stromversorgung bekommt man doch immer hin, oder?

Solange man ganz sicher das Abfragekriterum zum starten des Bootloaders 
einhalten kann sollte es keine Probleme geben.

Wenn man wirklich nur an die beiden CAN-Busleitungen des Controllers 
kommt könnte man ja z.B. einen Kurzschluss zwischen den beiden Eingängen 
machen und durch Abfrage beim Booten in den Bootloader schicken.

Allerdings wäre ein fertiger Bootloader die kleinste Entwicklungsarbeit.

Bastel auch gerade an einer Schaltung mit CAN-Bootloader. Den Bootloader 
habe ich schon erfolgreich zum laufen bekommen. Fragt sich nur wie man 
eine 100% sicheres Abfragekriterium beim Booten erzeugen könnte.

Aber eine fertige Bootloaderlösung wäre natürlich auch interesant.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

IngoF schrieb:
> Bastel auch gerade an einer Schaltung mit CAN-Bootloader. Den Bootloader
> habe ich schon erfolgreich zum laufen bekommen.

Welcher Controller? In meinem Fall AT90CAN128.

Ich bin auch gerade dabei, einen CAN-Bootloader zu bauen, der mir genehm 
ist.
Die wenigen verfügbaren passen mir nicht.
Bisher bin ich aber noch bei der Planung. Code existiert noch nicht.
Ist Deiner verfügbar - so zum spicken?

> Fragt sich nur wie man eine 100% sicheres Abfragekriterium beim Booten erzeugen 
könnte.

Ich warte nach einem Reset ca 500ms auf eine bestimmte CAN-Nachricht.
Erst wenn diese kommt, öffnet der Bootloader seinen kompletten 
Befehlssatz.
Nach 500ms startet dann das Hauptprogramm.
Einen Reset werde ich über CAN und dem Watchdog auslösen.

von Jörn K. (joern)


Lesenswert?

Manche STM32 haben einen CAN bootloader drin

Gibt auch eine App. Note dazu

http://www.stmcu.org/download/index.php?act=down&id=2954

von Christian R. (crausch)


Lesenswert?

Danke für all Eure Antworten.

Den 11c24 habe ich mir schon angeschaut; der kommt meinen Vorstellungen 
schon ganz nahe, allerdings habe ich mit diesem uc das Problem, wie ich 
im Netzwerk genau diesen uc selektieren kann und von den anderen 
Teilnehmern, die keinen SW-update bekommen sollen, unterscheide. Das 
geht mit diesem uc nämlich nicht.

Mit den selbergeschriebenen Lösungen gibt es das Problem, dass ich mir 
eben 1. die Lösung selber schreiben muss (Aufwand) und 2. den Bootloader 
über eine andere Methode (JTAG, UART) erst mal reinladen muss und 
anschließend (danke für den Tipp) mittels Jumper vor dem Überschreiben 
schützen muss.

Aber nochmal die Frage: Gibt es denn da keine fertigen Lösungen hzw. 
Mikrokontroller die das von sich aus können? Das Problem müssen doch 
noch mehr Leute haben!?

von Ingo F. (ingof)


Lesenswert?

Christian H. schrieb:
> Welcher Controller? In meinem Fall AT90CAN128.

Habe einen PIC18F2580

Christian H. schrieb:
> Ist Deiner verfügbar - so zum spicken?

Ja, ist der AN247 von Microchip. Den Code wirst Du dann wohl nicht 
verwenden können...

Christian H. schrieb:
> Ich warte nach einem Reset ca 500ms auf eine bestimmte CAN-Nachricht.

Ich bin noch auf der Suche nach dem Kriterium. Der AN247 löst das 
dadurch dass das letzte EEPROM-Byte den Wert FF hat. Man muss also noch 
eine Firmware haben die Das letze Byte programmiert.

..... Das habe ich natürlich rausgeschmissen.

Die Nachricht muss dann aber die "Seriennummer" enthalten. Sonst kannst 
Du die CAN-Knoten ja nur komplett neu flashen.

Es gibt beim PIC eine 4Byte-ID die ich dann einmalig programmiere und 
dannach vor überschreiben schütze. Dann kann man schon mal ausschließen 
dass man ausversehen eine Adresse vergibt die schon existiert.

Bei mir werde ich wohl den Bootloader noch so umbauen dass nur einer 
gleichzeitig programmiert werden kann.


Kann denn noch irgendwas schief gehen dass er das CAN-Telegramm nicht 
empfängt?

Gruß
Ingo

von Christian R. (crausch)


Lesenswert?

IngoF schrieb:
> Wenn man wirklich nur an die beiden CAN-Busleitungen des Controllers
> kommt könnte man ja z.B. einen Kurzschluss zwischen den beiden Eingängen
> machen und durch Abfrage beim Booten in den Bootloader schicken.

Ich komme überhaupt nur an die CAN-Busleitungen des gesamtes CAN-Bus. 
Wie kann ich dem Busteilnehmer x sagen, dass ich ihn updaten will, die 
Busteilnehmer y,z, usw. aber nicht?

von Christian R. (crausch)


Lesenswert?

Danke für den Link, Jörn; sehr interessant, habe den Test kurz 
überflogen: was nicht daraus hervorgeht, ist, wie ich gezielt einen 
Busteilnehmer (und nur diesen) in den Bootloader-Modus bringe.
Das geht doch üblicherweise nur durch Betätigung eine uc-Pins bei Reset 
o.ä.!?

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Christian Rausch schrieb:
> Das geht doch üblicherweise nur durch Betätigung eine uc-Pins bei Reset
> o.ä.!?

Man könnte über eine spezielle CAN-Nachricht das Hauptprogramm dazu 
bringen, einen Watchdog-Reset auszulösen. Danach müsste eigentlich der 
Bootloader ausgeführt werden.

Also
1. Reset-Nachricht an einen definierten Knoten senden
2. Nachricht an den Bootloader schicken, damit dieser die Kommunikation 
startet.
3. Flash oder EEPROM per Bootloader schreiben/lesen
4. Reset auslösen
5. Hauptprogramm läuft wieder los

Problematisch ist jedoch, wenn das Hauptprogramm keine Reset-Nachricht 
auswerten kann.

von josch222 (Gast)


Lesenswert?

Renesas hat sowas für ein paar ihrer Controllerserien, genaueres für
ältere hier:
http://documentation.renesas.com/doc/products/mpumcu/apn/reu05b0067_mcuap.pdf
Für RX600 hier:
http://documentation.renesas.com/doc/products/mpumcu/apn/rx/r01an0235eu0121_rx.pdf

Vielleicht auch zum Abgucken/Anregung für andere Comtroller geeignet.
Beispielprojekte sollten auch irgendwo unter den Appnotes der jeweiligen
µCs zu finden sein.

von Jörn K. (joern)


Lesenswert?

Christian Rausch schrieb:
> Danke für den Link, Jörn; sehr interessant, habe den Test kurz
> überflogen: was nicht daraus hervorgeht, ist, wie ich gezielt einen

Dazu gibt es auch eine App Note :)

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/18225/AN2606.pdf

Dazu benötigt man die Pin Boot0 und Boot1 in der ensprechenden 
Konfiguration und dar Baustein startet dann im Bootloader Modus.

von Christian R. (crausch)


Lesenswert?

Ok, die Appnote habe ich jetzt gelesen:
Der STM32F105xx und der STM32F107xx wären wohl geeignet; die haben einen 
CAN-Bootloader.
Aber wie aktiviere/deaktiviere ich das Ding?
Ich muss ja , wie in Kapitel 5.2 beschrieben, den BOOT0 pin auf high
(und den BOOT1 pin auf low) legen während des Resets.
Damit aktiviere ich den Bootloader, der anschließend auf einen Frame mit 
id=0x79 an CAN_RX2 wartet und, wenn dieser kommt, in den command-modus 
geht. Wenn nicht, dann gibt's einen System Reset.

Damit das funktionieren kann, brauche ich sowas wie einen externen 
1-bit-GPIO-Baustein mit Speicherfunktion (EEPOT?):

1. Wenn meine Anwendung läuft, schicke ich Ihr ein Kommando, welches zur 
Folge hat, dass der BOOT0-Pin beim nächsten RESET auf "1" gesetzt wird 
und dadurch der CAN-Bootloader aktiviert wird.

2. Über den CAN-Bootloader läuft jetzt der SW-Update: Der Flashspeicher 
wird neu programmiert

3. Die Anwendungs-SW wird zuletzt über den CAN-Bootloader mit dem 
"go"-Kommando gestartet. Eine der ersten Aktionen der Anwendungs-SW ist 
das Zurücksetzen des BOOT0-Pins, damit beim nächsten RESET die Anwendung 
startet und nicht der Bootloader.

Macht das Sinn?

Könnte gehen, oder? Hört sich trotzdem etwas strange an. Was kann man 
sonst noch nehmen außer dem EEPOT?

von Christian R. (crausch)


Lesenswert?

Sorry, habe den Schritt 1.a) zwischen Punkt 1 und 2 vergessen:

1. Wenn meine Anwendung läuft, schicke ich Ihr ein Kommando, welches zur
Folge hat, dass der BOOT0-Pin beim nächsten RESET auf "1" gesetzt wird
und dadurch der CAN-Bootloader aktiviert wird.

1.a) Die Anwendungs-SW löst einen System-Reset (über den Watchdog?) aus 
und der Bootloader startet

2. Über den CAN-Bootloader läuft jetzt der SW-Update: Der Flashspeicher
wird neu programmiert

3. Die Anwendungs-SW wird zuletzt über den CAN-Bootloader mit dem
"go"-Kommando gestartet. Eine der ersten Aktionen der Anwendungs-SW ist
das Zurücksetzen des BOOT0-Pins, damit beim nächsten RESET die Anwendung
startet und nicht der Bootloader.

von Karl (Gast)


Lesenswert?

Du suchst das Dual bank boot feature.

Ich mach es etwas anders. Mein bootloader kann kein CAN, der schreibt 
nur die Firmware an die richtige Stelle (ich benutze ein externes EEProm 
für den Zwischenspeicher). Die Firmware kann dann im laufenden Betrieb 
die neue Firmware empfangen und wenn der DL fertig ist (dauert so 
10-15min) wird neu gestartet und der BL tut den Rest. Vorteil hier, CAN 
ist nicht sehr performant und man kann den BUS relativ schnell mit Daten 
dicht machen. Andere Geräte wären dann natürlich im Nachteil und die 
Funktionalität beeinträchtigt.

Hat alles sein für und wider.


-..-

von Christian R. (crausch)


Lesenswert?

Auch interessant! SW-Update im laufenden System, sozusagen? Das wäre 
auch  für mich ein interessantes Feature. Danke für den Tipp!

von Reinhard Kern (Gast)


Lesenswert?

Christian Rausch schrieb:
> SW-Update im laufenden System, sozusagen? Das wäre
> auch  für mich ein interessantes Feature.

Da musst du dir aber schon sorgfältig überlegen, was in dem Moment 
passiert - ich möchte z.B. nicht in einem Auto sitzen, bei dem bei 200 
km/h auf der Autobahn gerade neue Firmware in das Bremssystem geladen 
wird ("update läuft - versuchen sie später nochmal zu bremsen").

Gruss Reinhard

von Lutz (Gast)


Lesenswert?

Christian Rausch schrieb:
> Den 11c24 habe ich mir schon angeschaut; der kommt meinen Vorstellungen
> schon ganz nahe, allerdings habe ich mit diesem uc das Problem, wie ich
> im Netzwerk genau diesen uc selektieren kann und von den anderen
> Teilnehmern, die keinen SW-update bekommen sollen, unterscheide. Das
> geht mit diesem uc nämlich nicht.

Natürlich kann man das mit den LPC11Cxx machen. Wäre ja sonst auch der 
Hammer. Schau dir im UM10398 mal die Sections 26.6 und 26.7 an. Die 
Zauberworte heißen u.a. IAP, SDO und UID.

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.