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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin M. (capiman2)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.