CAN bus

katia

Neues Mitglied
30. Jan. 2008
1
0
0
Sprachen
hallo leute,
ich brauche Ihre Hilfe, ich suche ein Codebeispiel im C, wie man eine Nachricht per CAN-Bus senden kann, und wie man das Bit-Timing berechnet. Ich habe das folgende Beispiel, aber ich komme nicht zu den Ergebnissen.

Auf eine baldige Antwort freue ich mich.





/* set CAN controller baudrate

F_Bit = CLK_IO / (1 + PRS+1 + SJW+1 + PHS1+1 + PHS2+1) * (BRP+1)
= CLK_IO / (1 + CANBT2[3:1]+1 + CANBT2[6:5]+1 + CANBT3[3:1]+1
+ CANBT3[6:4]+1) * (CANBT1[6:1]+1)

for F_Bit = 250 KBS @ CLK_IO = 8 MHz
|
| for F_Bit = 250 KBS @ CLK_IO = 5 MHz
| |
BRP = 3 1 (range: 0 - 63)
PRS = 2 4 (range: 0 - 7)
SJW = 0 0 (range: 0 - 3)
PHS1 = 1 1 (range: 0 - 7)
PHS2 = 1 1 (range: 0 - 7)
 
Hallo katia,

habe mich in der vergangenheit ausführlich mit CAN Controller auseinander gesetzt und mal einen Siemens SAE 81C90/91 von einem Motorola DSP 56303 aus programmiert.

Eine Initialisierungssequenz für einen CAN-Controller könnte wie folgt aussehen:
Code:
/* -----------------------------------------------------------------------
 * Initialisierungsroutine fuer den CAN-Controller SAE 81C90/91
 * -----------------------------------------------------------------------
 */
void CAN_Init81C90_91(void)
{
    /*-----------------------------------------------------*/
    int lauf;
    /*-----------------------------------------------------*/
   /* Initialisierungsmode */
   CAN_WriteByte( MOD, 0x03 );

   /* Monitor mode */
   CAN_WriteByte( CTRL, 0x01 );

   /* Interrupt-Status reset */
   CAN_WriteByte( INTR, 0x00 );

   /* no Baud Rate Prescaler */
   CAN_WriteByte( BRP, 0x04 );      /* 500kBaud */

   /* Bit-Length setzen */
   CAN_WriteByte( BL1, 0x4a );

   /* Bit-Length setzen */
   CAN_WriteByte( BL2, 0x42 );

   CAN_WriteByte( IMSK, 0xE3 ); /* 0x63 BusOff,ErrorPassive und Receive Interrupt free*/
   CAN_WriteByte( RIM1, 0x01 );
   CAN_WriteByte( RIM2, 0x00 );

   /* Output Control */
   CAN_WriteByte( OC, 0x18 );

   /* clear remote pending */
   CAN_WriteByte(0x2f,0xff);
   CAN_WriteByte(RR1,0);
   CAN_WriteByte(0x2f,0xff);
   CAN_WriteByte(RR2,0);

   /* Clear Transmit requests */
   CAN_WriteByte(0x2f,0x00);
   CAN_WriteByte(TRR1,0xff);
   CAN_WriteByte(0x2f,0x00);
   CAN_WriteByte(TRR2,0xff);

   /* Description Register setzen */

   for( lauf = DSCR00; lauf <= DSCR151; lauf++ )
       CAN_WriteByte( lauf, 0x00 );

   /* normal mode mit Auto Decrement */
   CAN_WriteByte( MOD, 0x80 ); /* Alt: 0x00 */

   return;
}

Mit dem Codebeispiel von Dir hier unten komme ich in der Tat auch nicht zurecht.

Welchen Controller verwendest Du? Hast Du einen CAN AVR und wenn ja welchen?

Habe mal in den Datenblättern zum CAN128er geschmöckert und dort finde ich andere Formeln. Da scheint was nicht zu passen.

Ich glaube wir sollten erst mal genau klären was Du für einen µC hast und dann kanns weiter gehen.



Grüße,
Ma:cool:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)