Forum: Mikrocontroller und Digitale Elektronik PIC CAN-Module


von Stefan (Gast)


Lesenswert?

Hi,

ich verwende einen PIC32 und wollte mal nur um den CAN ein bisschen zu 
verstehen eine Nachricht mit dem PIC rausschicken. Leider funktioniert 
meine Minimalkonfiguration nicht. Welche Register sind den mindestens 
notwendig um den CAN zum laufen zu bringen?

Gruß Stefan

von Lehrmann M. (ubimbo)


Lesenswert?

1) Hardware - wie sieht's da aus?
2) poste mal bitte deine minimal Konfiguartaion =)

von Stefan (Gast)


Lesenswert?

Also hardware hab ich keine. Ich möchte erst einmal direkt am 
ausgangspin messen ob sich da was tut. Minimialkonfiguration ist:

  C1CONbits.REQOP=4;    //Requestion Operation Mode: CAN Configuration
while(C1CONbits.OPMOD != 4);  //Operation mode STATUS bit


  C1CONbits.CANCAP=1;        //CANTMR Empfangs Zeit wird gespeichert mit 
Nachricht

  C1CONbits.ON=1;        //CAN1-Module is enabled
  while(C1CONbits.CANBUSY == 1);


// !!!!FUNKTIONIERT NICHT KEIN PLAN WARUM!
//C1CONbits.SIDLE=0;        //CAN läuft in IDLE mode weiter

  C1CONbits.DNCNT=0;        //DeviceNet Filter: DO not compare bytes

  /* CAN Control-Register C1CON ENDE */


  /* CAN Control-Register C1CFG */

  C1CFGbits.SEG2PHTS = 1;        // Segment 2 kann frei programmiert 
werden
  C1CFGbits.SEG2PH = 1;      // 2 TimeQuantum fuer letztes Segment

  C1CFGbits.SAM = 1;        // CAN Bus wird dreimal hintereinander 
gesampelt (nur möglich wenn BRP<2)

  C1CFGbits.SEG1PH = 5;      // 6 TimQuantum für zwischen Segment (legt 
sample point fest -> 80%)

  C1CFGbits.PRSEG = 0;      // Verzögerungssegment enthält ein 
TimeQuantum

  C1CFGbits.SJW = 1;        //Synchronisationssprungweite -> muss 
kleiner oder gleich groß wie Segment2 sein

  C1CFGbits.BRP = 31;        // ergibt die länge des TimeQuantums: TQ = 
2*(BRP+1)/ Fsys -> Hier TQ = 2*32/80Mhz = 800ns

  /* CAN Control-Register C1CFG ENDE */

  /* CAN Interrupt Register C1INT */

  C1INTbits.IVRIE = 1;      // Invalid Message received interrupt 
erlaubt

  C1INTbits.WAKIE = 0;      // CAN bus activity wake-up interrupt nicht 
erlaubt

  C1INTbits.CERRIE = 1;      // CAN bus error bit erlaubt

  C1INTbits.SERRIE = 1;        // System error interrupt erlaubt

  C1INTbits.RBOVIE = 1;      //Receive buffer overflow interrupt erlaubt

  C1INTbits.MODIE = 0;      // Mode changed interrupt nicht erlaubt;

  C1INTbits.CTMRIE = 0;      // ??? CAN Timestamp Timer interrupt nicht 
erlaubt

  C1INTbits.RBIE = 1;        // Receive buffer interrupt enabled

  C1INTbits.TBIE = 1;        // Transmit buffer interrupt erlaubt

C1CONbits.REQOP=0x7;    //Requestion Operation Mode: Normal Mode
  while(C1CONbits.OPMOD != 0x7);

von Stefan (Gast)


Lesenswert?

oh...hab noch die fifo konfiguration vergessen zu kopieren:

  C1FIFOBA=0;

  /* C1FIFOCONn CAN FIFO control Register (0..31)*/

    //Transmit FIFO1
    C1FIFOCON1bits.FSIZE = 31;      // 32 Messages tief
    C1FIFOCON1bits.TXEN=1;        // FIFO ist ein Transmit FIFO

    //Receive FIFO2
    C1FIFOCON2bits.FSIZE = 31;      // 32 Messages tief
    C1FIFOCON2bits.TXEN=0;        // FIFO ist ein Transmit FIFO

  //Receive FIFO3
    C1FIFOCON3bits.FSIZE = 31;      // 32 Messages tief
    C1FIFOCON3bits.TXEN=0;        // FIFO ist ein Transmit FIFO

von Alex (Gast)


Lesenswert?

Am einfachsten geht es mit der "peripheral library". Ein simples 
Beispiel, das funktioniert, gibt es hier:
http://ww1.microchip.com/downloads/en/DeviceDoc/can_peripheral_library.zip

Gruß,
Alex

von Stefan (Gast)


Lesenswert?

Hi,

danke. Das ist mir echt ne Hilfe!

Ich hab jetzt mal das programm auf mein PIC 32 Module geladen. Der 
CAN-Ausgangspin zeigt jedoch immer noch keine Regung. Lässt sich daraus 
schließen, dass ich erst noch hardware benötige? oder liegt es vlt. 
daran dass das Beispielprogramm mit einem Explorer 16 Board gemacht 
worden ist und ich ein anderes habe? Der Pin müsste doch trotzdem am TX 
ausgang zucken, oder?

Danke für die Hilfe,

Gruß

Stefan

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.