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 */
18 /* -- addition from lpc2000 maillist msg #3052: */
19 C1CMR
= 0x0e; //Clear receive buffer, data overrun, abort tx
20 /* -- end of addition */
23 /* set baudrate & timing */
25 /* register Rx handler */
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;
31 VICIntEnable
= 0x04000000;
33 /* normal (operating) mode */
36 /* LPC2119 CAN.5 erratum workaround */
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
;
50 if (can_rx_cb
!= NULL
)
51 can_rx_cb((can_msg_t
*)&can_rx_msg
);
52 /* release Rx buffer */
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)
64 C1TFI1
= (tx_msg
->flags
& 0xc0000000) |
65 ((tx_msg
->dlc
<<16) & 0x000f0000);
69 /* start transmission */