Forum: Mikrocontroller und Digitale Elektronik CAN mit STM32


von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

für mein Formula Student Team soll ich auf folgendem Board

http://www.watterott.com/de/OLIMEXINO-STM32-MAPLE (STM32F103RBT6)

den CAN-Controller in Betrieb nehmen, um sowohl die CAN-Kommunikation zu 
steuern als auch sämtlichen CAN-Datenverkehr auf eine SD-Karte 
mitzuloggen.

Hierzu habe ich mir bereits die paar Beispiele, die mit der FW-Library 
mitgeliefert werden, und auch alle entsprechenden Projekte, die ich im 
Internet gefunden habe, angeschaut. Da sich alle Projekte, die ich 
gesehen habe eigentlich an den FW-Lib orientieren, habe ich das 
mitgelieferte "Networking"-Projekt an die Vorgaben des oben genannten 
Boards angepasst.
Leider war es mir bisher noch nichtmal möglich ein CAN-Transmit-Signal 
zu erzeugen und bin so langsam am verzweifeln.
Daher hoffe ich, dass vielleicht hier der ein oder andere einen Tipp 
geben kann, der mir weiterhilft.

Schonmal vielen Dank im voraus

Marco

PS: Im Anhang befinden sich alle Dateien, die ich für relevant halte, 
solltet ihr weitere Dateien brauchen, bitte sagen

von Unglaublich (Gast)


Lesenswert?

Also ich hatte heute Mittag Spargel und Kotelett. Mir ist auch völlig 
unklar, wie das weitergehen soll. Ich hingegen verzichte aber aus 
ästhetischen Gründen darauf, ein Foto davon hochzuladen.

von Frank K. (fchk)


Lesenswert?

Bei CAN brauchst Du zum Entwickeln einen funktionierenden BUS mit 
korrekter Terminierung und mindestens einem funktionierendem Teilnehmer. 
Wenn Du alleine auf dem Bus bist, hast Du niemanden, der Dir Deine 
Pakete quittiert, und dann bekommst Du Fehlermeldungen von Deinem 
CAN-Controller.

fchk

von peterguy (Gast)


Lesenswert?

Ich vermute daß bei dir das Remappen der CAN Pins fehlt.
Standardmässig liegt der CAN auf Pin A11(Rx) und A12(Tx).
Wenn du den CAN an Port B nutzen möchtest musst du vorher
1
GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);
aufrufen.

(Bin mir nciht sicher ob GPIO_Remap1_CAN1 der richtige Parameter ist, 
solltest du mal ausprobieren  bzw. mit dem Datenblatt vergleichen.

Ich habe mal meinen CAN Treiber angehängt, der funktioniert mit meinem 
STM32F103RB6 wunderbar.

von peterguy (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die Anhänge, hoffe das klappt diesmal

von Marco (Gast)


Lesenswert?

Wow. Danke schonmal.
Hatte bisher leider noch keine Zeit, das ganze auszuprobieren, aber bald 
ist ja hoffentlich Wochenende :D

von David P. (chavotronic)


Lesenswert?

> und dann bekommst Du Fehlermeldungen von Deinem
> CAN-Controller.

I.d.R. nicht. Es wird so oft neu geschickt bis es jemand quittiert.
Dennoch würde ich an der Stelle ein zweites Board kaufen mit dem du dann 
sinnvolle Sachen ausprobieren kannst. Ebenso ist ein Logic Analyzer (Da 
tuts auch ein günstiger zB von Saleae) sehr sinnvoll.

von David P. (chavotronic)


Lesenswert?

Das zweiter Board könnte ein Discovery sein..ist ein wenig günstiger und 
hat den Debugger drauf.

von Marco (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab jetzt mal den geposteten CAN-Treiber näher angeschaut, aber du 
machst eigentlich auch nichts anders als ich. Leider wurde mir nicht 
ganz klar, wozu folgende Defines benötigt werden:

#define CAN_EN_Low      GPIO_ResetBits(GPIOC, GPIO_Pin_5);
#define CAN_EN_High      GPIO_SetBits(GPIOC, GPIO_Pin_5);
#define CAN_STB_Low      GPIO_ResetBits(GPIOC, GPIO_Pin_6);
#define CAN_STB_High    GPIO_SetBits(GPIOC, GPIO_Pin_6);


Hab in meinem Code das Remap hinzugefügt, welches ich bisher falsch 
interpretiert hatte, aber nach nochmaligem Nachlesen war mir klar, dass 
ich ein

GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE);

benötige um die PB8 / PB9 zu verwenden. Leider funktioniert es danach 
immer noch nicht.

Auch wenn ich es zuvor nicht erwähnt habe, besitze ich das angegebene 
Board 2x wodurch eigentlich eine erfolgreiche Kommunikation stattfinden 
sollte, trotzdem danke für die Tipps diesbezüglich.


Inzwischen konnte ich das Problem darauf eingrenzen, dass die 
CAN_Init()-Funktion fehlschlägt, da er wohl den Initialisierungszustand 
nicht mehr verlässt.
Jedoch kann ich nicht nachvollziehen warum. Der RX-Pin ist dauerhaft 
HIGH und er sollte daher die 13 benötigten rezessiven Bits lesen können, 
um das INAK Bit hardware-seitig zu löschen.
In wiefern könnte eine falsch(?!) Baudrate die erfolgreiche 
Initialisierung verhindern?


PS: Im Anhang der aktuelle Code und die CAN-Lib, die die 
CAN_Init()-Funktion enthält.

von Moritz D. (woisdiekatze)


Lesenswert?

Hab grad ein Tutorial hochgeladen, wo auch das CAN Modul vom STM32 
beschrieben wird. (Empfangsroutinen fehlen noch)

Beitrag "STM32 Tutorial"

In deinem Code muss afaik GPIO_Remap2_CAN1 gegen GPIO_Remap1_CAN1 
ausgetauscht werden. Die Berechnung der Time Quanta ist glaub auch nicht 
ganz richtig. Der Sampling Point muss über 75 % liegen, ansonsten macht 
das Modul nach meiner Erfahrung komische Sachen.

Ich bin übrigens auch in nem Formula Student Team (Erlangen). Gibt schon 
lustige Zufälle.^^

von peterguy (Gast)


Lesenswert?

>#define CAN_EN_Low      GPIO_ResetBits(GPIOC, GPIO_Pin_5);
>#define CAN_EN_High      GPIO_SetBits(GPIOC, GPIO_Pin_5);
>#define CAN_STB_Low      GPIO_ResetBits(GPIOC, GPIO_Pin_6);
>#define CAN_STB_High    GPIO_SetBits(GPIOC, GPIO_Pin_6);

Die Defines brauche ich um die Enable und Standby Leitungen des 
Transceivers (in meinem Fall ein TJA1051) zu schalten.

Ich kenne jetzt deinen transceiver nciht, aber cih könnte mir vorstellen 
daß du den auch auf ähnliche Art und Weise aktiv schalten musst.
Sonst passiert nämlich genau nichts auf deiner CAN Leitung :-)

von Marco (Gast)


Lesenswert?

Alles klar. Muss mir meinen Transeiver nochmal genau anschauen. Aber 
prinzipiell sollte dafür das CAN_CTRL-Bit auf low zuständig sein.

Bezüglich des Remap1... hast wohl recht... hab mich verzählt -.-

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.