Hallo,
ich habe einen S32K144EVB-Q100 -und möchte auf diesen FlexCAN1
verwenden.
Ich habe dazu das Beispiel von FlexCAN0 genommen und überall CAN0 in
CAN1 umbenannt.
Da der message Buffer für FlexCAN1 nicht so groß ist, habe ich hier
weniger buffer mit 0 initialisirt.
Ich habe jetzt zwei Probleme.
1. Wenn ich zyklisch eine CAN-Nachricht schicken möchte, passiert
nichts. Ich sehe noch nicht einmal etwas auf der CAN1_TX Leitung (dort
hängt ein Logikanalyzer dran)
2. Laut dem Referenc Manual ist das Register PCC FlexCAN1 bei einem
Offset von 94h (siehe FlexCAN1_Register.png)
Wenn ich in S32K144.h nachschaue, ist dort ein define
1 | #define PCC_FlexCAN1_INDEX 37
|
Dies wird in der Initialisierung verwendet
1 | PCC->PCCn[PCC_FlexCAN1_INDEX] |= PCC_PCCn_CGC_MASK; /* CGC=1: enable clock to FlexCAN1 */
|
Wie passt das überein?
1 | int main(void)
|
2 | {
|
3 | /*!
|
4 | * Initialization:
|
5 | * =======================
|
6 | */
|
7 | WDOG_disable(); /* Disable WDOG */
|
8 | SOSC_init_8MHz(); /* Initialize system oscillator for 8 MHz xtal */
|
9 | SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
|
10 | NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
|
11 | FLEXCAN1_init();
|
12 | PORT_init(); /* Configure ports */
|
13 | LPSPI1_init_master(); /* Initialize LPSPI 1 as master */
|
14 | LPIT0_init(); /* Initialize PIT0 for 500 ms timeout */
|
15 | SBC_Init();
|
16 | lightInit_v();
|
17 |
|
18 | for(;;)
|
19 | {
|
20 | while (0 == (LPIT0->MSR & LPIT_MSR_TIF0_MASK)) {} /* Wait for LPIT0 CH0 Flag */
|
21 | toggleAnalyzePin_v();
|
22 | toggleLightPin_v(color);
|
23 | LPIT0->MSR |= LPIT_MSR_TIF0_MASK; /* Clear Flag */
|
24 | FLEXCAN1_transmit_msg();
|
25 | }
|
26 | }
|
PORT_init():
1 | void PORT_init (void)
|
2 | {
|
3 | /*!
|
4 | * Pins definitions
|
5 | * ===================================================
|
6 | *
|
7 | * Pin number | Function
|
8 | * ----------------- |------------------
|
9 | * SPI
|
10 | * PTB14 | LPSPI1_SCK
|
11 | * PTB15 | LPSPI1_SIN
|
12 | * PTB16 | LPSPI1_SOUT
|
13 | * PTA6 | LPSPI1_PCS1
|
14 | *
|
15 | * GPIO
|
16 | * PTD16 | GPIO output [LED_GREEN]
|
17 | * PTD15 | GPIO output [LED_RED]
|
18 | *
|
19 | * CAN
|
20 | * PTA12 | CAN1_RX
|
21 | * PTA13 | CAN1_TX
|
22 | *
|
23 | */
|
24 | // SPI
|
25 | PCC->PCCn[PCC_PORTB_INDEX ]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTB */
|
26 | PORTB->PCR[14]|=PORT_PCR_MUX(3); /* Port B14: MUX = ALT3, LPSPI1_SCK */
|
27 | PORTB->PCR[15]|=PORT_PCR_MUX(3); /* Port B15: MUX = ALT3, LPSPI1_SIN */
|
28 | PORTB->PCR[16]|=PORT_PCR_MUX(3); /* Port B16: MUX = ALT3, LPSPI1_SOUT */
|
29 | //PORTB->PCR[17]|=PORT_PCR_MUX(3); /* Port B17: MUX = ALT3, LPSPI1_PCS3 */
|
30 | PCC->PCCn[PCC_PORTA_INDEX ]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTA */
|
31 | PORTA->PCR[6]|=PORT_PCR_MUX(3); /* Port A06: MUX = ALT3, LPSPI1_PCS3 */
|
32 |
|
33 | // GPIO
|
34 | PCC->PCCn[PCC_PORTD_INDEX ]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTD */
|
35 | PORTD->PCR[16]|=PORT_PCR_MUX(1); /* Port D16: MUX = ALT1, GPIO */
|
36 | PTD->PDDR |= 1<<16; /* Port D16: Data Direction= output */
|
37 | PORTD->PCR[15]|=PORT_PCR_MUX(1); /* Port D16: MUX = ALT1, GPIO */
|
38 | PTD->PDDR |= 1<<15; /* Port D16: Data Direction= output */
|
39 | PORTA->PCR[11]|=PORT_PCR_MUX(1); /* Port A11: MUX = ALT1, GPIO */
|
40 | PTA->PDDR |= 1<<11; /* Port A11: Data Direction= output */
|
41 | PTA->PSOR |= 1<<11; // low
|
42 |
|
43 | // CAN
|
44 | PORTA->PCR[12] |= PORT_PCR_MUX(5); /* Port A12: MUX = ALT5, CAN0_RX */
|
45 | PORTA->PCR[13] |= PORT_PCR_MUX(5); /* Port A13: MUX = ALT5, CAN0_TX */
|
46 |
|
47 | }
|