ld scripts moved to arch subdirectory.
[LPC2xxx_and_RobotSpejbl.git] / app / arm / can / can.c
blobb3a16938217491f4d24289268edec7fb8a448ca8
1 #include "can.h"
3 volatile int can_msg_received = 0;
4 volatile can_msg_t can_rx_msg;
6 /* private global variables */
7 uint32_t *can_rx_msg_data = (uint32_t*)can_rx_msg.data;
8 can_rx_callback can_rx_cb;
10 void can_init(uint32_t btr, unsigned rx_isr_vect, can_rx_callback rx_cb) {
11 /* enable CAN1 Rx pin */
12 PINSEL1 |= 0x00040000;
13 PINSEL1 &= 0xfff7ffff;
14 /* receive all messages, no filtering */
15 AFMR = 0x2;
16 /* reset mode */
17 C1MOD = 0x1;
18 /* -- addition from lpc2000 maillist msg #3052: */
19 C1CMR = 0x0e; //Clear receive buffer, data overrun, abort tx
20 /* -- end of addition */
21 C1IER = 0x0;
22 C1GSR = 0x0;
23 /* set baudrate & timing */
24 C1BTR = btr;
25 /* register Rx handler */
26 can_rx_cb = rx_cb;
27 /* set interrupt vector */
28 ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (uint32_t)can_rx_isr;
29 ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x20 | 26;
30 /* enable Rx int */
31 VICIntEnable = 0x04000000;
32 C1IER = 0x1;
33 /* normal (operating) mode */
34 C1MOD = 0x0;
35 #if 0
36 /* LPC2119 CAN.5 erratum workaround */
37 C1TFI1 = 0x00000000;
38 C1TID1 = 0x0;
39 C1CMR = 0x23;
40 #endif
43 void can_rx_isr() {
44 can_rx_msg.flags = C1RFS;
45 can_rx_msg.dlc = (can_rx_msg.flags>>16) & 0xf;
46 can_rx_msg.id = C1RID;
47 can_rx_msg_data[0] = C1RDA;
48 can_rx_msg_data[1] = C1RDB;
49 can_msg_received = 1;
50 if (can_rx_cb != NULL)
51 can_rx_cb((can_msg_t*)&can_rx_msg);
52 /* release Rx buffer */
53 C1CMR = 0x4;
54 /* int acknowledge */
55 VICVectAddr = 0;
58 int can_tx_msg(can_msg_t *tx_msg) {
59 uint32_t *data = (uint32_t*)tx_msg->data;
61 /* check, if buffer is ready (previous Tx completed) */
62 if ((C1SR & 0x4) == 0)
63 return -1; /* busy */
64 C1TFI1 = (tx_msg->flags & 0xc0000000) |
65 ((tx_msg->dlc<<16) & 0x000f0000);
66 C1TID1 = tx_msg->id;
67 C1TDA1 = data[0];
68 C1TDB1 = data[1];
69 /* start transmission */
70 C1CMR = 0x21;
71 return 0; /* OK */
74 /*EOF*/