Forum: Mikrocontroller und Digitale Elektronik CAN Nachrichten auf LPC2194 senden


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.
von Benjamin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo liebes Forum!

Ich versuche, CAN-Messages auf einem LPC2194 zu senden. Bisher ist das 
nur leider ohne Erfolg.

Ich bin der Meinung, dass Codemäßig eigentlich alles so ausreichen 
sollte um eine Nachricht zu senden.
Bis auf die Berechnung des BTR. Bei der bin ich mir nicht so sicher. Da 
habe ich bereits ein Excel-Sheet zur Berechnung hier aus dem Forum 
gefunden (das hier: Beitrag "CAN Bus Timing"). Diese 
Werte scheinen aber nicht zu funktionieren... (Ich habe bereits mehrere 
Kombinationen ausprobiert)

Ist es so, dass bei falscher Baudrate Error-Frames auf der anderen Seite 
auftauchen sollten? (Ich habe CANoe auf der anderen Seite als Monitor 
vom Bus)

Das Board hat einen 10 MHz Quartz. Daher sind die ganzen Beispiele für 
das Keil MCB2100 Board nicht funktionsfähig (das hat einen 12 MHz 
Quartz). Denn da ist die Berechnung für C2BTR anders. Ich habe auch in 
dem Ecxel-Sheet keine Kombination finden können, die auf die 
Register-Einträge aus den Keil-Beispielen zielen.

Hier ist mein bisheriger Code:
1
#include "LPC21XX.H"
2
#include "UART.h"
3
4
void sendCanMsg(){
5
6
  // Configure Controller
7
  C2MOD = 0x00000001;     //Set CAN controller into reset
8
//  C2BTR = 0x001C001D;     //Set bit timing to 125k@60MHz FPCLK, SP - 87,5%
9
  C2BTR = 0x00398007;     //Set bit timing to 500k@60MHz FPCLK, SP - 75%
10
  C2MOD = 0x00000000;     //Release CAN controller
11
12
        // Send message if buffer is free
13
  if(C2SR & 0x00000004){     //See if Tx Buffer 1 is free
14
    UARTSendString("Tx Buffer is free \n\r");
15
    unsigned int test;
16
    test = 0xFFFF0000;
17
18
    C2TFI1 = 0x00040000;   //Set DLC to 4 bytes
19
    C2TID1 = 0x00000022;   //Set address to 0x22 Standard Frame
20
    C2TDA1 = test;       //Copy some data into first four bytes
21
    C2CMR =  0x00000021;   //Transmit the message, setting TxBuf1 + Send Request
22
23
    UARTSendString("Message should be sent now \n\r");
24
  } else {
25
    UARTSendString("Tx Buffer is not free \n\r");
26
  }
27
}
28
29
int main(void) {
30
  
31
  PINSEL1 = 0x14000;      //Set CAN2 Rx + Tx Pins
32
  VPBDIV = 0x01;        //Set peripheral Clock to PCLK (=60MHz)
33
34
  UARTInit();          // Init UART
35
36
  UARTSendString("------ Start ----- \n\r");
37
38
  sendCanMsg();
39
}

Ich hoffe, dass sich jemand mit dem Chip auskennt und mir weiterhelfen 
kann :)

Viele Grüße
Benjamin

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Benjamin schrieb:
> Das Board hat einen 10 MHz Quartz. Daher sind die ganzen Beispiele für
> das Keil MCB2100 Board nicht funktionsfähig (das hat einen 12 MHz
> Quartz).

Normalerweise nimmt man immer die PLL zwecks Erzeugung eines höheren 
Takts. Du müsstest da IMHO nur die PLL Parameter auf Deinen Quarz 
anpsassen.

von Benjamin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi Jim,

Danke für den Tipp, PLL war anscheinend zum Teil schon mal die Lösung.
Mit richtig eingestelltem PLL kann ich bisher auf jeden fall 
CAN-Nachrichten Empfangen. Leider gehen immernoch keine Nachrichten 
raus. (Könnte das Eventuell auch ein Hardware-Problem sein? Also dass 
irgendwas mit dem Chip nicht stimmt?)

Für weitere Tipps bezüglich des Codes wäre ich sehr dankbar.

Viele Grüße
Benjamin

von Benjamin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Okay, also für spätere Leser:

Der gesamte Code war voll Funktionsfähig. Prinzipiell ist es gut zu 
wissen, dass man zur CAN-Kommunikation mit einem LPC-Chip, der einen CAN 
Controller hat natürlich auch einen Transceiver benötigt, welche die 
CAN-Signale auch physisch auf den Bus überträgt. Ich finde hier ist der 
name "Controller" ein wenig irreführend.

Das erklärt natürlich, dass nur eingehende Nachrichten erkannt wurden.

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]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.