1 | #include "can.h"
|
2 |
|
3 |
|
4 | /*******************************************************************
|
5 | CAN initialization:
|
6 | Mailbox 0: Receive --> interrupt
|
7 | Mailbox 1: Transmit --> polling
|
8 | *******************************************************************/
|
9 | void can_init (void)
|
10 | {
|
11 | CANGCON |= (1<<SWRES); //reset CAN interface
|
12 |
|
13 | //reset all MObs
|
14 | for (unsigned char i=0; i<15; i++)
|
15 | {
|
16 | CANPAGE = (i<<4); //select MOb
|
17 | CANCDMOB = 0; //disable MOb
|
18 | CANSTMOB = 0; //clear status
|
19 | CANIDT1 = 0; //clear ID
|
20 | CANIDT2 = 0;
|
21 | CANIDT3 = 0;
|
22 | CANIDT4 = 0;
|
23 | CANIDM1 = 0; //clear mask
|
24 | CANIDM2 = 0;
|
25 | CANIDM3 = 0;
|
26 | CANIDM4 = 0;
|
27 | for (unsigned char j=0; j<8; j++)
|
28 | CANMSG = 0; //clear data
|
29 | }
|
30 |
|
31 | //bit timing -> datasheet page 260 (check table)
|
32 | CANBT1 = 0xC6; //500kBits/s // 0x12; // 100 kBit/s 0xC6; // 10 kBit/s
|
33 | CANBT2 = 0x0C;//0x04;
|
34 | CANBT3 = 0x37;//0x13;
|
35 |
|
36 |
|
37 |
|
38 | CANGCON = (1<<ENASTB); //start CAN interface
|
39 |
|
40 | //configure MOb0
|
41 | CANPAGE = (0<<4);
|
42 | CANIDT1 = 0; //ID
|
43 | CANIDT2 = 0;
|
44 | CANIDT3 = 0;
|
45 | CANIDT4 = 0;
|
46 | CANIDM1 = 0; //get all messages
|
47 | CANIDM2 = 0; //1 = check bit
|
48 | CANIDM3 = 0; //0 = ignore bit
|
49 | CANIDM4 = (1<<IDEMSK);
|
50 | CANCDMOB = (1<<CONMOB1) | (1<<IDE); //reception, ext. ID
|
51 |
|
52 | //interrupts
|
53 | CANGIE = (1<<ENIT) | (1<<ENRX) | (1<<ENERR) | (1<<ENERG); //enable receive interrupt //(1<<ENERR) | (1<<ENERG); //enable error interrupt
|
54 | CANIE1 = 0;
|
55 | CANIE2 = (1<<IEMOB0); //Set MOB for which Interrupts are enabled
|
56 | CANSIT1 = 0;
|
57 | CANSIT2 = 0;
|
58 |
|
59 | while (!(CANGSTA & (1<<ENFG))); //wait until module ready
|
60 | }
|
61 |
|
62 | /*******************************************************************
|
63 | CAN transmission via mailbox 1 (polling)
|
64 | *******************************************************************/
|
65 | void can_tx (struct MOb msg)
|
66 | {
|
67 | //enable MOb1, auto increment index, start with index = 0
|
68 | CANPAGE = (1<<4);
|
69 |
|
70 | CANCDMOB = (1<<IDE) | (8<<DLC0); //set IDE bit, length = 8
|
71 |
|
72 | msg.id <<= 3; //write 29 Bit identifier
|
73 | CANIDT4 = (unsigned char) (msg.id&0xF8);
|
74 | CANIDT3 = (unsigned char) (msg.id>>8);
|
75 | CANIDT2 = (unsigned char) (msg.id>>16);
|
76 | CANIDT1 = (unsigned char) (msg.id>>24);
|
77 |
|
78 | for (unsigned char i=0; i<8; i++) //put data in mailbox
|
79 | CANMSG = msg.data [i];
|
80 |
|
81 | CANCDMOB |= (1<<CONMOB0); //enable transmission
|
82 | uart_print("wait for TXOK...!\n");
|
83 | while (!(CANSTMOB & (1<<TXOK))); //wait until complete
|
84 | uart_print("...got it!\n");
|
85 | CANSTMOB &= ~(1<<TXOK); //reset flag
|
86 | }
|
87 |
|
88 | /*******************************************************************
|
89 | CAN receive interrupt service routine (mailbox 0)
|
90 | *******************************************************************/
|
91 | SIGNAL (SIG_CAN_INTERRUPT1) //receive interrupt
|
92 | {
|
93 |
|
94 | PORTE |= 1 << PE6; // LED start an
|
95 | PORTE |= 1 << PE5; // LED start an
|
96 | uart_print("\n\nCAN INTERRUPT!\n");
|
97 | unsigned char temp = CANPAGE; //save CANPAGE
|
98 | struct MOb msg;
|
99 |
|
100 | CANPAGE = 0x00; //select MOb0
|
101 | CANSTMOB &= ~(1<<RXOK); //clear interrupt flag
|
102 |
|
103 | for (unsigned char i=0; i<8; i++) //get data
|
104 | msg.data [i] = CANMSG;
|
105 |
|
106 | msg.id = 0;
|
107 | msg.id |= ((unsigned long) CANIDT1<<24); //get identifier
|
108 | msg.id |= ((unsigned long) CANIDT2<<16);
|
109 | msg.id |= ((unsigned long) CANIDT3<<8);
|
110 | msg.id |= (CANIDT4&0xF8);
|
111 | msg.id >>= 3;
|
112 |
|
113 | uart_print("id: "+msg.id);
|
114 | uart_print("\n");
|
115 | uart_print("data: "+msg.data[0]+msg.data[1]+msg.data[2]+msg.data[3]+msg.data[4]+msg.data[5]+msg.data[6]+msg.data[7]);
|
116 | uart_print("\n");
|
117 | // printf ("ID: 0x%04X%04X\r\n", (unsigned int) (msg.id>>16), (unsigned int) (msg.id&0xFFFF));
|
118 | //
|
119 | // printf ("Data: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\r\n",
|
120 | // msg.data [0], msg.data [1], msg.data [2], msg.data [3],
|
121 | // msg.data [4], msg.data [5], msg.data [6], msg.data [7]);
|
122 |
|
123 | CANCDMOB = (1<<CONMOB1) | (1<<IDE); //reconfig mailbox
|
124 |
|
125 | CANPAGE = temp; //restore CANPAGE
|
126 | }
|