Nabend,
Tausche aktuell CAN Messages zwischen dem Atmel und dem Rechner aus.
Soweit so gut. Ab und zu kommen Messages die eigentlich keiner sendet.
1 | inline void _CanCopyMessageToMob(CanMessageType_t *Message)
|
2 | {
|
3 | ENTER_CRITICAL_SECTION;
|
4 |
|
5 | // write DLC (Data Length Code)
|
6 | CANCDMOB = Message->Length;
|
7 |
|
8 | if (Message->Flags.Extended == 1)
|
9 | {
|
10 | PORTE^=1<<PE4;//Status LED
|
11 | // Eigentlich dürfe das Flag nie gesetzt sein..!
|
12 | }
|
13 |
|
14 | if (Message->Flags.Extended)
|
15 | {
|
16 | // extended CAN ID
|
17 | CANCDMOB |= (1 << IDE);
|
18 |
|
19 | CANIDT4 = (uint8_t) Message->Identifier << 3;
|
20 |
|
21 | uint32_t temp = Message->Identifier << 3;
|
22 | uint8_t *ptr = (uint8_t *) &temp;
|
23 |
|
24 | CANIDT3 = *(ptr + 1);
|
25 | CANIDT2 = *(ptr + 2);
|
26 | CANIDT1 = *(ptr + 3);
|
27 | }
|
28 | else
|
29 | {
|
30 | // standard CAN ID
|
31 | CANIDT4 = 0;
|
32 | CANIDT3 = 0;
|
33 | CANIDT2 = (uint8_t) Message->Identifier << 5;
|
34 | CANIDT1 = (uint16_t) Message->Identifier >> 3;
|
35 | }
|
36 |
|
37 |
|
38 | if (Message->Flags.Rtr) {
|
39 | CANIDT4 |= (1<<RTRTAG);
|
40 | }
|
41 | else
|
42 | {
|
43 | const uint8_t *p = Message->Data;
|
44 | for (uint8_t i = 0;i < Message->Length;i++)
|
45 | {
|
46 | CANMSG = *p++;
|
47 | }
|
48 | }
|
49 | LEAVE_CRITICAL_SECTION;
|
50 | }
|
Mir ist aufgefallen das:
1 | if (Message->Flags.Extended == 1)
|
2 | {
|
3 | // Eigentlich dürfe das Flag nie gesetzt sein..?!
|
4 | }
|
Das dass Flag gesetzt wird. ABER NICHT VON MIR!
Das heißt es muss ja irgendwas falsch laufen!
Habe die Source und den Header beigefügt. Was übersehe Ich?