Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 24 | johboh | 1 | #include "../Include/CANdefs.h" |
| 2 | #include "../Include/stackTasks.h" |
||
| 3 | #include "../Include/CAN.h" |
||
| 4 | #include "../Include/uart.h" |
||
| 5 | |||
| 6 | #ifdef USE_CAN |
||
| 7 | |||
| 8 | /* |
||
| 9 | * Function: canInit |
||
| 10 | * |
||
| 11 | * Input: none |
||
| 12 | * Output: none |
||
| 13 | * Pre-conditions: none |
||
| 14 | * Affects: Changes can registers. |
||
| 15 | * Depends: none. |
||
| 16 | */ |
||
| 17 | void canInit() |
||
| 18 | { |
||
| 19 | CANCON=0b10000000; |
||
| 20 | while(!CANSTATbits.OPMODE2); |
||
| 21 | |||
| 22 | ECANCON=0; |
||
| 23 | |||
| 24 | BRGCON1=0b01001001; |
||
| 25 | BRGCON2=0b10001001; |
||
| 26 | BRGCON3=0b00000001; |
||
| 27 | |||
| 28 | // Set Mask 0 to not mask any filter bit |
||
| 29 | RXM0SIDH = 0xFF; |
||
| 30 | RXM0SIDL = 0xE3; |
||
| 31 | RXM0EIDH = 0xFF; |
||
| 32 | RXM0EIDL = 0xFF; |
||
| 33 | |||
| 34 | MSEL0=MSEL1=MSEL2=MSEL3=0; |
||
| 35 | |||
| 36 | |||
| 37 | CIOCON=0b00100000; |
||
| 38 | |||
| 39 | |||
| 40 | PIE3=0b00000011; |
||
| 41 | IPR3=0b00000011; |
||
| 42 | |||
| 43 | CANCON=0b01000000; |
||
| 44 | while(CANSTATbits.OPMODE2); |
||
| 45 | } |
||
| 46 | |||
| 47 | |||
| 48 | /* |
||
| 49 | * Function: canISR |
||
| 50 | * |
||
| 51 | * Input: none |
||
| 52 | * Output: none |
||
| 53 | * Pre-conditions: a call to canInit() |
||
| 54 | * Affects: interrupt registers and receive data buffers |
||
| 55 | * Depends: .. |
||
| 56 | */ |
||
| 57 | void canISR() |
||
| 58 | { |
||
| 59 | if (PIR3bits.RXB0IF==1 && PIE3bits.RXB0IE==1) |
||
| 60 | { |
||
| 61 | CAN_MESSAGE cm; |
||
| 62 | |||
| 63 | uartPutrs("IF1"); |
||
| 64 | |||
| 65 | // Set extended mode or not. |
||
| 66 | cm.extended=RXB0SIDLbits.EXID; |
||
| 67 | |||
| 68 | // Clear |
||
| 69 | cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0; |
||
| 70 | |||
| 71 | |||
| 72 | if (cm.extended==TRUE) |
||
| 73 | { |
||
| 74 | //Read extended ident. |
||
| 75 | cm.ident[0]=RXB0EIDL; |
||
| 76 | cm.ident[1]=RXB0EIDH; |
||
| 77 | cm.ident[2]=(RXB0SIDL & 0b00000011)+((RXB0SIDL & 0b11100000)>3)+((RXB0SIDH & 0b00000111)<5); |
||
| 78 | cm.ident[3]=RXB0SIDH>3; |
||
| 79 | } |
||
| 80 | else |
||
| 81 | { |
||
| 82 | //Read standard ident. |
||
| 83 | cm.ident[0]=((RXB0SIDL & 0b11100000)>5)+(RXB0SIDH>2); |
||
| 84 | cm.ident[1]=RXB0SIDH>5; |
||
| 85 | } |
||
| 86 | |||
| 87 | // Data length |
||
| 88 | cm.data_length=RXB0DLC; |
||
| 89 | |||
| 90 | // Data one bye one, for speed |
||
| 91 | cm.data[0]=RXB0D0; cm.data[1]=RXB0D1; |
||
| 92 | cm.data[2]=RXB0D2; cm.data[3]=RXB0D3; |
||
| 93 | cm.data[4]=RXB0D4; cm.data[5]=RXB0D5; |
||
| 94 | cm.data[6]=RXB0D6; cm.data[7]=RXB0D7; |
||
| 95 | |||
| 96 | |||
| 97 | //Call main parser |
||
| 98 | canParse(cm); |
||
| 99 | |||
| 100 | RXB0CONbits.RXFUL=0; |
||
| 101 | PIR3bits.RXB0IF=0; |
||
| 102 | } |
||
| 103 | if (PIR3bits.RXB1IF==1 && PIE3bits.RXB1IE==1) |
||
| 104 | { |
||
| 105 | CAN_MESSAGE cm; |
||
| 106 | |||
| 107 | uartPutrs("IF2"); |
||
| 108 | |||
| 109 | // Set extended mode or not. |
||
| 110 | cm.extended=RXB1SIDLbits.EXID; |
||
| 111 | |||
| 112 | // Clear |
||
| 113 | cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0; |
||
| 114 | |||
| 115 | |||
| 116 | if (cm.extended==TRUE) |
||
| 117 | { |
||
| 118 | //Read extended ident. |
||
| 119 | cm.ident[0]=RXB1EIDL; |
||
| 120 | cm.ident[1]=RXB1EIDH; |
||
| 121 | cm.ident[2]=(RXB1SIDL & 0b00000011)+((RXB1SIDL & 0b11100000)>3)+((RXB1SIDH & 0b00000111)<5); |
||
| 122 | cm.ident[3]=RXB1SIDH>3; |
||
| 123 | } |
||
| 124 | else |
||
| 125 | { |
||
| 126 | //Read standard ident. |
||
| 127 | cm.ident[0]=((RXB1SIDL & 0b11100000)>5)+(RXB1SIDH>2); |
||
| 128 | cm.ident[1]=RXB1SIDH>5; |
||
| 129 | } |
||
| 130 | |||
| 131 | // Data length |
||
| 132 | cm.data_length=RXB1DLC; |
||
| 133 | |||
| 134 | // Data one bye one, for speed |
||
| 135 | cm.data[0]=RXB1D0; cm.data[1]=RXB1D1; |
||
| 136 | cm.data[2]=RXB1D2; cm.data[3]=RXB1D3; |
||
| 137 | cm.data[4]=RXB1D4; cm.data[5]=RXB1D5; |
||
| 138 | cm.data[6]=RXB1D6; cm.data[7]=RXB1D7; |
||
| 139 | |||
| 140 | |||
| 141 | //Call main parser |
||
| 142 | canParse(cm); |
||
| 143 | |||
| 144 | RXB1CONbits.RXFUL=0; |
||
| 145 | PIR3bits.RXB1IF=0; |
||
| 146 | } |
||
| 147 | |||
| 148 | } |
||
| 149 | |||
| 150 | |||
| 151 | /* |
||
| 152 | * Function: canSendMessage |
||
| 153 | * |
||
| 154 | * Input: CAN_MESSAGE to send |
||
| 155 | * Output: True if packet scheduled sucess, false otherwise. |
||
| 156 | * Pre-conditions: canInit |
||
| 157 | * Affects: .. |
||
| 158 | * Depends: .. |
||
| 159 | */ |
||
| 160 | BOOL canSendMessage(CAN_MESSAGE cm) |
||
| 161 | { |
||
| 162 | BYTE defECANCON; |
||
| 163 | |||
| 164 | // Find the first empty transmitter. |
||
| 165 | if ( TXB0CONbits.TXREQ == 0 ) |
||
| 166 | { |
||
| 167 | uartPutrs("Sending.."); |
||
| 168 | |||
| 169 | // Set extended mode or not. |
||
| 170 | TXB0SIDLbits.EXIDE=cm.extended; |
||
| 171 | |||
| 172 | if (cm.extended==TRUE) |
||
| 173 | { |
||
| 174 | //Write extended ident. |
||
| 175 | TXB0SIDH=(cm.ident[3]<3)+(cm.ident[2]>5); |
||
| 176 | TXB0SIDL=(TXB0SIDL & 0b00011100)+((cm.ident[2] & 0b0001100)<3)+(cm.ident[2] & 0b00000011); |
||
| 177 | TXB0EIDH=cm.ident[1]; |
||
| 178 | TXB0EIDL=cm.ident[0]; |
||
| 179 | } |
||
| 180 | else |
||
| 181 | { |
||
| 182 | //Write standard ident. |
||
| 183 | TXB0SIDH=(cm.ident[1]<5)+(cm.ident[0]>3); |
||
| 184 | TXB0SIDL=(TXB0SIDL & 0b00011111)+(cm.ident[0]<5); |
||
| 185 | } |
||
| 186 | |||
| 187 | // Data length |
||
| 188 | if (cm.data_length>8) TXB0DLC=8; else TXB0DLC=cm.data_length; |
||
| 189 | |||
| 190 | // Data one bye one, for speed |
||
| 191 | TXB0D0=cm.data[0]; TXB0D1=cm.data[1]; |
||
| 192 | TXB0D2=cm.data[2]; TXB0D3=cm.data[3]; |
||
| 193 | TXB0D4=cm.data[4]; TXB0D5=cm.data[5]; |
||
| 194 | TXB0D6=cm.data[6]; TXB0D7=cm.data[7]; |
||
| 195 | |||
| 196 | // mark as redy to transmit |
||
| 197 | TXB0CONbits.TXREQ=1; |
||
| 198 | |||
| 199 | while(TXB0CONbits.TXREQ); |
||
| 200 | |||
| 201 | |||
| 202 | } |
||
| 203 | // None of the transmit buffers were empty. |
||
| 204 | else {uartPutrs("No free tx."); return FALSE;} |
||
| 205 | |||
| 206 | |||
| 207 | |||
| 208 | |||
| 209 | return TRUE; |
||
| 210 | |||
| 211 | } |
||
| 212 | |||
| 213 | |||
| 214 | #endif //USE_CAN |