Forum: Mikrocontroller und Digitale Elektronik CAN Nachrichten auf LPC2194 senden


von Benjamin (Gast)


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)


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)


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)


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.

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.