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.
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)
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
intmain(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 */
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.
Senden funktioniert jetzt schonmal. Empfangen muss ich noch schauen. Ich schicke mir von CANoe die NAchricht direkt. Ich sehe die Nachricht auch auf der CAN_RX line, aber im Code kommt die irgendwie noch nicht an. Da muss ich nochmal weiterschauen.
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?
Die Daten die ich dann auslese, sind die Daten aus Mailbox0, also das
was ich sende.
Das ist wohl ganz normal beim FlexCAN-Modul. Der einzige mir bekannte Weg das zu verhindern, ist die eigenen IDs mit dem Empfangsfilter wegzufiltern, sodass sie dir die Message Buffer nicht zumüllen.
Wie kann ich verhindern, dass beim Senden von Mailbox 0 das Bit für
Mailbox 4 gesetzt wird?
Was spricht dagegen bei einer neuen Nachricht über alle Message Buffer zu iterieren und alle eingehenden Nachrichten zu verarbeiten? Mir war das zumindest immer egal, welcher Message Buffer zuerst gefüllt wurde.