Forum: Mikrocontroller und Digitale Elektronik PIC empfängt keine CAN-Bus-Nachrichten?


von Stefan S. (humus)


Lesenswert?

Hallo Zusammen,

ich nehme gerade den CAN-Bus in Betrieb. Mein aktueller Stand ist, dass 
ich etwas auf den Bus senden kann (sehe ich am Oszi). Der Identifier ist 
aber nicht der von mir angegebenen sondern immer der gleiche (507). Wenn 
ich dann vom Labview einen Datenstrom auf den CAN-Bus setze, mit dem 
Identifier 3, dann empfange ich diesen nicht. Gerade komme ich einfach 
nicht weiter. Hat jemand eine Idee?

Die Übertragungsrate ist bei beiden Teilnehmern 125 kbits, der uC ist 
ein PIC18F66K80 und ich arbeite mit MikroC pro.
1
/*******************************************************************************
2
3
     MCU:             PIC18F66K80
4
     Oscillator:      HS, 18.0000 MHz
5
 ******************************************************************************/
6
7
8
char SJW, BRP, Phase_Seg1, Phase_Seg2, Prop_Seg;
9
unsigned char Can_Init_Flags, Can_Send_Flags, Can_Rcv_Flags; // can flags
10
unsigned short init_flag, send_flag, dt, len, read_flag;
11
unsigned char Rx_Data_Len;                                   // received data length in bytes
12
char RxTx_Data[8];                                           // can rx/tx data buffer
13
char Msg_Rcvd;                                               // reception flag
14
const long ID_1st = 1365, ID_2nd = 170;                       // node IDs
15
long Rx_ID, mask;
16
17
void main() {
18
  TRISD = 0;
19
  TRISE = 16;                                             // RE4 as input, RE5 as output
20
  PORTC = 0;                                                // clear PORTC
21
  TRISC = 0;                                                // set PORTC as output
22
23
  Can_Init_Flags = 0;                                       //
24
  Can_Send_Flags = 0;                                       // clear flags
25
  Can_Rcv_Flags  = 0;                                       //
26
27
  Can_Send_Flags = _CAN_TX_PRIORITY_0 &                     // form value to be used
28
                   _CAN_TX_XTD_FRAME &                      //     with CANWrite
29
                   _CAN_TX_NO_RTR_FRAME;
30
31
  Can_Init_Flags = _CAN_CONFIG_SAMPLE_THRICE &              // form value to be used
32
                   _CAN_CONFIG_PHSEG2_PRG_ON &              // with CANInit
33
                   _CAN_CONFIG_XTD_MSG &
34
                   _CAN_CONFIG_DBL_BUFFER_ON &
35
                   _CAN_CONFIG_VALID_XTD_MSG;
36
  
37
SJW = 1;
38
BRP = 3;
39
Phase_Seg1 = 7;
40
Phase_Seg2 = 8;
41
Prop_Seg = 7;
42
43
     init_flag = _CAN_CONFIG_SAMPLE_THRICE  &
44
                 _CAN_CONFIG_PHSEG2_PRG_ON  &
45
                 _CAN_CONFIG_STD_MSG        &
46
                 _CAN_CONFIG_DBL_BUFFER_ON  &
47
                 _CAN_CONFIG_VALID_STD_MSG  &
48
                 _CAN_CONFIG_LINE_FILTER_OFF;
49
50
     send_flag = _CAN_TX_PRIORITY_0          &
51
                 _CAN_TX_STD_FRAME           &
52
                 _CAN_TX_NO_RTR_FRAME;
53
54
     read_flag = 0;
55
56
//
57
// Initialise CAN module
58
//
59
      CANInitialize(SJW, BRP, Phase_Seg1, Phase_Seg2, Prop_Seg, init_flag);
60
//
61
// Set CAN CONFIG mode
62
//
63
      CANSetOperationMode(_CAN_MODE_CONFIG, 0xFF);
64
65
      mask = -1;
66
//
67
// Set all MASK1 bits to 1's
68
//
69
       CANSetMask(_CAN_MASK_B1, mask, _CAN_CONFIG_STD_MSG);
70
71
//
72
// Set all MASK2 bits to 1's
73
//
74
      CANSetMask(_CAN_MASK_B2, mask, _CAN_CONFIG_STD_MSG);
75
//                                                            mask
76
// Set id of filter B1_F1 to 3
77
//
78
      CANSetFilter(_CAN_FILTER_B1_F1,  0x3,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 3
79
      CANSetFilter(_CAN_FILTER_B1_F2,  0x4,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 4
80
      CANSetFilter(_CAN_FILTER_B2_F1,  0x5,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 5
81
      CANSetFilter(_CAN_FILTER_B2_F2,  0x6,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 6
82
      CANSetFilter(_CAN_FILTER_B2_F3,  0x7,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 7
83
      CANSetFilter(_CAN_FILTER_B2_F4,  0x8,_CAN_CONFIG_STD_MSG);   // receive messages with identifier = 8
84
//
85
// Set CAN module to NORMAL mode
86
//
87
      CANSetOperationMode(_CAN_MODE_NORMAL, 0xFF);
88
 RxTx_Data[0] = 9;
89
 PORTC = 0x2;
90
 //CANWrite(Rx_ID, RxTx_Data, 1, send_flag);
91
     for(;;)                                      // Endless loop
92
     {
93
         //
94
         // Wait until a request is received
95
         //
96
         dt = 0;
97
         while(!dt) dt = CANRead(&Rx_ID,  RxTx_Data, &len, &read_flag);
98
         if(Rx_ID == 507)
99
         {
100
          PORTC = 0xFF;
101
         }
102
         else
103
         {PORTC = 0x1;}
104
      }
105
}

Das CANWrite habe ich aktuell ausgegraut. Vielen Dank im Voraus!

VG Stefan

von Zef R. (gokilz)


Lesenswert?

blöde Frage: ist der CAN Transceiver schon in Normal-Mode (Aktiv-Mode)?

von Stefan S. (humus)


Lesenswert?

1
// Set CAN module to NORMAL mode
2
//
3
      CANSetOperationMode(_CAN_MODE_NORMAL, 0xFF);


eigentlich schon ... Ratlosigkeit herrscht :/

von Y. W. (york_w34)


Lesenswert?

Hallo Stefan,

Du hast aber schon an deinen CAN Controller einen Transeiver 
angeschlossen und dann erst mit dem anderen CAN Knoten verbunden?

Gruß

York

von Stefan S. (humus)


Lesenswert?

Ja habe ich, CANTX/RX ist am RE4/5 vom uC angeschlossen. Am VREF habe 
ich VDD/2, alle Verbindungen niederohmig.

Ich habe jedoch nur 1,25V auf der CANH/L Leitung, was VDD/4 entspricht. 
Hatte jemand dieses Problem schon einmal?

von Torsten B. (tbrox)


Lesenswert?

Welchen CAN-Transceiver verwendest du?

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.