1 | void CANIrqHandler (void){
|
2 |
|
3 | printf("--Handler\r\n");
|
4 | volatile unsigned int status;
|
5 | unsigned short MBnummer = 10;
|
6 | volatile unsigned char EP = 10;
|
7 | //Read AIV_IV for ack (Seite 159)
|
8 | AT91C_BASE_AIC->AIC_IVR;
|
9 | //CHECK for enabled interrupt
|
10 | status = ((AT91C_BASE_CAN->CAN_SR) & (AT91C_BASE_CAN->CAN_IMR));
|
11 | //Disable Interrupt & Clear
|
12 | AT91C_BASE_AIC->AIC_IDCR = (0x1 << AT91C_ID_CAN)|(0x1 << AT91C_ID_SYS);
|
13 | //AT91C_BASE_CAN->CAN_IDR = 0xFF; //((status = 1))
|
14 | printf("vor_CAN_SR = %x\r\n",AT91C_BASE_CAN->CAN_SR);
|
15 | printf("vor_CAN_IMR = %x\r\n",AT91C_BASE_CAN->CAN_IMR);
|
16 | printf("vor_CAN_SR & CAN_IMR = %x\r\n", status);
|
17 |
|
18 | //ToDo
|
19 | //WAKEUP interrupt
|
20 | if(status & AT91C_CAN_WAKEUP){
|
21 | AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_WAKEUP;
|
22 | }
|
23 | //ALTERNATIVE WAKEUP SOFORT DISABLE!
|
24 | //AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_WAKEUP;
|
25 |
|
26 | //MB0 0xC2
|
27 | if(status & AT91C_CAN_MB0){
|
28 | InterruptFunctionMB0();
|
29 | MBnummer = 0;
|
30 | EP = 0;
|
31 | }
|
32 | //MB1 0x310
|
33 | else if(status & AT91C_CAN_MB1){
|
34 | printf("MAB1\r\n");
|
35 | InterruptFunctionMB1();
|
36 | MBnummer = 1;
|
37 | EP = 1;
|
38 | }
|
39 | //MB2 0x90
|
40 | else if(status & AT91C_CAN_MB2){
|
41 | printf("MAB2\r\n");
|
42 | InterruptFunctionMB2();
|
43 | MBnummer = 2;
|
44 | EP = 2;
|
45 | }
|
46 | //MB3 0x23A
|
47 | else if(status & AT91C_CAN_MB3){
|
48 | printf("MAB3\r\n");
|
49 | InterruptFunctionMB3();
|
50 | MBnummer = 3;
|
51 | EP = 3;
|
52 | }
|
53 | else printf("nix\r\n");
|
54 |
|
55 | //Check for Errors
|
56 | if ((status&0xFFCF0000) != 0) {
|
57 | CAN_ErrorHandling(status, EP);
|
58 | }
|
59 | //Clears MRDY (Seite 562)
|
60 | printf("Mailbox NR = %x\r\n", MBnummer);
|
61 | AT91C_BASE_CAN->CAN_MB0.CAN_MB_MMR = AT91C_CAN_MOT;
|
62 | AT91C_BASE_CAN->CAN_MB1.CAN_MB_MMR = AT91C_CAN_MOT;
|
63 | AT91C_BASE_CAN->CAN_MB2.CAN_MB_MMR = AT91C_CAN_MOT;
|
64 | AT91C_BASE_CAN->CAN_MB3.CAN_MB_MMR = AT91C_CAN_MOT;
|
65 | switch(MBnummer){
|
66 | case 0: AT91C_BASE_CAN->CAN_MB0.CAN_MB_MCR = AT91C_CAN_MTCR;
|
67 | break;
|
68 | case 1: AT91C_BASE_CAN->CAN_MB1.CAN_MB_MCR = AT91C_CAN_MTCR;
|
69 | break;
|
70 | case 2: AT91C_BASE_CAN->CAN_MB2.CAN_MB_MCR = AT91C_CAN_MTCR;
|
71 | break;
|
72 | case 3: AT91C_BASE_CAN->CAN_MB3.CAN_MB_MCR = AT91C_CAN_MTCR;
|
73 | break;
|
74 | }
|
75 |
|
76 | unsigned int i = AT91C_BASE_CAN_MB0->CAN_MB_MSR;
|
77 | i = AT91C_BASE_CAN_MB1->CAN_MB_MSR;
|
78 | i = AT91C_BASE_CAN_MB2->CAN_MB_MSR;
|
79 | i = AT91C_BASE_CAN_MB3->CAN_MB_MSR;
|
80 | printf("end_0MSR = %x\r\n",AT91C_BASE_CAN_MB0->CAN_MB_MSR);
|
81 | printf("end_1MSR = %x\r\n",AT91C_BASE_CAN_MB1->CAN_MB_MSR);
|
82 | printf("end_2MSR = %x\r\n",AT91C_BASE_CAN_MB2->CAN_MB_MSR);
|
83 | printf("end_3MSR = %x\r\n",AT91C_BASE_CAN_MB3->CAN_MB_MSR);
|
84 | printf("end_CAN_SR = %x\r\n",AT91C_BASE_CAN->CAN_SR);
|
85 |
|
86 | //write to EOICR = exit point
|
87 | AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_CAN)|(1 << AT91C_ID_SYS);
|
88 | //Enable Interrupt
|
89 | AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_SYS) | (1 << AT91C_ID_CAN);
|
90 | AT91C_BASE_AIC->AIC_EOICR = 0x0;
|
91 | printf("ENDHANDLER\r\n");
|
92 | }
|