www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN-Bus mit LPC2478


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Paul G. (0xffff)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
PCONP |= (1<<13);   //power an
CAN2MOD |= 0x01;    //reset mode
PCLKSEL0 = 0x00;    //pclk = cpu clock
INTWAKE |= 0x40;    //wakeup bei aktivitaet
PINSEL0 |= 0x1;     //funktion RD1
CAN1RDA = 0x00;   
CAN1RDB = 0x00;
AFMR = 0x02;        //filter erstmal aus
CAN1BTR = 0x1C0002; //btr = pclk/2
CAN1MOD = 0x02;     //listening mode


while(true){
    if(CAN1RID == 0x05){
        GLCD_print("|");
    }
    CAN1CMR |= 0x04;
}
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

Autor: pschober (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: Paul G. (0xffff)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
Acceptance Filter Bypass Mode (AccBP): By setting the AccBP bit in the Acceptance Filter Mode Register,
the Acceptance filter is put into the Acceptance Filter Bypass mode. During bypass mode, the internal state
machine of the Acceptance Filter is reset and halted. All received CAN messages are accepted, and
acceptance filtering can be done by software.
Wenn dann müssten beide Bits gesetzt werden, also AFMR = 0x03, oder 
verstehe ich das falsch?

Autor: Peter (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Für Bypass muss AFMR auf 3 gesetzt werden

Autor: pschober (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 ?

Autor: Paul G. (0xffff)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net