stm32 und can

OP #1489693
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.
OP #1490029
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.
#1490049
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.
OP #1490080
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
OP #1490179
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?
OP #1490221
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?
OP #1490231
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.

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