Hat jemand von euch schon mal auf einem PIC32 einen CAN Remote Transmit Request (RTR) zum Laufen gebracht? Der PIC32 soll angeblich, ohne viel CPU-Interaktion Daten auf dem CAN senden können bzw. beantworten können. Ich kann ohne Probleme einen RTR versenden. Leider erhalte ich keine Notification/keinen Interrupt (was vermutlich ok ist), aber auch keine Antwort auf meinen RTR. Es gibt in Section 34.5.7 ein Example 34-10, welches einen Filter auf SID 0x100 einrichtet und dann Antworten schicken soll. Ich schicke einen RTR mit SID 0x100, aber keine Reaktion. Hier der Example Code: /* This code example shows how to configure the CAN1 module to respond */ /* to a remote transmit request. */ /* In this case, FIFO1 is configured to respond to the a remote request */ /* on SID = 0x100. */ /* Allocate CAN FIFO memory. */ unsigned int CANFIFO[140]; /* This is the pointer to the reply message. */ CANMessageBuffer * rtrReply; /* Place CAN Module in configuration mode.*/ C1CONbits.REQOP = 4; while(C1CONbits.OPMOD != 4); /* Configure FIFO1 for transmit operation, 4 message buffers and enable */ /* Auto Remote Transmit. */ C1FIFOCON1SET = 0x00000080; /* Set the TXEN bit */ C1FIFOCON1SET = 0x00000004; /* Enable RTR */ C1FIFOCON1bits.FSIZE = 4; /* Configure a filter to accept a message with SID = 0x100. Refer to */ /* 34.8 “CAN Message Filtering” for more details on configuring */ /* filters. In this case, Filter 0 and Mask0 are used. */ C1FLTCON0bits.FSEL0 = 1; /* Point to FIF01 */ C1FLTCON0bits.MSEL0 = 0; /* Select Mask 0 */ C1RXF0bits.SID = 0x100; /* Configure Filter 0. */ C1RXF0bits.EXID = 0; C1RXM0bits.SID = 0x1FF; /* Configure Mask 0. */ C1RXM0bits.MIDE = 1; C1FLTCON0SET = 0x00000080; /* Enable the filter. */ /* Assign FIFO memory to CAN module */ C1FIFOBA = KVA_TO_PA(CANFIFO); /* Place CAN Module in normal mode.*/ C1CONbits.REQOP = 0; while(C1CONbits.OPMOD != 0); /* Form the remote reply message. */ rtrReply = (CANMessageBuffer *)(PA_TO_KVA1(C1FIFOUA1)); rtrReply->messageWord[0] = 0; rtrReply->messageWord[1] = 0; rtrReply->messageWord[2] = 0; rtrReply->messageWord[3] = 0; rtrReply->CMSGSID.SID = 0x100; /* CMSGSID */ rtrReply->CMSGEID.IDE = 0; rtrReply->CMSGEID.DLC = 0x4; rtrReply->messageWord[2] = 0x12BC1245; /* CMSGDAT0 */ C1FIFOCON1bits.UINC = 1; /* FIFO is now ready to respond to RTR. */ Wie kann man so etwas debuggen? Oder hat jemand ebenfalls herausgefunden, dass der Beispiel-Code nicht läuft? Reguläre Receive/Transmit-Kanäle ohne RTR funktionieren.
Hallo, schalte doch zuerst mal den Filter aus. Eventuell hast Du auch die Möglichkeit, den Code so anzupassen, dass Du mitlogst, welche CAN-Frames Dein PIC dann empfängt. Das wäre auf jeden Fall schon mal ein Anfang... An Deinem Code macht mich die letzte Zeile etwas stutzig:
1 | /* FIFO is now ready to respond to RTR. */
|
Hier ist ja erst die Konfiguration abgeschlossen, was passiert in Deinem Code danach? Grüsse, Tommy.S
Hi Tommy, vielen Dank für deine Antwort. Sollte der RTR auch ohne Filter funktionieren? Was passiert dann? Kommt eine Antwort auf jede Anfrage, egal woher? Empfangen ohne Filter habe ich bereits in Benutzung, dass funktioniert. Schöne Grüße, Martin
Hi Martin, Martin Maurer schrieb: > Sollte der RTR auch ohne Filter funktionieren? > Was passiert dann? Kommt eine Antwort auf jede Anfrage, egal woher? Die Remote-Request Funktion sollte auch ohne Filter funktionieren. RTR ist das Bit direkt nach dem Identifier, das sagt, dass es sich um einen Remote-Request handelt. Dein Stück Software sollte also nur antworten, wenn das RTR-Bit gesetzt ist. Wenn natürlich (aus welchem Grund auch immer) die Filtereinstellungen das RTR-Bit maskieren, kommt die entsprechende Nachricht nie an. > Empfangen ohne Filter habe ich bereits in Benutzung, > dass funktioniert. Und siehst Du da alle Botschaften, die Du an Deinen Controller sendest? Ist bei den entsprechenden Botschaften das RTR-Bit gesetzt? Grüsse, Tommy.S
Willst Du per Hardware oder per Software das RTR beantworten? per Hardware: Der CAN Controller antwortet automatisch. Du wirst über den Empfang des RTR nicht informiert. Dazu musst Du aber bereits die Daten im CAN Controller hinterlegt haben. per Software: Das RTR wird empfangen. Du weist daraufhin selbst eine normale Sendenachricht an.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.