Manchmal geht es schneller als man denkt ;) Hab nun herausgefunden,
woran das Problem lag. Hier ein kurzer Bericht, für alle die evtl. mal
vor dem selbigen stehen:
Der Fehler lag nicht in meiner Funktion sondern in der von Dave
erzeugten Funktion CAN_ubWriteFIFO() und zwar an folgender Stelle:
1 | ...
|
2 | CAN_vWriteCANAddress(CAN_MOCTR(j));
|
3 | CAN_vReadEN(); // Readmode is Enabled
|
4 |
|
5 | if((CAN_DATA1 & 0x01)== 0x00) // if reset TXRQ
|
6 | {
|
7 | if(j == CAN_DATA3) // last MO in a list
|
8 | {
|
9 | // WritePtr = BOT of the base object
|
10 | CAN_vWriteCANAddress(CAN_MOFGPR(ubObjNr));
|
11 | CAN_vReadEN(); // Readmode is Enabled
|
12 | aubFIFOWritePtr[ubObjNr] = CAN_DATA0;
|
13 | }
|
14 | else
|
15 | {
|
16 | // WritePtr = PNEXT of the current selected slave
|
17 | aubFIFOWritePtr[ubObjNr] = CAN_DATA3;
|
18 | }
|
19 |
|
20 | CAN_vWriteCANAddress(CAN_MOCTR(j)); // Addressing CAN_MOCTRn register
|
21 | CAN_vWriteCANData(0x00000008); // reset NEWDAT
|
22 | ...
|
Hier soll eigentlich sichergestellt werden, dass wenn das letzte
Message-Objekt des Sende-FIFOs gerade zum Senden genutzt werden soll,
dass bei der nächsten Sendeanforderung wieder das erste Objekt genutzt
wird. Dies wird in aubFIFOWritePtr[ubObjNr] gespeichert. Leider prüft
die Funktion nicht ob das aktuelle Objekt das letzte im FIFO ist sondern
ob es das letzte in der Liste ist! D.h. mein FIFO geht von den Objekten
0-7, die Liste aber von 0-31 (da die Liste auch den Empfangs-FIFO
beinhaltet). Also wurde versucht, nachdem 8 Pakete gesendet wurden, das
Message Objekt 8 zum senden zu nutzen, was aber ein Receive Message
Object ist!
Hier die überarbeitet Version, die auf den ersten Blick bei mir wie
gewünscht funktioniert:
1 | ...
|
2 | CAN_vWriteCANAddress(CAN_MOCTR(j));
|
3 | CAN_vReadEN(); // Readmode is Enabled
|
4 |
|
5 | if((CAN_DATA1 & 0x01)== 0x00) // if reset TXRQ
|
6 | {
|
7 | CAN_vWriteCANAddress(CAN_MOFGPR(ubObjNr)); // Zeiger-Register des Base-Objektes laden
|
8 | CAN_vReadEN(); // Readmode is Enabled
|
9 |
|
10 | if(j == CAN_DATA1) // prufen ob letztes MsgObj im Sende-FIFO (=TOP-Objekt)
|
11 | {
|
12 | // WritePtr = BOT of the base object
|
13 | CAN_vWriteCANAddress(CAN_MOFGPR(ubObjNr));
|
14 | CAN_vReadEN(); // Readmode is Enabled
|
15 | aubFIFOWritePtr[ubObjNr] = CAN_DATA0;
|
16 | }
|
17 | else
|
18 | {
|
19 | // WritePtr = PNEXT of the current selected slave
|
20 | CAN_vWriteCANAddress(CAN_MOCTR(j));
|
21 | CAN_vReadEN(); // Readmode is Enabled
|
22 | aubFIFOWritePtr[ubObjNr] = CAN_DATA3;
|
23 | }
|
24 |
|
25 | CAN_vWriteCANAddress(CAN_MOCTR(j)); // Addressing CAN_MOCTRn register
|
26 | CAN_vWriteCANData(0x00000008); // reset NEWDAT - OK, Funktioniert!
|
27 | ...
|
Die Änderung besteht eigentlich nur darin, dass nicht auf das Ende der
Liste sondern auf das Ende des FIFOs geprüft wird (Vergleich mit dem
TOP-Zeiger des Transmit-FIFO Base-Objektes).
Ich hoffe das ich damit anderen ein paar Stunden Fehlersuche ersparen
konnte ;)
Viele Grüße,
Daniel