PIC CAN-Module

Gast #1857772
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
Gast #1857858
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);
Gast #1857861
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
Gast #1858350
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

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