Forum: Mikrocontroller und Digitale Elektronik CAN-Bus mit LPC2478


von Paul G. (0xffff)


Lesenswert?

Hallo,
vorweg, ich bin noch relativ unerfahren mit Micrcontrollern, also bitte 
habt etwas Geduld mit mir ;)

Ich versuche gerade, einen CAN-Bus mit einem LPC2478 Entwicklerboard von 
IAR Systems "auszulesen", also erstmal geht es mir nur darum, dass ich 
mitlesen kann.
Der Bus läuft mit 500kHz.
Zum Testen habe ich mal einen kleinen Code gebastelt, der einfach ein 
"|" auf den Bildschirm schreibt, wenn eine bekannte ID auf dem Bus 
liegt...allerdings tut sich leider überhaupt nichts.
Hier mal mein Code:
1
PCONP |= (1<<13);   //power an
2
CAN2MOD |= 0x01;    //reset mode
3
PCLKSEL0 = 0x00;    //pclk = cpu clock
4
INTWAKE |= 0x40;    //wakeup bei aktivitaet
5
PINSEL0 |= 0x1;     //funktion RD1
6
CAN1RDA = 0x00;   
7
CAN1RDB = 0x00;
8
AFMR = 0x02;        //filter erstmal aus
9
CAN1BTR = 0x1C0002; //btr = pclk/2
10
CAN1MOD = 0x02;     //listening mode
11
12
13
while(true){
14
    if(CAN1RID == 0x05){
15
        GLCD_print("|");
16
    }
17
    CAN1CMR |= 0x04;
18
}
Kann das so überhaupt funktionieren? Ich habe im Internet nach 
Beispielen gesucht, aber so wirklich fündig bin ich nicht geworden. Und 
dir mitgelieferten Dokumente sind ja doch eher etwas bescheiden, gerade 
für Anfänger. Also auch wenn der Ansatz komplett falsch ist, würde ich 
mich freuen, wenn jemand helfen kann (natürlich erwarte ich keinen 
fertigen Code).

Viele Grüße und Danke schonmal,
Paul

von pschober (Gast)


Lesenswert?

Hallo Paul

du hast den Acceptance Filter aktiviert (AFMR = 0x02), ohne ID's zu 
definieren. Um zu testen, würde ich den Filter erstmal auf Bypass 
stellen (AFMR = 0x01).

von Paul G. (0xffff)


Lesenswert?

Danke für deine Antwort. Aber bist du sicher, dass das mit dem AFMR 
nicht richtig ist so?
Lauf Manual ist Bit 1 (bei 0 angefangen zu zählen) das AccBP, welches 
man auf 1 setzen soll, um den Bypass zu nutzen.
1
Acceptance Filter Bypass Mode (AccBP): By setting the AccBP bit in the Acceptance Filter Mode Register,
2
the Acceptance filter is put into the Acceptance Filter Bypass mode. During bypass mode, the internal state
3
machine of the Acceptance Filter is reset and halted. All received CAN messages are accepted, and
4
acceptance filtering can be done by software.
Wenn dann müssten beide Bits gesetzt werden, also AFMR = 0x03, oder 
verstehe ich das falsch?

von Peter (Gast)


Lesenswert?

Für Bypass muss AFMR auf 3 gesetzt werden

von pschober (Gast)


Lesenswert?

Stimmt, da bin ich um ein Bit verrutscht. AFMR = 0x02 ist korrekt.
Bei PCLKSEL0 stimmt entweder der Wert (Clk/4) oder der Kommentar nicht.
In der zweiten Zeile schickst du den zweiten CAN Controller in den Reset 
Mode, initialisierst dann aber den ersten. Mit welchem Takt läuft denn 
der Controller ?

von Paul G. (0xffff)


Lesenswert?

Die Zeile mit dem reset war ein Tippfehler, sorry. Natürlich muss es 
CAN1MOD heißen.

Mit der PCLK stimmt natürlich auch...die CPU sollte auf 72MHz laufen, 
jedenfalls habe ich nichts am Takt verändert.
CLKSRCSEL ist 1 und CCLKCFG = 0, also die Standardwerte. Allerdings muss 
ich zugeben, dass ich noch nicht ganz durchgeblickt habe, wie das mit 
dem Main Oscillator ist..irgendwie kann man den Takt ja auch nochmal 
setzen!? Ich habe nur bei meiner Suche irgendwo gelesen, dass die CPU 
stndardmäßig auf der maximalen Frequenz, also auf 72MHz läuft und habe 
dann mit der Annahme nach der Formel:
t = [(BRP+1) * ((SWJ+1) + (TSEC+1) + (TSEC2+1))] / PCLK
gerechnet, also nach PCLK umgestellt und für t=2µs eingesetzt (500kHz). 
SWJ, TSEC1 und TSEC2 habe ich auch auf den Standardwerten gelassen.
Jetzt fällt mir aber auf, dass BRP dann 1 ergibt..hatte das -1 vorher 
vergessenn.

Ich habe es gerade nochmal probiert, sowohl mit BRP 1 als auch mit 2, 
aber funktionieren tut es immernoch nicht. Irgendwie habe ich den 
Verdacht, dass es an dem Timing liegt, wollte mich aber vergewissern, 
dass ich nichts wichtiges vergessen oder falsch gemacht habe.

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.