www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN Konfiguration


Autor: Davos Rit (richmand)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte mit eine MCF52235 von Freescale ein kleines CAN-Netzwerk 
aufbauen, habe aber Probleme, bei der Einstellung der 
Übertragungsfrequenz. Wie bei vielen anderen Prozessoren auch, erfolgt 
diese über die Register PRESDIV, PROPSEG, PSEG1 und PSEG2. Nach längeren 
Recherechen muss ich allerdings gestehen, dass ich bei der 
Funktionsweise nicht so richtig durchsteige.

Mein Prozessor hat einen Systemtakt von 60MHz und einen externen Quarz 
mit 25MHz. Wie müsste ich die Register konfigurieren, dass ich bei 
Verwendung der 60MHz eine Übertragungsrate von 1MBit/s einstellen kann.

Gibt es da nicht vielleicht einfach ein Formel, mit der ich die 
einzelnen Registerwerte berechnen kann, bzw. wie schlimm ist es, wenn 
der eingestellte Wert von der gewünschten Übertragungsgeschwindigkeit 
abweicht?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du Glück hast, dann haben diese Felder eine ähnliche Bedeutung wie 
bei anderen CAN Controllern. Dann lässt sich mit den diversen 
Kalkulatoren im Netz was anfangen (Google: can bus bit timing 
calculator).

Die Grundlagen zum Timing findet man beispielsweise dort erklärt: 
http://www.microchip.com/stellent/groups/analog_sg...

Autor: Davos Rit (richmand)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, vielen Dank! Ich denke ich hab's jetzt. das jeder was davon hat 
werde ich meine Lösung hier kurz darstellen.
Werde doch den externen Quarz als Referenz nehmen, da er kleinere 
Toleranzen hat. Alles in Allem habe ich jetzt eine Funktion auf Basis 
einer von Freescale in MQX implementierten Initialisierung geschrieben, 
die mir die jeweilige Baudrate bei Aufruf der Funktion initialisiert:


Baudrate = Systemtakt / (PRESDIV * (PROPSEG + PSEG1 + PSEG2 +1))

PRESDIV = 1..256
PROPSEG = 1..8
PSEG1   = 1..8
PSEG2   = 1..8

In die Register wird jeweils der gewünschte Wert-1 geschrieben

FLEXCAN_REG_STRUCT_PTR beschreibt die Struktur der Register des FlexCAN 
Moduls
uint_32 FLEXCAN_Initialize
(
   /* FlexCAN base address */
   pointer can_ptr,

  /* Bit rate in Kbps */
   uint_32 frequency
)

{ /* Body */
   
   volatile FLEXCAN_REG_STRUCT_PTR        can_reg_ptr;
   volatile FLEXCAN_MSGBUF_STRUCT_PTR     can_bufstruct_ptr;
  
   can_reg_ptr = (FLEXCAN_REG_STRUCT_PTR)can_ptr;

   /*
   ** Select the clock source
   ** Default: external oscillator: 25MHz.
   **      used because of tighter tolerance
   */
  
   can_reg_ptr->CANCTRL &= FFFFDFFF;   //delets SYS_CLK bit

   /*
   **  Baud rate = System clock / (PRESDIV + PROPSEG + PSEG1 + PSEG2 +1)
   **
   **  Register values: Value -1  e.g.:  
   **   PRESDIV should be 1 so the  register value must be 0x00
   **
   */
   
   switch (frequency)
      {
      case (20):
       /*
       ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x2, PSEG1 = 0x8, PSEG2 = 0x8, PRESDIV = 50
       **
       **  sampling point @ 68%
       */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) |MCF_FlexCAN_CANCTRL_RJW(1)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(7)
            | MCF_FlexCAN_CANCTRL_PRESDIV(49));
         break;
      

      case (50):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x2, PSEG1 = 0x8, PSEG2 = 0x3, PRESDIV = 25
         **
         **  sampling point @ 85%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(1)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(2)
            | MCF_FlexCAN_CANCTRL_PRESDIV(24));
         break;
      

      case (100):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x2, PSEG1 = 0x8, PSEG2 = 0x8, PRESDIV = 10
         **
         **  sampling point @ 68%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(1)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(7)
            | MCF_FlexCAN_CANCTRL_PRESDIV(9));
         break;
      

      case (125):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x2, PSEG1 = 0x8, PSEG2 = 0x3, PRESDIV = 10
         **
         **  sampling point @ 85%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(1)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(2)
            | MCF_FlexCAN_CANCTRL_PRESDIV(9));
         break;
      

      case (250):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x2, PSEG1 = 0x8, PSEG2 = 0x3, PRESDIV = 5
         **
         **  sampling point @ 85%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(1)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(2)
            | MCF_FlexCAN_CANCTRL_PRESDIV(4));
         break;
      

      case (500):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x0
         ** RJW = 0x4, PSEG1 = 0x8, PSEG2 = 0x8, PRESDIV = 2
         **
         **  sampling point @ 68%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(3)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(7)
            | MCF_FlexCAN_CANCTRL_PRESDIV(1));
         break;
      

      case (1000):
         /*
         ** PROPSEG = 0x8, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 0x1
         ** RJW = 0x4, PSEG1 = 0x8, PSEG2 = 0x8, PRESDIV = 1
         **
         **  sampling point @ 68%
         */
         
         can_reg_ptr->CANCTRL |= 
         (0 | MCF_FlexCAN_CANCTRL_PROPSEG(7) | MCF_FlexCAN_CANCTRL_RJW(3)
            | MCF_FlexCAN_CANCTRL_PSEG1(7) | MCF_FlexCAN_CANCTRL_PSEG2(7)
            | MCF_FlexCAN_CANCTRL_PRESDIV(0));
         break;
      
      default:
         return (FLEXCAN_INVALID_FREQUENCY);
    

      return (FLEXCAN_OK);
} /* Endbody */

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.