www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN mit STM32


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Marco (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Unglaublich (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Frank K. (fchk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: peterguy (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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
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.

Autor: peterguy (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hier noch die Anhänge, hoffe das klappt diesmal

Autor: Marco (Gast)
Datum:

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

Autor: David P. (Firma: Lemontronics) (chavotronic)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Beitrag #2671277 wurde vom Autor gelöscht.
Autor: David P. (Firma: Lemontronics) (chavotronic)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das zweiter Board könnte ein Discovery sein..ist ein wenig günstiger und 
hat den Debugger drauf.

Autor: Marco (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Moritz Diller (woisdiekatze)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.^^

Autor: peterguy (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :-)

Autor: Marco (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net