Ich habe doch noch Probleme (Verständnisprobleme) zum Empfangen von den
CAN-Nachrichten.
1 | void FlexCAN1SendCanData(uint16_t id_u8, uint8_t* data_pu8, uint8_t lenght_u8)
|
2 | {
|
3 | uint32_t word0 = 0;
|
4 | uint32_t word1 = 0;
|
5 | uint32_t word2 = 0;
|
6 | uint32_t word3 = 0;
|
7 |
|
8 | word0 = 0x0C400000 | (8 << CAN_WMBn_CS_DLC_SHIFT); /* MB0 word 0 */
|
9 | /* bit 31: EDL=0: */
|
10 | /* bit 30: BRS=0: */
|
11 | /* bit 29: ESI=0: */
|
12 | /* bit 27-24: CODE=0xC: Activate tx */
|
13 | /* bit 22: SRR=1 Tx frame */
|
14 | /* bit 21: IDE=0: Standard ID */
|
15 | /* bit 20: RTR = 0*/
|
16 | /* bit19-16:DLC=8 */
|
17 | /* bit 15-0: TIME STAMP = 0 */
|
18 | word1 = ((uint32_t)id_u8 << 18); /* MB0 word 1 */
|
19 | /* Tx msg with STD ID 0x555 */
|
20 | /* bit 31-29: PRIO = 0 */
|
21 | /* bit 28-18: ID (standard) = 0x555 */
|
22 | /* bit 17-0: ID (extended) = 0x00 */
|
23 |
|
24 | word2 = data_pu8[0] | ((uint32_t)data_pu8[1] << 8) | ((uint32_t)data_pu8[2] << 16) | ((uint32_t)data_pu8[3] << 24); /* MB0 word 2 */
|
25 | word3 = data_pu8[4] | ((uint32_t)data_pu8[5] << 8) | ((uint32_t)data_pu8[6] << 16) | ((uint32_t)data_pu8[7] << 24); /* MB0 word 3 */
|
26 |
|
27 |
|
28 | CAN1->IFLAG1 = 0x00000001; /* Clear CAN 1 MB 0 flag without clearing others*/
|
29 | CAN1->RAMn[ 0*MSG_BUF_SIZE + 1] = word1;
|
30 | CAN1->RAMn[ 0*MSG_BUF_SIZE + 2] = word2;
|
31 | CAN1->RAMn[ 0*MSG_BUF_SIZE + 3] = word3;
|
32 | CAN1->RAMn[ 0*MSG_BUF_SIZE + 0] = word0;
|
33 | }
|
34 |
|
35 | void FLEXCAN1_receive_msg(void)
|
36 | {
|
37 | uint8_t j;
|
38 | uint32_t dummy;
|
39 |
|
40 | RxCODE = (CAN1->RAMn[ 4*MSG_BUF_SIZE + 0] & 0x07000000) >> 24; /* Read CODE field */
|
41 | RxID = (CAN1->RAMn[ 4*MSG_BUF_SIZE + 1] & CAN_WMBn_ID_ID_MASK) >> CAN_WMBn_ID_ID_SHIFT; /* Read ID */
|
42 | RxLENGTH = (CAN1->RAMn[ 4*MSG_BUF_SIZE + 0] & CAN_WMBn_CS_DLC_MASK) >> CAN_WMBn_CS_DLC_SHIFT; /* Read Message Length */
|
43 |
|
44 | for (j=0; j<2; j++)
|
45 | { /* Read two words of data (8 bytes) */
|
46 | RxDATA[j] = CAN1->RAMn[ 4*MSG_BUF_SIZE + 2 + j];
|
47 | }
|
48 | RxTIMESTAMP = (CAN1->RAMn[ 4*MSG_BUF_SIZE + 0] & 0x000FFFF);
|
49 | dummy = CAN1->TIMER; /* Read TIMER to unlock message buffers */
|
50 | CAN1->IFLAG1 = 0x00000010; /* Clear CAN 1 MB 4 flag without clearing others*/
|
51 | }
|
in main.c
1 | for(;;)
|
2 | {
|
3 | while (0 == (LPIT0->MSR & LPIT_MSR_TIF0_MASK)) {} /* Wait for LPIT0 CH0 Flag */
|
4 | LPIT0->MSR |= LPIT_MSR_TIF0_MASK; /* Clear Flag */
|
5 |
|
6 | FlexCAN1SendCanData(0x123, canData_au8, 8);
|
7 | if ((CAN1->IFLAG1 >> 4) & 1)
|
8 | //if (CAN_IFLAG1_BUF4TO1I(4))
|
9 | {
|
10 | FLEXCAN1_receive_msg();
|
11 | }
|
12 | }
|
Mein Problem ist, dass das CAN_IFLAG1_BUF4TO1I(4) bit immer gesetzt ist,
obwohl ich von außen gar keine CAN-Nachrichten sende.
Die Daten die ich dann auslese, sind die Daten aus Mailbox0, also das
was ich sende.
Wird beim senden von Mailbox 0 das bit für Mailbox 4 gesetzt?
Das Bit lösche ich ja eigentlich wieder in FLEXCAN1_receive_msg();
Wie kann ich verhindern, dass beim Senden von Mailbox 0 das Bit für
Mailbox 4 gesetzt wird?