Forum: Mikrocontroller und Digitale Elektronik Ecan am dspic33E will nicht


von Thomas S. (daimonion)


Lesenswert?

Hallo

Ich bin das erste mal dran an einem dsPIC33EP64MC504 Prozessor von 
Microchip das ECan Modul in Betrieb zu nehmen, aber es klappt nicht.
DEr Prozessor wird mit 60 MIPs getaktet und die RX,TX Pins sind auch 
RP41 bzw. RP54 gelegt.

Als erstes wollte ich mal eine ganz einfach Transmit Message generieren, 
die ich auf dem Bus mittels PC Trace Software (natürlich auch Can 
Hardware für den PC) und Osszi nachvollziehe. Wenn das dann klappt, 
hätte ich mich um den Rest gekümmert. Hauptsächlich geht es mir dabei 
auch darum das richtige Bit Timing zu finden und zu schauen ob die 
Hardware funktioniert.
Als Beispiel hab ich Teile aus dem FRM für diesen Prozessor genommen.

Hier mal der Code wie ich ihn derzeit habe:
1
 
2
#define NUM_OF_ECAN_BUFFERS 4 
3
__eds__ unsigned int m_Can_ECanTXRXMsgBuf[NUM_OF_ECAN_BUFFERS][8] __attribute__((eds,aligned(NUM_OF_ECAN_BUFFERS * 16)));   
4
5
can_init(){   
6
7
    /* IO Register initialisieren RPINR26 = RPI41 0x2A RPOR5 = RPI54 0x36 */
8
    RPINR26 = 0x2A;
9
    /* Output RP54 to C1TX (0xD oder 14) setzen */
10
    RPOR5   = 0xD;
11
12
    /* Can Baustein in Konfigurationsmode versetzen */
13
    CAN1SetOperationModeNoWait(CAN_REQ_OPERMODE_CONFIG, CAN_DO_NOT_CMP_DATABYTES);
14
    while(C1CTRL1bits.OPMODE != CAN_OPMODE_CONFIG);
15
16
17
    C1CTRL1bits.CANCKS = 0;
18
    C1CTRL1bits.CSIDL = 0;
19
    C1CTRL1bits.CANCAP = 0;
20
21
    /* Config */
22
    C1CTRL1bits.WIN = 0;
23
    /* Bit Timings */
24
    /* Berechnungsschritte für Can Bit Timing Konfiguration
25
     *
26
     * Step1: CALCULATE THE TIME QUANTUM FREQUENCY (FTQ) Ftq = N*Fbaud
27
     * 12 TQ Pro Bit, gewählt weil es gerade Ergebnisse gibt
28
     * N = 12 -> 250Kbits/s = 4µs Bittime = 12 Quanta/bit = 250ns/Quanta
29
     * Ftq = 12*250*10^3 = 3*10^6
30
     *
31
     * STEP 2: CALCULATE THE BAUD RATE PRESCALER
32
     * BRP = (Fcan/(2 × FTQ))-1 = Fcan = Fcy = 60 * 10^6 Hz
33
     * BRP = (60*10^6/(2*3*10^6))-1 = (60/60)-1 = 0
34
     *
35
     * STEP 3: SELECT THE INDIVIDUAL BIT TIME SEGMENTS
36
     * Phase Segment 2 = 25% -> Gerade TQ Zahl und Sample Point near 70%
37
     * Bit Time = Sync Segment + (Sync Jump Width) + Propagation Segment + Phase Segment 1 + Phase Segment 2
38
     * 12 = 1 + (2) + 4 + 5 + 2 */
39
    C1CFG1bits.BRP = 0x0;
40
    C1CFG1bits.SJW = 0x1;
41
    C1CFG2bits.SEG1PH = 0x4;
42
    C1CFG2bits.SEG2PHTS = 0x1;
43
    C1CFG2bits.SEG2PH = 0x1;
44
    C1CFG2bits.PRSEG = 0x3;
45
46
    //CAN1FIFOCon(CAN_DMA_BUF_SIZE_32 & CAN_FIFO_AREA_TRB0);
47
    C1FCTRL = 0x0000;
48
49
    /* Configure Message Buffer 0 for Transmission and assign priority */
50
    C1TR01CONbits.TXEN0 = 0x1;
51
    C1TR01CONbits.TX0PRI = 0x3;
52
53
54
    uint32 adMsgBuf;
55
56
    /* DMA Config Channel 0 for TX IRQ = 70*/
57
    DMA0CON = 0x2020;
58
    DMA0REQ = 70;
59
    DMA0CNT = 7;
60
    DMA0PAD = (volatile unsigned int)&C1TXD;
61
    adMsgBuf = __builtin_edsoffset(m_Can_ECanTXRXMsgBuf);
62
    adMsgBuf = adMsgBuf & 0x7FFF;
63
    adMsgBuf += __builtin_edspage(m_Can_ECanTXRXMsgBuf) <<15;
64
    DMA0STAL = adMsgBuf & 0xFFFF;
65
    DMA0STAH = adMsgBuf >> 16;
66
    DMA0CONbits.CHEN = 0x1;
67
68
69
    /* start Can */
70
    C1CTRL1bits.REQOP = CAN_OPMODE_NORMAL;
71
    while(C1CTRL1bits.OPMODE != CAN_OPMODE_NORMAL);
72
73
    m_Can_ECanTXRXMsgBuf[0][0] = 0x001C;    /* IDE, RTR = 0 SID = 7 */
74
    m_Can_ECanTXRXMsgBuf[0][1] = 0x0000;    /* EID = 0 */
75
    m_Can_ECanTXRXMsgBuf[0][2] = 0x0008;    /* DLC = Data Length counter = 8 = 8 Wörter sollen übertragen werden */
76
    m_Can_ECanTXRXMsgBuf[0][3] = 0xabcd;
77
    m_Can_ECanTXRXMsgBuf[0][4] = 0xabcd;
78
    m_Can_ECanTXRXMsgBuf[0][5] = 0xabcd;
79
    m_Can_ECanTXRXMsgBuf[0][6] = 0xabcd;
80
81
    /* Request sende Nachricht */
82
    C1TR01CONbits.TXREQ0 = 0x1;
83
    /* Warte auf gesendet */
84
    while(C1TR01CONbits.TXREQ0 == 1);

Im FRM Manual steht das die Zeile
1
 while(C1TR01CONbits.TXREQ0 == 1);
genutzt werden kann um das Acknowledge einer Nachricht abzuwarten.
Aber genau da steckt mein PRoblem. Ich bekomme kein Acknowledge.

Mit dem Osszi seh ich auch keinerlei Busnachricht und auf dem Tracer 
auch nicht.

An was kann es denn liegen, dass meine Nachricht nicht auf dem Bus 
abgesetzt wird?

danke im voraus schon mal für eure Antworten.
Daimonion

von Dosmo (Gast)


Lesenswert?

Ich hatte vor langer Zeit mal ein ähnliches Problem, aber ich weiß 
leider nicht mehr genau, was es war.
Der Code von Microchip hat bei mir nicht funktioniert, warum auch immer.

Ich hab mir damals geholfen, indem ich erstmal den CAN im "Loopback 
Mode" zum Laufen gebracht hab, und später dann im "Normal Mode".
Wenn ich es noch richtig weiß, war der CAN-Kern etwas empfindlich 
insofern, daß alles passen mußte, damit etwas übertragen wurde. Also 
sich Stück für Stück rantasten hat nicht funktioniert. Ich meine, wenn 
im TX-Puffer nicht alles korrekt initialisiert war (z.B. sinnvolle ID), 
hat's nicht getan. Aber ich weiß es leider nicht mehr genau, sorry.

von Dosmo (Gast)


Lesenswert?

Thomas Schm schrieb:
> m_Can_ECanTXRXMsgBuf[0][0] = 0x001C;    /* IDE, RTR = 0 SID = 7 */

Ich seh gerade:
Sowohl in AN1249 (Example 14) als auch in meinem Code wird das "RTR" auf 
1 gesetzt.

von Thomas S. (daimonion)


Lesenswert?

Danke für deine Antworten.

Ja die verschiedenen Beispiel von Microchip kann man vergessen. Zum 
einen compilieren sie unter der IDe v8 aber nicht mehr unter der X und 
zum anderen sind es unvollständige Beispiele, die wahrscheinlich wieder 
in den Zustand rasseln den du beschrieben hast.

Ich hab jetzt schon alles mögliche abgerast, aber mir fallen keinerlei 
Fehler mehr auf. Hab mittlerweile den Tracer erst mal ab und das Osszi 
direkt am TX Pin aber es kommt einfach nichts raus.

Lt. Beschreibung ist das RTR Bit ja nur für eine Remote Transmission 
verantwortlich und sollte somit egal sein. Nichtsdestotrotz werde ich 
auch mal schauen was passiert wenn man das Bit auf 1 setzt.


Wenn noch jemand eine Idee, oder eine Lösung zu dem Problem bieten kann, 
immer her damit.


grüße
Daimonion

von Thomas S. (daimonion)


Lesenswert?

Nochmal ein Frage.

Geht es denn überhaupt, dass ich am CAN eine Nachricht auf dem TX 
ausgeben kann, ohne den RX durchkonfiguriert zu haben ode rmuss ich den 
Can im Controller komplett initialisieren (RX/TX MessageBuffer, DMA, 
etc.)


Grüße
Daimonion

von Thomas S. (daimonion)


Lesenswert?

Ich schreibe nochmal einen neuen Beitrag, damit die Übersicht nicht 
verloren geht.

Ich habe nun nochmal versucht mittels LoopBack Modus und einem Receive 
Filter meine Nachricht erst mal im Prozessor selbst hin und her zu 
schicken.

Der Code sieht so aus:
1
#define CAN_OPMODE_CONFIG 0x4
2
#define CAN_OPMODE_LOOPBACK 0x2
3
#define CAN_OPMODE_NORMAL 0x0
4
#define NUM_OF_ECAN_BUFFERS 32
5
6
7
__eds__ uint16 m_Can_ECanTXRXMsgBuf[NUM_OF_ECAN_BUFFERS][8] __attribute__((eds,aligned(NUM_OF_ECAN_BUFFERS * 16)));
8
9
10
void Can_Init()
11
{
12
    /* IO Register initialisieren RPINR26 = RPI41 0x2A RPOR5 = RPI54 0x36 */
13
    RPINR26 = 0x2A;
14
    /* Output RP54 to C1TX (0xD oder 14) setzen */
15
    RPOR5bits.RP54R = 0xD;
16
17
    /* Can Baustein in Konfigurationsmode versetzen */
18
    CAN1SetOperationModeNoWait(CAN_REQ_OPERMODE_CONFIG, CAN_DO_NOT_CMP_DATABYTES);
19
    while(C1CTRL1bits.OPMODE != CAN_OPMODE_CONFIG);
20
21
22
    C1CTRL1bits.CANCKS = 0;
23
    C1CTRL1bits.CSIDL = 0;
24
    C1CTRL1bits.CANCAP = 0;
25
26
    /* Config */
27
    C1CTRL1bits.WIN = 1;
28
    /* Bit Timings */
29
    /* Berechnungsschritte für Can Bit Timing Konfiguration
30
     *
31
     * Step1: CALCULATE THE TIME QUANTUM FREQUENCY (FTQ) Ftq = N*Fbaud
32
     * 12 TQ Pro Bit, gewählt weil es gerade Ergebnisse gibt
33
     * N = 12 -> 250Kbits/s = 4µs Bittime = 12 Quanta/bit = 250ns/Quanta
34
     * Ftq = 12*250*10^3 = 3*10^6
35
     *
36
     * STEP 2: CALCULATE THE BAUD RATE PRESCALER
37
     * BRP = (Fcan/(2 × FTQ))-1 = Fcan = Fcy = 60 * 10^6 Hz
38
     * BRP = (60*10^6/(2*3*10^6))-1 = (60/60)-1 = 0
39
     *
40
     * STEP 3: SELECT THE INDIVIDUAL BIT TIME SEGMENTS
41
     * Phase Segment 2 = 25% -> Gerade TQ Zahl und Sample Point 75%
42
     * Bit Time = Sync Segment + (Sync Jump Width) + Propagation Segment + Phase Segment 1 + Phase Segment 2
43
     * 12 = 1 + (2) + 2 + 6 + 3 */
44
    C1CFG1bits.BRP = 0x0;
45
    C1CFG1bits.SJW = 0x1;
46
    C1CFG2bits.SEG1PH = 0x5;
47
    C1CFG2bits.SEG2PHTS = 0x1;
48
    C1CFG2bits.SEG2PH = 0x2;
49
    C1CFG2bits.PRSEG = 0x1;
50
51
    C1FCTRL = 0xC01F;
52
53
    /* Configure Message Buffer 0 for Transmission and assign priority */
54
    C1TR01CONbits.TXEN0 = 0x1;
55
    C1TR01CONbits.TX0PRI = 0x3;
56
57
58
    uint32 adMsgBuf;
59
60
    /* DMA Config Channel 0 for TX IRQ = 70*/
61
    DMA0CON = 0x2020;
62
    DMA0REQ = 70;
63
    DMA0CNT = 7;
64
    DMA0PAD = (volatile unsigned int)&C1TXD;
65
    adMsgBuf = __builtin_edsoffset(m_Can_ECanTXRXMsgBuf);
66
    adMsgBuf = adMsgBuf & 0x7FFF;
67
    adMsgBuf += __builtin_edspage(m_Can_ECanTXRXMsgBuf) <<15;
68
    DMA0STAL = adMsgBuf & 0xFFFF;
69
    DMA0STAH = adMsgBuf >> 16;
70
    DMA0CONbits.CHEN = 0x1;
71
72
    /* Assign 32x8word Message Buffers for ECAN1 in device RAM. This example uses DMA1 for RX.
73
    Refer to 21.8.1 ?DMA Operation for Transmitting Data? for details on DMA channel
74
    configuration for ECAN transmit. */
75
    DMA1CONbits.SIZE = 0x0;
76
    DMA1CONbits.DIR = 0x0;
77
    DMA1CONbits.AMODE = 0x2;
78
    DMA1CONbits.MODE = 0x0;
79
    DMA1REQ = 34;
80
    DMA1CNT = 7;
81
    DMA1PAD = (volatile unsigned int) &C1RXD;
82
    adMsgBuf = __builtin_edsoffset(m_Can_ECanTXRXMsgBuf);
83
    adMsgBuf = adMsgBuf & 0x7FFF;
84
    adMsgBuf += __builtin_edspage(m_Can_ECanTXRXMsgBuf) << 15;
85
    DMA1STAL = adMsgBuf & 0xFFFF;
86
    DMA1STAH = adMsgBuf >> 16;
87
    DMA1CONbits.CHEN = 0x1;
88
89
    /* RX Filter */
90
    /* Select Acceptance Filter Mask 0 for Acceptance Filter 0 */
91
    C1FMSKSEL1bits.F0MSK = 0x0;
92
    /* Configure Acceptance Filter Mask 0 register to mask SID<2:0>
93
     * Mask Bits (11-bits) : 0b111 1111 1000 */
94
    C1RXM0SIDbits.SID = 0x7F8;
95
    /* Configure Acceptance Filter 0 to match standard identifier
96
    Filter Bits (11-bits): 0b011 1010 xxx with the mask setting, message with SID
97
    range 0x1D0-0x1D7 will be accepted by the ECAN module. */
98
    C1RXF0SIDbits.SID = 0x01D0;
99
    /* Acceptance Filter 0 to check for Standard Identifier */
100
    C1RXM0SIDbits.MIDE = 0x1;
101
    C1RXF0SIDbits.EXIDE = 0x0;
102
    /* Acceptance Filter 0 to use Message Buffer 10 to store message */
103
    C1BUFPNT1bits.F0BP = 0xA;
104
    /* Filter 0 enabled for Identifier match with incoming message */
105
    C1FEN1bits.FLTEN0 = 0x1;
106
    /* Clear Window Bit to Access ECAN
107
     * Control Registers */
108
    C1CTRL1bits.WIN = 0x0;
109
110
    /* start Can */
111
//    C1CTRL1bits.REQOP = CAN_OPMODE_NORMAL;
112
//    while(C1CTRL1bits.OPMODE != CAN_OPMODE_NORMAL);
113
114
    C1CTRL1bits.REQOP = CAN_OPMODE_LOOPBACK;
115
    while(C1CTRL1bits.OPMODE != CAN_OPMODE_LOOPBACK);
116
117
    m_Can_ECanTXRXMsgBuf[0][0] = 0x01D2 << 2;    /* IDE, SRR = 0 SID = 1D2 */
118
    m_Can_ECanTXRXMsgBuf[0][1] = 0x0000;        /* EID = 0 */
119
    m_Can_ECanTXRXMsgBuf[0][2] = 0x0008;        /* RTR = 0, DLC = Data Length counter = 8 = 8 Wörter sollen übertragen werden */
120
    m_Can_ECanTXRXMsgBuf[0][3] = 0xabcd;
121
    m_Can_ECanTXRXMsgBuf[0][4] = 0xabcd;
122
    m_Can_ECanTXRXMsgBuf[0][5] = 0xabcd;
123
    m_Can_ECanTXRXMsgBuf[0][6] = 0xabcd;
124
125
    /* Request sende Nachricht */
126
    C1TR01CONbits.TXREQ0 = 0x1;
127
    /* Warte auf gesendet */
128
    //while(C1TR01CONbits.TXREQ0 == 1);
129
    while(1)
130
    {
131
        /* Message was received. */
132
        while (C1RXFUL1bits.RXFUL10 == 0);
133
        C1RXFUL1bits.RXFUL10 = 0;
134
    }

Der Code funktioniert nicht. Proble ist das der RXFUL10 nicht kommt.

Könnt ihr mir hier mal auf die Sprünge helfen, was daran nicht 
funktioniert?

Danke und Grüße
Daimonion

von Dosmo (Gast)


Lesenswert?

Ich weiß leider wirklich nicht mehr genau, was das Problem damals war. 
Aber ich meine mich zu erinnern, daß das ganze Ding komplett 
konfiguriert sein mußte, d.h. es hat nicht geklappt, erstmal das eine 
und dann das andere auszuprobieren.
Ich hab damals den ECAN zuerst im Loopback zum Laufen gebracht, aber als 
ich dann auf NormalMode gegangen bin, kam nix raus.

Hast Du den CAN-Bus korrekt angeschlossen, also mit Terminierung und 
Gegenstelle und allem?
Ich bin mir nicht sicher, aber ich glaube, wenn der sendende Teilnehmer 
kein positives "Ack"-Bit von einem anderen Teilnehmer bekommt, wird der 
Frame gar nicht weiter gesendet.

von Michael H. (morph1)


Lesenswert?

ich seh in deinem beispiel nirgends die unlock-sequence die für PPS 
zuweisungen notwendig ist.

wenn die nicht irgendwo versteckt ist, kommt da mit gutem grund nix raus 
:)

von Thomas S. (daimonion)


Lesenswert?

So, also im LoopBack Mode hab ich mittlerweile ein Telegramm von TX nach 
RX schicken können.

Im normal Mode kommt bisher noch nichts raus, bzw. geht auch noch nichts 
rein.

Hinsichtlich RX werde ich mir morgen nochmal die BitTimings anschauen. 
Da der 33E mit 60 MIPS taktet sind 250 KBits/s gar nicht so schnell 
eingestellt. Ich habs derzeit mit 12 Tq gemacht, wie im Code zu sehen 
ist. Terminierung ist dran und wenn ich vom meinem PC aus ein Telegramm 
schicke sehe ich das bis an den Prozessorpin ran.

@Michael h.

Wie meinst du das mit Unlock Sequenz für PPS?

Den PPS selbst hab ich ja im Code drin:
1
    /* IO Register initialisieren RPINR26 = RPI41 0x2A RPOR5 = RPI54 0x36 */
2
    RPINR26 = 0x2A;
3
    /* Output RP54 to C1TX (0xD oder 14) setzen */
4
    RPOR5bits.RP54R = 0xD;

Genau so hab ich das auch bei der PWM Einheit gemacht. Kannst du mir 
bitte mehr Hinweise zu deiner Aussage geben, dass ich die nötigen 
Einstellungen noch machen kann?

von Michael H. (morph1)


Lesenswert?

Klar mach ich gerne (auch wenn ich mich wundere wieso PWM denn 
funktioniert):

http://ww1.microchip.com/downloads/en/DeviceDoc/S10.pdf

Seite 12: 10.4.4 Controlling Configuration Changes und 10.4.4.1 CONTROL 
REGISTER LOCK

Beschreibung der Funktion steht auch dort.

Viel Erfolg!

von Thomas S. (daimonion)


Lesenswert?

So, jetzt war Michael Schneller. Hier nochmal meine Änderungen am Text.

Hinsichtlich RX, also rein, werde ich mir morgen nochmal die BitTimings 
anschauen. Da der 33E mit 60 MIPS taktet sind 250 KBits/s gar nicht so 
schnell eingestellt. Ich habs derzeit mit 12 Tq gemacht und BRP = 0 SP = 
75%, wie im Code zu sehen ist.
Die PC Karte hat aber bei 250k 16Tq und der Sample Point liegt recht 
weit hinten bei 87,5%. CanOpen lastig, denk ich mal. Allerdings habe ich 
es heute nicht geschafft die Timings an der PC Karte mit 12 Tq auf 250K 
zum laufen zu kriegen. Lt. meiner derzeitigen Rechnung taktet das Ding 
mit den krummen 16 MHZ aus dem Rechner bzw. vom PCI Express Bus. Wie 
gesagt, das werd ich mir morgen mal vornehmen. Wenn dazu jemand aber 
noch einen Beitrag leisten kann, immer her damit.

Terminierung ist dran und wenn ich vom meinem PC aus ein Telegramm 
schicke sehe ich das bis an den Prozessorpin ran. Die TX Leitung ist 
momentan zwischen Prozessor und Transceiver unterbrochen. Ist gar nicht 
so einfach bei einem Pitch von kleiner 0,4 mm zu löten... Das muss ich 
morgen auch erst mal flicken.

Danke Michael für deinen Link. Section 10 hab ich bisher schlichtweg 
übergangen. Hab mir in den letzten 2 Monaten glaub ich ansonsten fast 
alle FRMs und jegliche Millionen andere Dokumente zu dem Prozessor und 
zum 33F durchgelesen.
Ich werde morgen gleich mal schauen was das liebe IOLock Bit da so 
macht. Wenn ich die PPS Register setze.



Danke für eure Hilfe!!!
Daimonion

von Thomas S. (daimonion)


Angehängte Dateien:

Lesenswert?

Guten Morgen.

Nachdem ich die PPS Sequenz eingefügt hab, hat sich die Situation leider 
nicht in der Art entwickelt, dass ich eine Nachricht über den Bus 
empfangen kann. Der Loopback Modus funktioniert. Da schicke ich eine 
Nachricht mit 8 Datenbytes, und der ID 0x1D2 zum Empfänger. Der Rest der 
Buffer ist 0.

Die Nachricht ist bis zum RX PIN verfügbar. Meine PPS Sequenz sieht nun 
folgendermaßen aus:
1
    PPSUnLock;
2
    /* IO Register initialisieren RPINR26 = RPI41 0x29 */
3
    RPINR26 = 0x29;
4
    /* Output RP54 to C1TX (0xE oder 14) setzen */
5
    RPOR5bits.RP54R = 0xE;
6
    PPSLock;

Da war bis eben noch ein Fehler drin der die falschen Pins gesetzt hat.

die Nachricht die ich auf dem Can-Bus absetze sieht so aus, dass die ID 
ebenso auf 0x1D2 gesetzt ist und das DLC Bit auf 8 und in den Datenbytes 
auch was drin steht. Sollte doch eigentlich vom Filter akzeptiert 
werden.

Die Filterkonfig sieht so aus:
1
 /* Set SFR Window to Buffer register in RAM */
2
    C1CTRL1bits.WIN = 1;
3
    /* RX Filter */
4
    /* Select Acceptance Filter Mask 0 for Acceptance Filter 0 */
5
    C1FMSKSEL1bits.F0MSK = 0x0;
6
    /* Configure Acceptance Filter Mask 0 register to mask SID<2:0>
7
     * Mask Bits (11-bits) : 0b111 1111 1000 */
8
    C1RXM0SIDbits.SID = 0x7F8;
9
10
    /* Configure Acceptance Filter 0 to match standard identifier
11
    Filter Bits (11-bits): 0b011 1010 xxx with the mask setting, message with SID
12
    range 0x1D0-0x1D7 will be accepted by the ECAN module. */
13
    C1RXF0SIDbits.SID = 0x01D0;
14
    /* Acceptance Filter 0 to check for Standard Identifier */
15
    C1RXM0SIDbits.MIDE = 0x1;
16
    C1RXF0SIDbits.EXIDE = 0x0;
17
    /* Acceptance Filter 0 to use Message Buffer 10 to store message */
18
    C1BUFPNT1bits.F0BP = 0xA;
19
    /* Filter 0 enabled for Identifier match with incoming message */
20
    C1FEN1 = 0x0;
21
    C1FEN1bits.FLTEN0 = 0x1;
22
    /* Set SFR Window to Control register in RAM */
23
    C1CTRL1bits.WIN = 0;

Was kann denn da jetzt noch falsch sein? Ich hab mal den code als 
txt-Datei angehangen damit das nicht zu unübersichtlich wird.

Edit: Wenn ich eine Nachricht sende, dann seh ich die auch am RX PIN. 
Allerdings sieht die von der Timing Geschichte her sehr viel anders aus 
als die RX Nachricht. Scheinbar doch noch das BitTiming Problem.
Im Bild seht ihr die Nachrichten. Die gelbe ist TX die violette ist RX. 
Jeweils eine Nachricht.

von Thomas S. (daimonion)


Angehängte Dateien:

Lesenswert?

Hier nochmal das Bild.

von Thomas S. (daimonion)


Lesenswert?

Es läuft.

Ich habe nochmal die bitTimings eingestellt, und nun sehe ich im Tracer 
Nachrichten und kann im Controller auch empfangen.

Sauber, das Wochenende kann kommen... :)

Danke an allen für die Hilfe!!!

Grüße
Daimonion

von ECAN1 Geht nicht :) (Gast)


Lesenswert?

Hi,

und wie hast du nun die Bittimings genau eingestellt?

von Thomas S. (daimonion)


Lesenswert?

Hallo

hier mal der Kommentar den ich mir dazu notiert habe:
1
    /* Berechnungsschritte für Can Bit Timing Konfiguration
2
     *
3
     * Step1: CALCULATE THE TIME QUANTUM FREQUENCY (FTQ) Ftq = N*Fbaud
4
     * 16 TQ Pro Bit, gewählt weil es gerade Ergebnisse gibt
5
     * N = 16 -> 250Kbits/s = 4µs Bittime = 16 Quanta/bit = 250ns/Quanta
6
     * Ftq = 16*250*10^3 = 4*10^6
7
     *
8
     * STEP 2: CALCULATE THE BAUD RATE PRESCALER
9
     * BRP = (Fcan/(2 × FTQ))-1 = Fcan = 2 * Fcy = 120 * 10^6 Hz
10
     * BRP = (120*10^6/(2*4*10^6))-1 = (120/8)-1 = 14
11
     *
12
     * STEP 3: SELECT THE INDIVIDUAL BIT TIME SEGMENTS
13
     * Phase Segment 2 = 25% -> Gerade TQ Zahl und Sample Point 75%
14
     * Bit Time = Sync Segment + (Sync Jump Width) + Propagation Segment + Phase Segment 1 + Phase Segment 2
15
     * 16 = 1 + (2) + 4 + 7 + 4 */

Grüße
Daimonion

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.