Forum: Mikrocontroller und Digitale Elektronik CAN ID und IDMask


von Peter (Gast)


Lesenswert?

Hallo,

arbeite seit kurzem mit dem Lm3S9B96 und bin dabei den CAN in betrieb zu 
nehmen. Soweit funktioniert es ja. Kurz zur Info: Ich send eüber einen 
CAnalyzer CANIDs und daten und empfange die mit dem LM3S9B96, der 
wiederum sendet die über CAN empfangenen Daten über das EPI Bus an das 
Ram im FPGA.
Ich sende 5 IDs: 0x200-0x204. Nur für die ID 0x200 funktioniert 
einwandfrei alles, datenw erden ins Ram sgeschrieben. So sjetzzt kommst, 
für alle anderen IDs wird im FPGA nichts reingeschrieben, das komische 
dabei ist, das wenn ich mit einem LogicAnalyzer das EPI Bus welches mit 
dem FPGA angeschlossen ist untersuche, dann liegen die Adressen und 
Daten richtig an, nur es wird nichts im FPGA geschrieben. So hab mir 
gedacht, gut da stimmt was mit dem write nicht. obwohl das ALE bit und 
write bit gesetzt werden.
Nun was ich gefunden habe ist, dass vielleicht meine IDMASK nicht 
richtig ist. weis leider auch nicht genau wie ich Sie bestimme.
1
sCANMessage.ulMsgID = 0x200;               // CAN msg  ID
2
    sCANMessage.ulMsgIDMask = 0x7ff;          // mask all bits
3
    sCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE| MSG_OBJ_USE_ID_FILTER;
4
    sCANMessage.ulMsgLen = 8;                   // allow up to 8 bytess
5
    CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
6
7
8
   
9
    sCANMessage.ulMsgID = 0x201;               // CAN msg ID
10
       sCANMessage.ulMsgIDMask = 0x7ff;          // mask, all bits must match
11
    sCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
12
    sCANMessage.ulMsgLen = 8;
13
    CANMessageSet(CAN0_BASE, 2, &sCANMessage, MSG_OBJ_TYPE_RX);
14
//
15
  
16
    sCANMessage.ulMsgID = 0x202;               // CAN msg ID
17
       sCANMessage.ulMsgIDMask = 0x7ff;          // mask, all bits must match
18
       sCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
19
       sCANMessage.ulMsgLen = 8;
20
    CANMessageSet(CAN0_BASE, 3, &sCANMessage, MSG_OBJ_TYPE_RX);
21
22
       sCANMessage.ulMsgID = 0x203;               // CAN msg ID
23
       sCANMessage.ulMsgIDMask = 0x7ff;          // mask, all bits must match
24
       sCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
25
       sCANMessage.ulMsgLen = 8;
26
       CANMessageSet(CAN0_BASE, 4, &sCANMessage, MSG_OBJ_TYPE_RX);
27
28
      
29
       sCANMessage.ulMsgID = 0x200;               // CAN msg ID
30
       sCANMessage.ulMsgIDMask = 0x7ff;          // mask, all bits must match
31
       sCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
32
       sCANMessage.ulMsgLen = 8;
33
       CANMessageSet(CAN0_BASE, 5, &sCANMessage, MSG_OBJ_TYPE_RX);

Kann mir einer sagen, wie genau ich die IDMask für meine CANIDs 
bestimme.
Danke,

von Schorschi (Gast)


Lesenswert?

Hi,

na einen Teil der Voruntersuchungen hast du ja schon erledigt.
Wenn ich dich richtig verstehe dann gehen die Daten die du über CAN 
bekommst, und zwar alle IDs an den FPGA. Somit bekommt der 
CAN-Controller alle Daten und filtert diese nicht raus. Sonst würden die 
gefilterten Daten nicht an deinen FPGA gesendet.

Somit liegt das Problem doch in der Kommunikation zwischen 
CAN-Controller und FPGA.

Gruß,
Schorschi.

von Peter (Gast)


Lesenswert?

Danke für deine Antwort,
Hab leider nicht ganz verstanden was du meinst.
Also Di Daten von CAN werden auf dem EPI BUS gesetzt, welchres wiederumg 
mit den PINS vom FPGA angeschlossen ist.
Wie gesagt, bei der CANID 0x200 funktioniert es einwandfrei, nur bei den 
anderen IDS nicht,
wie genau filtere ich denn nun die IDS, das wollte ich ja wissen, wie 
muss  mein IDMAsk denn definiert sein.
Wie ich es gemacht habe ist es falsch?
Danke.

von Peter (Gast)


Lesenswert?

So sieht meine Main loop aus, wenn der CanIntHandler durchgelaufen ist 
und das entsprechende Flag für die bestimmte ID gesetzt hat, werden die 
Daten über dasd EPI gesendet
1
if(g_bRXFlag1)
2
        {
3
            //
4
            // Reuse the same message object that was used earlier to configure
5
            // the CAN for receiving messages.  A buffer for storing the
6
            // received data must also be provided, so set the buffer pointer
7
            // within the message object.
8
            //
9
            sCANMessage.pucMsgData = ucMsgData;
10
11
            //
12
            // Read the message from the CAN.  Message object number 1 is used
13
            // (which is not the same thing as CAN ID).  The interrupt clearing
14
            // flag is not set because this interrupt was already cleared in
15
            // the interrupt handler.
16
            //
17
            CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);
18
            canid = sCANMessage.ulMsgID;
19
                for(i = 0;i<sizeof(ucMsgData);i++){
20
                     message[i] = ucMsgData[i];
21
                }
22
            send_data_epi(&message, canid);
23
24
25
            g_bRXFlag1 = 0;
26
27
            //
28
                    }
29
30
     
31
        if(g_bRXFlag2)
32
        {
33
            sCANMessage1.pucMsgData = ucMsgData1;
34
            CANMessageGet(CAN0_BASE, 2, &sCANMessage1, 0);
35
            canid = sCANMessage1.ulMsgID;
36
            for(i = 0;i<sizeof(ucMsgData1);i++){
37
                 message1[i] = ucMsgData1[i];
38
            }
39
        send_data_epi(&message1, canid);
40
            g_bRXFlag2 = 0;
41
            
42
        }

von Peter (Gast)


Lesenswert?

Kann mir keiner hier weiter helfen, brauche dringend Hilfe!!!!!

von Lutz (Gast)


Lesenswert?

Sind die Message Objects/Filter (kenne den Chip nicht) 2-5 auch 
freigegeben/aktiviert/scharfgeschaltet?

von zoggl (Gast)


Lesenswert?

wenn ich das richtig verstehe holst du dir mit

CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);


nur die gespeicherten Nachrichten mit objektnummer 1 ab (= 200) musst du 
nicht auch die restlichen lesen ( und dann verspeichern)?

von Peter (Gast)


Lesenswert?

Hallo Danke für die Antwort.

Also weiterhin habe ich doch für ein 2tes Objekt wieder die Funktion 
aufgerufen:
CANMessageSet(CAN0_BASE, 2, &sCANMessage, MSG_OBJ_TYPE_RX);
diesmal halt soll dies in Objekt 2 abgelegt werden, und die gspeicherte 
Message vom Objekt 1 wird von dem Inhalt von Objekt 2 überschrieben.

von Peter (Gast)


Lesenswert?

Also hab den LM3S9B96 Chip. was sind diese Message Objects/Filter.
Und wie tue ich die freischalten. Danke.

von codehamster (Gast)


Lesenswert?

Hast du das Beispiel aus dem UserGuide schon durch?

http://www.ti.com/lit/ug/spmu019o/spmu019o.pdf
Kapitel 5 Seite 45

Dann ist mir noch aufgefallen dass du die Message 0x200 2x definierst.

und beim Überfliegen der Userguides ist mir noch diese Zeile Kommentar 
aufgefallen:

// Last message object does not have the MSG_OBJ_FIFO set to indicate 
that
// this is the last message.

von codehamster (Gast)


Lesenswert?

Ich arbeite mich auch gerade in die CAN / CANopen Welt ein.
Ich fand dieses E-Learning angebot noch informativ.
https://www.vector.com/vl_can_introduction_de.html

Registrierung ist pflicht, jedoch kostenlos.
Aber gibt dir einen guten Überblick was da eigentlich so abläuft. 
Inklusive seten der Masken.

Gruss codehamster

von Peter (Gast)


Lesenswert?

Danke für deine Antwort,
Hab das Beispiel schon gelesen, hab soweit das mit der ISMask 
verstanden,  habs ausgeschaltet brauche die nicht, will ja kein 
explizites Message empfangen, unter mehreren IDs, hab ja festdefinierte 
IDs.

was heist das:
// Last message object does not have the MSG_OBJ_FIFO set to indicate
that
// this is the last message.

hab doch kein FIFO.

von Fabio S. (codehamster)


Lesenswert?

Brauchst du nicht wenn du nicht mehr als 8 Byte Daten in deiner Message 
hast.

bist du inzwischen weiter gekommen?
Ich habe nochmal den ganzen Thread gelesen und mir ist nicht mehr klar 
wo dein Problem jetzt eigentlich liegt.

Masken hast du korrekt gesetzt. Wenn du mit "festen" ID's arbeitest.

Erklär doch nochmal was jetzt nicht funktioniert. Aus dem bisherigen 
schliesse ich mich eigentlich der Meinung von Schorschi an.

> Somit liegt das Problem doch in der Kommunikation zwischen
> CAN-Controller und FPGA.

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.