Hallo zusammen,
ich kämpfe aktuell mit dem CAN Peripheral auf einem Microchip Curiosity
Ultra Board. Dort sitzt ein PIC32CZ8110CA80208 µC.
Grundlage:
Ich habe versucht ein möglichst nacktes neues Projekt zu erstellen, ohne
die unzähligen Bibliotheken und zigfach verschachtelten "#defines" aus
Beispielen und Bibliotheken. Grundlegendes, wie die
Register-Definitionen und Adressen habe ich aber aus Beispielprojekten
übernommen. Programiert wird für mich erstmals in der MPLAB X IDE und in
der Sprache C.
Nun zum Problem:
Ich wollte im ersten Schritt eine CAN-Botschaft über einen TX-Buffer
schicken. Nach vielem hin und her scheine ich nun die Clock- und
Peripheraleinstellungen richtig zu haben, allerdings werden die Infos
(CAN-ID, Daten, DLC, ...) meiner Testbotschaft welche im "MSG-RAM"
abgelegt werden erst dann übernommen, wenn ich folgendes Prozedere
durchführe:
- Einen Breakpoint setze und den µC einmal anhalten.
- Einmal im Reiter "Data Memory" der IDE den Speicherbereich vom MSG-RAM
"anschauen"
- Den µC weiterlaufen lassen
Wenn ich dieses Prozedere nicht mache kommen meist Botschaften mit ID =
0x00, DLC = 0, ...
Jemand eine Idee woran sowas liegen kann?
Hier noch ein Code-Ausschnitt mit Kommentaren:
1 | /* Clock/Peripheral Init abgeschlossen */
|
2 |
|
3 | // Testbotschaft definieren
|
4 | txTestbuffer_8Bit[0] = 0x00;
|
5 | txTestbuffer_8Bit[1] = 0x00;
|
6 | txTestbuffer_8Bit[2] = 0x68; // CAN-ID
|
7 | txTestbuffer_8Bit[3] = 0x11; // CAN-ID
|
8 | txTestbuffer_8Bit[4] = 0x00;
|
9 | txTestbuffer_8Bit[5] = 0x00;
|
10 | txTestbuffer_8Bit[6] = 0x3F; // FD, BRS, 64Byte Daten
|
11 | txTestbuffer_8Bit[7] = 0x00;
|
12 | txTestbuffer_8Bit[8] = 0x00; // Datenbyte 0
|
13 | txTestbuffer_8Bit[9] = 0x01; // Datenbyte 1
|
14 | txTestbuffer_8Bit[10] = 0x02;
|
15 | txTestbuffer_8Bit[11] = 0x03;
|
16 | txTestbuffer_8Bit[12] = 0x04;
|
17 | txTestbuffer_8Bit[13] = 0x05;
|
18 | txTestbuffer_8Bit[14] = 0x06;
|
19 | txTestbuffer_8Bit[15] = 0x07;
|
20 | // Daten in Tx-Buffer 1 von MSG-RAM kopieren
|
21 | memcpy(0x200200D8, txTestbuffer_8Bit, 72); // 0x200200D8-> Adresse von Tx-Buffer 1 (CAN_TXBC_TBSA), 72->Länge Bufferelement (18x4Byte)
|
22 | __DSB();
|
23 |
|
24 | __ASM("NOP"); // Hier anhalten und Data Memory Reiter öffnen, dann kommen korrekte Daten
|
25 |
|
26 | /********** MAIN-LOOP ************/
|
27 | while(1)
|
28 | {
|
29 | sleep(200000);
|
30 | CAN3_REGS->CAN_TXBAR = 1; // TX-Buffer senden
|
31 | for(int i=0;i<8;i++)
|
32 | {
|
33 | if(i==7)
|
34 | {
|
35 | txTestbuffer_8Bit[8+i] = txTestbuffer_8Bit[8];
|
36 | memcpy(0x200200D8, txTestbuffer_8Bit, 72); // 0x200200D8-> Adresse von Tx-Buffer 1 (CAN_TXBC_TBSA), 72->Länge Bufferelement (18x4Byte)
|
37 | __ASM("NOP"); // Hier anhalten und Data Memory Reiter öffnen, dann kommen die aktualisierten Daten
|
38 | }
|
39 | else
|
40 | txTestbuffer_8Bit[8+i] = txTestbuffer_8Bit[8+1+i];
|
41 | }
|
42 | }
|
Da tatsächlich zuverlässig korrekte Botschaften ausgegeben werden, wenn
ich das obere Prozedere durchführe, denke ich dass die Clock- und
Peripheral-Einstellungen und Adressen wohl korrekt sein müssen. Wieso
wird der Inhalt aber nicht sauber übernommen wenn ich das Prozedere
nicht durchführe.
Die Projektsettings sollten wohl auf den Default-Einstellungen stehen,
kenne mich aber wie gesagt mit der IDE nicht aus. Ist der erste versuch
mit dem µC und der IDE.
Beste Grüße, frohe Festtage und schonmal besten Dank,
Fabian