Forum: Mikrocontroller und Digitale Elektronik STM32F103 CAN Baudrate umschalten.


von clonephone82 (Gast)


Lesenswert?

Hallo,

Also der bxCAN is ja nicht wirklich komfortabel bzw. komm ich damit 
nicht ganz klar. Aber es nützt nichts ich muss es realisieren.

Wie kann ich die CAN Baudrate im Betrieb ändern? Arbeite mit einem 
proprietären Protokoll. Dieses hat ein Feature um die Baudrate 
hochzuschalten. Beispielsweise bekomme ich bei 250kBaud eine Message um 
die Baudrate auf 1MBaud zu wechseln. Das klappt auch - aber eben nicht 
ohne Fehler und ich verstehe nicht wieso.

Ich mach es so...
1
     // stop can node
2
     CAN1->MCR  = CAN_MCR_INRQ;
3
     CAN1->IER  = 0x00000000;
4
     while((CAN1->MSR & CAN_MSR_INAK) == 0) {};
5
6
     // Baudrate neu setzen 
7
     CAN1->BTR = baud_table[baudrate];
8
9
     // start node, set irq´s         
10
     CAN1->MCR  = 0;
11
     CAN1->IER  = CAN_IER_TMEIE | CAN_IER_FMPIE0;

Wie gesagt es klappt auch aber ich bekomme immer wieder ein paar Form 
Errors am Beginn der neuen Messages auf 1MBaud. Aber nur am Beginn und 
somit werden die Error Counter erhöht und das stört mich. Die Baudrate 
stimmt ganz bestimmt wenn ich mit 1MBaud starte habe ich keine Fehler.

Wie kann man beim bxCAN die Baudrate ändern ohne alles neu zu 
initialisieren.

Ist hier vielleicht jemand der das auch macht und weis wie?

Die STM Lib´s können das ja alle nicht.

Danke im Voraus

von Bleibtreu (Gast)


Lesenswert?

> Also der bxCAN is ja nicht wirklich komfortabel ...

Warum verwendest du ihn dann?

> Die STM Lib´s können das ja alle nicht.

Woher weiß du das?

von clonephone82 (Gast)


Lesenswert?

Hallo,

Muss das auf der Arbeit machen - privat würde ich den für CAN nicht 
wirklich verwenden wollen. Finde die STM´s ja sonst schon praktisch aber 
der bxCAN kann wirklich nichts - Sorry.

Weil ich nachgesehen :-) habe. Hättest du einen Idee wie es gehen 
könnte?

Vielen Dank

von Guest (Gast)


Lesenswert?

Das ist schon ein bißchen bösartiger Missbrauch vom CAN-Bus, oder? Das 
ist ein Bus, das heißt da können grundsätzlich mehrere Teilnehmer dran 
angeschlossen sein. Was ist, wenn sich jetzt mal einer neu initialisiert 
und dann auf der falschen Baudrate startet? Muss der erst passiv 
mitlauschen, um durch ausprobieren die richtige Baudrate rauszufinden? 
Wenn er aktiv am Bus teilnimmt, gibt's auf jeden Fall einen Fehler weil 
er die Nachricht vom anderen nicht lesen konnte. Wenn er passiv ist, 
aber nur 2 Teilnehmer am Bus angeschlossen sind, gibt's auch Fehler, 
weil niemand da ist, um ein ACK zu antworten. Also meiner Meinung nach 
ziemlicher Quatsch.

von clonephone82 (Gast)


Lesenswert?

Hallo,

Nein kein Missbrauch das ist halt so vorgesehen im den Protokoll. Master 
schickt an alles Slaves Baudrate dementsprechende wechseln und dann geht 
es weiter mit der neuen Baudrate. Das ist nicht das Problem ich habe 
auch nur 1 Master und 1 Slave jetzt hier. Der 2 Fall ist genau das was 
du sagst horchen und Autobaud :-) Wenigten´s hat der bxCAN auch ein 
Listen Only :-) das kann nicht jeder.

Also falls jemand eine Idee hat wie es gehen könnte wäre echt cool.

Danke

von clonephone82 (Gast)


Lesenswert?

Hat niemand ne Idee wie es geht könnte?

lg

von Martin (Gast)


Lesenswert?

Im Manual steht, dass die Baudrate nur geändert werden kann, wenn der 
bxCAN im Init Mode ist. Du machst also alles richtig.

CAN bit timing register (CAN_BTR)
Address offset: 0x1C
Reset value: 0x0123 0000
This register can only be accessed by the software when the CAN hardware 
is in initialization mode.

Warum die Fehler am Anfang kommen musst du vielleicht mit dem Oszi 
analysieren.

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.