Forum: Mikrocontroller und Digitale Elektronik Problem mit CAN(-FD) und PIC32CZ µC


von Fabian N. (flyget)


Lesenswert?

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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Hast du evtl. was mit Cache gemacht? Wenn dein msg RAM gecacht ist wäre 
das evtl. eine Erklärung.

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.