Datum:
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
Datum:
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).
Datum:
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?
Datum:
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 ?
Datum:
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.