[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

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