[dsPIC33F][ECAN] Fehler beim schnellen Beschreiben von Message-Buffers

OP #2740256
Lesenswert?
• ▲
▼
Hallo,

ich stehe gerade vor einem interessanten Problem, das weder ich noch die 
Errata-Sheets erklären können.

Ich nutze 8 TX-Buffer eines dsPIC33FJ128MC804 (Rev ID A3) um über CAN 
Nachrichten zu verschicken. Mit folgender Funktion habe ich einen 
Sende-FIFO realisiert:
1
char CANputMSG(CANMSG *msg)
2
{
3
  //check for pending messages in all buffers, if there is no msg pending: send.
4
  //begin with buffer 7 (highest priority)
5

6
  if   ( 0 == C1TR67CONbits.TXREQ7)
7
  {
8
    CANwriteBUFFER(msg, 7);    // write message to buffer
9
    C1TR67CONbits.TXREQ7 = 1;  // request CAN-module to send buffer
10
  }else if   ( 0 == C1TR67CONbits.TXREQ6)
11
  {
12
    CANwriteBUFFER(msg, 6);    // write message to buffer
13
    C1TR67CONbits.TXREQ6 = 1;  // request CAN-module to send buffer
14
  }else if   ( 0 == C1TR45CONbits.TXREQ5)
15
  {
16
    CANwriteBUFFER(msg, 5);    // write message to buffer
17
    C1TR45CONbits.TXREQ5 = 1;  // request CAN-module to send buffer
18
  } else if  ( 0 == C1TR45CONbits.TXREQ4)
19
  {
20
    CANwriteBUFFER(msg, 4);    // write message to buffer
21
    C1TR45CONbits.TXREQ4 = 1;  // request CAN-module to send buffer
22
  }else if   ( 0 == C1TR23CONbits.TXREQ3)
23
  {
24
    CANwriteBUFFER(msg, 3);    // write message to buffer
25
    C1TR23CONbits.TXREQ3 = 1;  // request CAN-module to send buffer
26
  }else if  ( 0 == C1TR23CONbits.TXREQ2)
27
  {
28
    CANwriteBUFFER(msg, 2);    // write message to buffer
29
    C1TR23CONbits.TXREQ2 = 1;  // request CAN-module to send buffer
30
  }else if   ( 0 == C1TR01CONbits.TXREQ1)
31
  {
32
    CANwriteBUFFER(msg, 1);    // write message to buffer
33
    C1TR01CONbits.TXREQ1 = 1;  // request CAN-module to send buffer
34
  }else if    ( 0 == C1TR01CONbits.TXREQ0)
35
  {
36
    CANwriteBUFFER(msg, 0);    // write message to buffer
37
    C1TR01CONbits.TX0PRI = 0b11;  // if prio is not set to highest, buffer 0 will not be sent
38
    C1TR01CONbits.TXREQ0 = 1;  // request CAN-module to send buffer
39
  }else
40
  {
41
    return NAK;        // 'negative acknowledge'
42
  }
43
  return ACK;           // 'acknowledge'
44
}

Der Code funktioniert nur einwandfrei, wenn ich die Prioriät des Buffers 
0 manuell erhöhe:
1
C1TR01CONbits.TX0PRI = 0b11;
Setze ich die Priorität nicht manuell nach oben, wird beim schnellen 
Senden (8 Nachrichten direkt hintereinander in alle 8 Buffer) die 
Nachricht im Buffer0 gar nicht (!) gesendet obwohl nach dem Beschreiben 
der 8 Buffer eine Pause von einer Sekunde erfolgt.

Tausche ich die Reihenfolge der Buffer beim Beschreiben (und 
TX-Flag-setzen) wird die Nachricht in Buffer0 trotzdem ignoriert.

Generell funktioniert das Senden über Buffer0. Und wenn ich die 
Reihenfolge ändere (Buffer0 wird auch zum Senden verwendet) und nur 7 
Nachrichten sende werden auch alle 7 verschickt.

Das Problem tritt nur bei 8 Nachrichten, die direkt hintereinander in 
die Puffer geschrieben werden, auf.

Wenn irgendjemand Ideen hat sind die momentan sehr willkommen :)

Viele Grüße und Danke im Voraus,

derbösewolf

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.