CAN mit STM32

Gast #2665312
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
Angehängte Dateien:
Gast #2665421
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.
#2665825
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
Gast #2665861
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.
#2671264
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.
Gast #2674818
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.
Angehängte Dateien:
#2674895
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.^^
Gast #2675584
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 :-)
Gast #2675801
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 -.-

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren