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