Forum: Mikrocontroller und Digitale Elektronik PIC32 und CAN - Remote Transmit Request


von Martin M. (capiman2)


Lesenswert?

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.

von Tommy S. (tommys)


Lesenswert?

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

von Martin M. (capiman2)


Lesenswert?

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

von Tommy S. (tommys)


Lesenswert?

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

von Steffen R. (steffen_rose)


Lesenswert?

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
Noch kein Account? Hier anmelden.