Forum: Mikrocontroller und Digitale Elektronik CAN-Bus mit 2 dsPIC´s


von Dominik F. (Firma: XXX) (lobo82)


Lesenswert?

Hallo zusammen!

Ich baue eine Schaltmatrix in der mehrere PCB´s (jeweils bestückt mit 
einem oder mehreren dsPIC33EP512MU810) miteinander über ECAN 
kommunizieren sollen.
Wie ich dem Datenblatt des ECAN- Moduls entnehmen konnte, muss zu diesem 
Zweck jeweils ein DMA Channel zum Senden und Empfangen eingerichtet 
werden.
Soweit ich das beurteilen kann, laufen diese auch ohne weitere Probleme.

void initDMA0(void)
{
     DMA0CONbits.SIZE = 0x0;
     DMA0CONbits.DIR = 0x1;
     DMA0CONbits.AMODE = 0x2;
     DMA0CONbits.MODE = 0x0;
     DMA0REQ = 71;
     DMA0CNT = 7;
     DMA0PAD = (volatile unsigned int) &C2TXD;
     DMA0STAL = (unsigned int) &ecan1TX;
     DMA0STAH = (unsigned int) &ecan1TX;
     DMA0CONbits.CHEN = 0x1;

}
void initDMA2(void)
{
    DMA2CONbits.SIZE = 0x0;
    DMA2CONbits.DIR = 0x0;
    DMA2CONbits.AMODE = 0x2;
    DMA2CONbits.MODE = 0x0;
    DMA2REQ = 55;
    DMA2CNT = 7;
    DMA2PAD = (volatile unsigned int)&C2RXD;
    DMA2STAL = (unsigned int) &ecan1RX;
    DMA2STAH = (unsigned int) &ecan1RX;
    DMA2CONbits.CHEN = 0x1;

}

Die Initialisierung des CAN-Moduls habe ich folgendermassen 
durchgeführt:

void initCAN(void)
{


    // ECAN in Konfigurationsmodus versetzen
    C2CTRL1bits.REQOP = 4;
    while(C2CTRL1bits.OPMODE != 4);
    C2CTRL1bits.WIN = 0;

    C2CFG1 = 0x47; // BRP = 8 SJW = 2 Tq
    C2CFG2 = 0x2D2;
    C2FCTRL = 0xC01F; // No FIFO, 32 Buffers
    initDMA0();
    /* Configure Message Buffer 0 for Transmission and assign priority 
*/
    C2TR01CONbits.TXEN0 = 0x1;
    C2TR01CONbits.TX0PRI = 0x1; // Priorität der Nachrichten
    initDMA2();
    C2FMSKSEL1bits.F0MSK=0x0;

    /* Configure Acceptance Filter Mask 0 register to mask SID<2:0>
     * Mask Bits (11-bits) : 0b111 1111 1000 */

    C2RXM0SIDbits.SID = 0x7F8;

    /* Configure Acceptance Filter 0 to match standard identifier
    Filter Bits (11-bits): 0b011 1010 xxx with the mask setting, 
message with SID range 0x1D0-0x1D7 will be accepted by the ECAN module. 
*/

    C2RXF0SIDbits.SID = 0x01D0;

    /* Acceptance Filter 0 to use Message Buffer 10 to store message */

    C2BUFPNT1bits.F0BP = 0xA;

    /* Filter 0 enabled for Identifier match with incoming message */
    C2FEN1bits.FLTEN0=0x1;

     /* Clear Window Bit to Access ECAN
     * Control Registers */

    C2CTRL1bits.WIN=0x0;


    C2CTRL1bits.REQOP = 0;
    while(C2CTRL1bits.OPMODE != 0);
}

Das CAN - Protokoll setze ich dementsprechend (vereinfacht) wie folgt 
zusammen:
     ecan1TX[0][0] = 0x0748;
     ecan1TX[0][1] = 0x0000;
     ecan1TX[0][2] = 0x0008;
     ecan1TX[0][3] = 0xabcd;
     ecan1TX[0][4] = 0xabcd;
     ecan1TX[0][5] = Cansend; --> Nutzdaten
     ecan1TX[0][6] = Cansend;

Dies wird über eine Senderoutine auf den Bus gelegt. Die anderen Module 
sind so konfigueriert, dass sie den Bus erstmal nur abhören.
Und genau an diesem Punkt kommt das erste Problem:

Ich überwache den Bus mit einem Oszilloskop und einem differenziellen 
Tastkopf. Solange ein Modul an dem Bus angeschlossen ist, wird mir auch 
eine Nachricht auf dem Bus angezeigt. Schalte ich ein weiteres Modul auf 
den CAN-Bus, wird aus dem Nachrichtentakt eine permanente 0, die sich 
nur wieder veränderen lässt, wenn ich beide Module Resete und das 
passive Modul im Reset halte.

Wenn ich CAN richtig verstanden habe, müsste die auf dem Bus "liegende" 
Nachricht solange wiederholt werden, bis der Empfänger das Ack bit mit 
High Priorität überschreibt?!

Hat jemand sonst eine Idee? Ich komme hier seit Tagen nicht mehr voran 
und wäre über Hilfe sehr dankbar.

MfG Dominik

von Frank K. (fchk)


Lesenswert?

Hast Du einen definitiv korrekt funktionierenden CAN-Knoten 
empfangsbereit an Deinem Bus? Es muss mindestens ein funktionierender 
Knoten da sein, der Dein Paket bestätigt. Ansonsten kannst Du nicht 
vernünftig testen, und Deine Fehlersuche wird zur Kaffeesatzleserei.

fchk

von Dominik F. (Firma: XXX) (lobo82)


Lesenswert?

Hi Frank,
nein habe ich leider nicht, evtl muss ich es dann doch erst einmal noch 
mit einem Loop auf den internen Ecan2 Port versuchen. Wäre es so deiner 
Einschätzung nach einfacher eine Fehlersuche zu betreiben?

MfG
Dominik

von Frank K. (fchk)


Lesenswert?

Dominik Franz schrieb:

> nein habe ich leider nicht, evtl muss ich es dann doch erst einmal noch
> mit einem Loop auf den internen Ecan2 Port versuchen. Wäre es so deiner
> Einschätzung nach einfacher eine Fehlersuche zu betreiben?

Ich denke nicht. Besorge Dir ein fertiges, getestetes USB-CAN Interface, 
erst recht wenn das mehr als nur Hobby ist. Ich habe das hier:
http://www.peak-system.com/PCAN-USB.199.0.html
und damit meine Projekte immer ziemlich zügig zum Laufen gebracht.

fchk

von Dominik F. (Firma: XXX) (lobo82)


Lesenswert?

Danke für den Tip, habe den Adapter gerade geordert. Hoffe es kommt 
rechtzeitig, habe hier "leichten" Termindruck.

MfG

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.