Forum: Mikrocontroller und Digitale Elektronik [dsPIC33F][ECAN] Fehler beim schnellen Beschreiben von Message-Buffers


von Manuel W. (derboesewolf)


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

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.