Forum: Mikrocontroller und Digitale Elektronik S32K144 FlexCAN1 probleme


von Chandler B. (chandler)


Angehängte Dateien:

Lesenswert?

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
}

von Manuel H. (Firma: Universität Tartu) (xenos1984)


Lesenswert?

Chandler B. schrieb:
> Wenn ich in S32K144.h nachschaue, ist dort ein define#define
> PCC_FlexCAN1_INDEX        37
> Dies wird in der Initialisierung verwendet
> PCC->PCCn[PCC_FlexCAN1_INDEX] |= PCC_PCCn_CGC_MASK; /* CGC=1: enable
> clock to FlexCAN1 */
> Wie passt das überein?

Ich denke, die Register sind 4 byte breit. 37 \* 4 = 148 = 94h.

von Luca E. (derlucae98)


Lesenswert?

Chandler B. schrieb:
> // CAN
>     PORTA->PCR[12] |= PORT_PCR_MUX(5);  /* Port A12: MUX = ALT5, CAN0_RX
> */
>     PORTA->PCR[13] |= PORT_PCR_MUX(5); /* Port A13: MUX = ALT5, CAN0_TX
> */

Der Port-Mux für CAN1 ist 3, nicht 5.

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.