Forum: Mikrocontroller und Digitale Elektronik stm32 und can


von Benni N. (benninori)


Lesenswert?

Hi,

ich schlag mich grad mit der CAN-Schnittstelle meines Controllers rum. 
Da mir irgendwie die Erfahrung fehlt um mit Beispielprogrammen von 
Anderen richtig umzugehen erde ich wohl doch selber weiterbastel und mir 
hier und da Teile aus den Beispielen umbauen.
Jetzt hab ich mal ne Frage zum bit timing register:
Im reference manual steht bei dem register es wäre im 
Initialisierungsmodus zugänglich. An anderer Stelle hab ich aber gelesen 
es wäre nur im Sandbymodus beschreibbar. Was stimmt da nun?
Hat da noch jemand eine erklärung zu SJW,TS2 und TS1 für mich? Da steig 
ich noch nicht wirklich durch.

von Alex (Gast)


Lesenswert?

Initialisierungsmodus zugänglich
=> richtig

Hat da noch jemand eine erklärung zu SJW,TS2 und TS1 für mich?
=> da gibt es genug gute Webseiten ...
http://www.google.de/#hl=de&ei=WoMGS8LtBZGC_QbNjsBQ&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CAYQBSgA&q=CAN+bit+timing&spell=1&fp=bcbbe29aaa5468
(die Treffer 1-3 sollten ausreichen)

von (prx) A. K. (prx)


Lesenswert?


von Benni N. (benninori)


Lesenswert?

Danke Jungs, der Beitrag "CAN Baudrate - Erfahrungswerte" ist mir 
inzwischen auch aufgefallen. da kämpf ich mich jetzt grad mal durch.

von Benni N. (benninori)


Lesenswert?

OK, so einigermaßen habe ich das jetzt mit dem Timing geschnallt. Da 
muss ich aber schon nochmal nachhaken.
Aber mal abgesehen davon müsste doch auch, wenn das nicht richtig 
eingestellt ist auch was rauskommen oder? Dann liegt mein Fehler wohl 
schon viel früher. Also hier mal mein Programmablauf:

ich remape CAN1 und initiolisiere die entsprechenden GPIOs
anschließend initialisier ich folgendermaßen:

void CanInit()
{
  pCAN->MCR   = 0x00000001;         //Initialisierungsmodus

  while (!(pCAN->MSR & 0x00000001)) //weiter wenn Initialisierungsmodus
  {
  }


  pCAN->BTR   = 0x02440030;         //normaloperation,SJW=2,TS2=TS1=4;
                                      Baudrate=1000000
  pCAN->MCR  |= 0x00000014;     //nur einmal 
senden;Priorität=chronologisch

  pCAN->MCR   = 0x00000014;         //normaler Modus

   while (!(pCAN->MSR & 0x00000C00))//weiter wenn normaler Modus
  {
  }
}

hier schonmal ein sorry an alle die das lieber mit Namen sehen, aber 
finde das mit Hex und Komentaren übersichtlicher.

bis hierhin passiert erstmal nichts auf der Leitung. Führe ich 
allerdings meine senden-Funktion aus springt das Signal auf 0 und rührt 
sich nicht mehr.

void CanSend()
{
  pCAN->TDT0R = 0x00000001;         //1 Datenbyte
  pCAN->TDL0R = 0x00000024;         //Daten
  pCAN->TI0R  = 0x00000001;         //senden

  while (!(pCAN->TSR & 0x04000002))//weiter wenn normaler Modus
  {
  }
}

Hat da vielleicht einer ne Idee dazu? Filter hab ich auch erstmal 
weggelassen.

von Benni N. (benninori)


Lesenswert?

Oder wie läuft das mit dieser Initialisierung? Ich hab auf der anderen 
Seite einen Dongle von Peak und deren Software Namens PCAN-View. Aber 
bewegen tut sich da garnichts auf der Leitung.

von (prx) A. K. (prx)


Lesenswert?

> hier schonmal ein sorry an alle die das lieber mit Namen sehen, aber
> finde das mit Hex und Komentaren übersichtlicher.

Tja... Kaum jemand macht sich die Mühe, fremden Quellcode zu 
analysieren, dessen Registerinhalte von Steuerregistern mit allerlei 
Einzelbits und Bitfeldern summarisch in Hex als 0x12345678 geschrieben 
werden. Es sei denn er wird dafür bezahlt.

Kommentare sind dabei wertlos, weil weder für Compiler noch für Maschine 
rechtsverbindlich und weil nicht selten falsch.

von Benni N. (benninori)


Lesenswert?

Aber wenn da nur Namen stehen weiß immer noch keiner ob da hinten dran 
die richtigen Bits gesetzt. werden.
OK, dann hier mal mein Ablauf ist der wenigstens Korekt oder hab ich was 
vergessen?

ich remape CAN1 und initiolisiere die entsprechenden GPIOs
->Initialisierungsmodus
-> BTR einstellen
-> MCR -> nur einmal senden; Priorität = chronologisch
-> normalerv Modus
-> TDT0R -> Länge einstellen
-> TDL0R -> Daten in Mailbox schreiben
-> TI0R -> TXRQ setzen

von (prx) A. K. (prx)


Lesenswert?

Abschlüsse dran?

Der Dongle ist wahrscheinlich passiv, d.h. er quittiert nicht. Damit 
läuft der Controller in nullkommanix auf Fehler.

Probier für den Anfang mal den Loopback-Modus, und zwar den aktiven, 
d.h. LBKM ohne SILM.

von Benni N. (benninori)


Lesenswert?

aber ich müsste doch erstmal was auf der Datenleitung sehen, oder nicht? 
Hab ein Oszi dran, aber es kommt garnichts raus. nicht ein Bit. Der 
springt nur von High (Ruhepegel) auf Low. weiter nichts.

von (prx) A. K. (prx)


Lesenswert?

Hat die CAN-Unit einen Takt?

von Benni N. (benninori)


Lesenswert?

wie erwartet. mit loop back ist es das gleiche spielchen.

nochmal zu meinem sendevorgang:

TDT0R einstellen
Daten ins TDL0R
TI0R setzten


stimmt das? mir ist grad noch das RF0R-Register aufgefallen. was ist mit 
dem RFOM0?

von Benni N. (benninori)


Lesenswert?

sollte, aber du hast recht. das hab ich noch nicht überprüft. das mach 
ich direkt?

von Benni N. (benninori)


Lesenswert?

schade, das wäre ja auch zu einfach gewesen. aber ich setzte im 
RCC-APB1ENR das entsprechende Bit. So einen Taktausgang wie bei der 
USART gibts ja hier leider nicht? sonst könnte ich das auch mal 
messtechnis´ch überprüfen.

von (prx) A. K. (prx)


Lesenswert?

Steht etwas im ESR?

von Benni N. (benninori)


Lesenswert?

nein, nur 0x00000000. aber bei der Gelegenheit fällt mir auf, dass das 
Problem vermutlich an meinem Initialisierungsmodus liegt. Da schein was 
nicht zu klappen. im MCR steht nämlich noch der resetzustand. da muss 
ich wohl nochmal nachhacken

von (prx) A. K. (prx)


Lesenswert?

Schon mal vorher einen Reset probiert?

von Benni N. (benninori)


Lesenswert?

Komando zurück. das war wohl ein Fehler von mir. MCR und BTR werden 
korekt initialisiert und das ESR ist und bleibt auf Null. Ich vermute 
jetzt mal, dass das Problem an meiner Verbindung zum PC und dem 
PCAN-Dongle liegt. Wie läuft denn das mit der Initialisierung vor dem 
senden? Da muss doch vermutlich eine Kommunikation auf laufen. Bei mir 
ist da nur Stille. Kann das mein Problem sein?

von Benni N. (benninori)


Lesenswert?

mit Reset zeigt sich das gleiche Bild

von (prx) A. K. (prx)


Lesenswert?

Ben Nor schrieb:

> jetzt mal, dass das Problem an meiner Verbindung zum PC und dem
> PCAN-Dongle liegt.

Im Loop-Mode ist die egal.

Aber tu dir und mir mal den Gefallen und dekodiere alle aufgeführten 
Bits in der Initialisierung. Notfalls daneben schreiben.

von Benni N. (benninori)


Lesenswert?

welche Initialisierung meinst du? den Initialisierungmodus oder das vor 
dem senden der daten?

von (prx) A. K. (prx)


Lesenswert?

Die Funktion.

von Benni N. (benninori)


Lesenswert?

Gut, ich glaube ich hab den Knackpunkt gefunden. Laut MSR sind sind 
SLAKI und INAK dauerhaft gesetzt und ich bin somit im Schlaf- und 
Initialisierungsmodus gleichzeitig. Keine Ahnung warum er dann die ganze 
Zeit überhaupt aus der Funktion rausgesprungen ist. Habe jetzt ne kleine 
Wartezeit eingebaut und jetzt hängt er an meiner while-Schleife fest. In 
dieser Schleife setzte ich jetzt im MCR das INRQ dauerhaft zurück und es 
passiert nichts. Ganz komisch finde ich das. SLKI und INAK gleichzeitig 
geht das überhaupt?

von (prx) A. K. (prx)


Lesenswert?

Keine Ahnung. Aber wie wär's mit meinem Vorschlag?

von Benni N. (benninori)


Lesenswert?

bin ich nochmal durchgegangen und ich finde einfach keinen fehler 
irgendwo ist aber der wurm drin. aber da muss ich jetzt halt nochmal 
durchgehen.

aber danke soweit für deine hilfe. das ist garantiert irgend ein kleiner 
scheiß. früher oder später find ich den garantiert. genau aus solchen 
gründen mach ich lieber hard- als software.

von (prx) A. K. (prx)


Lesenswert?

Wer sich nicht helfen lässt, der muss eben selber sehen wo er bleibt.

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.