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.
Wow. Danke schonmal. Hatte bisher leider noch keine Zeit, das ganze auszuprobieren, aber bald ist ja hoffentlich Wochenende :D
> 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.
Das zweiter Board könnte ein Discovery sein..ist ein wenig günstiger und hat den Debugger drauf.
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 -.-
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.