PIC32 und CAN - Remote Transmit Request

OP #3543889
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.
#3544489
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
#3559708
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
#3559775
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren