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
1) Hardware - wie sieht's da aus? 2) poste mal bitte deine minimal Konfiguartaion =)
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);
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.