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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.