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
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.
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
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.
> 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.
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.
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.^^
>#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 :-)
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 -.-