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