Rev 26 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 26 | Rev 48 | ||
|---|---|---|---|
| Line 116... | Line 116... | ||
| 116 | * Affects: interrupt registers and receive data buffers |
116 | * Affects: interrupt registers and receive data buffers |
| 117 | * Depends: .. |
117 | * Depends: .. |
| 118 | */ |
118 | */ |
| 119 | void canISR() |
119 | void canISR() |
| 120 | { |
120 | { |
| - | 121 | ||
| - | 122 | ||
| 121 | if (PIR3bits.RXBnIF || PIR3bits.RXB1IF || PIR3bits.RXB0IF) |
123 | if (PIR3bits.RXBnIF || PIR3bits.RXB1IF || PIR3bits.RXB0IF) |
| 122 | { |
124 | { |
| 123 | - | ||
| 124 | // Get which buffer that is ful. |
125 | // Get which buffer that is ful. |
| 125 | if (RXB0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10000; canGetPacket(); } |
126 | if (RXB0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10000; canGetPacket(); } |
| 126 | else if (RXB1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10001; canGetPacket(); } |
127 | else if (RXB1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10001; canGetPacket(); } |
| 127 | else if (B0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10010; canGetPacket(); } |
128 | else if (B0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10010; canGetPacket(); } |
| 128 | else if (B1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10011; canGetPacket(); } |
129 | else if (B1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10011; canGetPacket(); } |
| Line 133... | Line 134... | ||
| 133 | 134 | ||
| 134 | if (PIR3bits.RXBnIF) {PIR3bits.RXBnIF = 0;} |
135 | if (PIR3bits.RXBnIF) {PIR3bits.RXBnIF = 0;} |
| 135 | if (PIR3bits.RXB1IF) {PIR3bits.RXB1IF = 0;} |
136 | if (PIR3bits.RXB1IF) {PIR3bits.RXB1IF = 0;} |
| 136 | if (PIR3bits.RXB0IF) {PIR3bits.RXB0IF = 0;} |
137 | if (PIR3bits.RXB0IF) {PIR3bits.RXB0IF = 0;} |
| 137 | 138 | ||
| 138 | } |
139 | } |
| 139 | } |
140 | } |
| 140 | 141 | ||
| 141 | 142 | ||
| 142 | /* |
143 | /* |
| 143 | * Function: canGetPacket |
144 | * Function: canGetPacket |
| 144 | * |
145 | * |
| 145 | * Input: none |
146 | * Input: none |
| 146 | * Output: none |
147 | * Output: none |
| Line 170... | Line 171... | ||
| 170 | //RXB0EIDH 15 14 13 12 11 10 09 08 |
171 | //RXB0EIDH 15 14 13 12 11 10 09 08 |
| 171 | //RXB0EIDL 07 06 05 04 03 02 01 00 |
172 | //RXB0EIDL 07 06 05 04 03 02 01 00 |
| 172 | 173 | ||
| 173 | 174 | ||
| 174 | cm.ident = (((DWORD)RXB0SIDH)<<21) + (((DWORD)(RXB0SIDL & 0xE0))<<13) + (((DWORD)(RXB0SIDL & 0x03))<<16) + (((DWORD)RXB0EIDH)<<8) + (BYTE)RXB0EIDL; |
175 | cm.ident = (((DWORD)RXB0SIDH)<<21) + (((DWORD)(RXB0SIDL & 0xE0))<<13) + (((DWORD)(RXB0SIDL & 0x03))<<16) + (((DWORD)RXB0EIDH)<<8) + (BYTE)RXB0EIDL; |
| 175 | 176 | ||
| 176 | } |
177 | } |
| 177 | else |
178 | else |
| 178 | { |
179 | { |
| 179 | //Read standard ident. |
180 | //Read standard ident. |
| 180 | 181 | ||
| 181 | //xx xx xx xx xx 10 09 08 07 06 05 04 03 02 01 00 |
182 | //xx xx xx xx xx 10 09 08 07 06 05 04 03 02 01 00 |
| 182 | 183 | ||
| 183 | //RXB0SIDH 10 09 08 07 06 05 04 03 |
184 | //RXB0SIDH 10 09 08 07 06 05 04 03 |
| 184 | //RXB0SIDL 02 01 00 xx xx xx xx xx |
185 | //RXB0SIDL 02 01 00 xx xx xx xx xx |
| 185 | 186 | ||
| 186 | cm.ident = (((DWORD)RXB0SIDH)<<3) + (((DWORD)RXB0SIDL)>>5); |
187 | cm.ident = (((DWORD)RXB0SIDH)<<3) + (((DWORD)RXB0SIDL)>>5); |
| 187 | } |
188 | } |
| 188 | 189 | ||
| 189 | // Data length |
190 | // Data length |
| 190 | cm.data_length=RXB0DLC; |
191 | cm.data_length=RXB0DLC; |
| 191 | 192 | ||
| 192 | // Data one bye one, for speed |
193 | // Data one bye one, for speed |
| 193 | cm.data[0]=RXB0D0; cm.data[1]=RXB0D1; |
194 | cm.data[0]=RXB0D0; cm.data[1]=RXB0D1; |
| 194 | cm.data[2]=RXB0D2; cm.data[3]=RXB0D3; |
195 | cm.data[2]=RXB0D2; cm.data[3]=RXB0D3; |
| 195 | cm.data[4]=RXB0D4; cm.data[5]=RXB0D5; |
196 | cm.data[4]=RXB0D4; cm.data[5]=RXB0D5; |
| 196 | cm.data[6]=RXB0D6; cm.data[7]=RXB0D7; |
197 | cm.data[6]=RXB0D6; cm.data[7]=RXB0D7; |
| 197 | 198 | ||
| 198 | // Clear ful status |
199 | // Clear ful status |
| 199 | RXB0CONbits.RXFUL=0; |
200 | RXB0CONbits.RXFUL=0; |
| 200 | 201 | ||
| 201 | //Call main parser |
202 | //Call main parser |
| 202 | canParse(cm); |
203 | canParse(cm); |
| 203 | } |
204 | } |
| 204 | 205 | ||
| 205 | 206 | ||
| 206 | /* |
207 | /* |
| 207 | * Function: canSendMessage |
208 | * Function: canSendMessage |
| 208 | * |
209 | * |
| 209 | * Input: CAN_MESSAGE to send |
210 | * Input: CAN_MESSAGE to send |
| 210 | * Output: True if packet scheduled sucess, false otherwise. |
211 | * Output: True if packet scheduled sucess, false otherwise. |
| 211 | * Pre-conditions: canInit |
212 | * Pre-conditions: canInit |
| 212 | * Affects: .. |
213 | * Affects: .. |
| 213 | * Depends: .. |
214 | * Depends: .. |
| 214 | */ |
215 | */ |
| 215 | BOOL canSendMessage(CAN_MESSAGE cm) |
216 | BOOL canSendMessage(CAN_MESSAGE cm) |
| 216 | { |
217 | { |
| - | 218 | ||
| 217 | if ( TXB0CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00011; } |
219 | if ( TXB0CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00011; } |
| 218 | if ( TXB1CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00100; } |
220 | if ( TXB1CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00100; } |
| 219 | if ( TXB2CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00101; } |
221 | if ( TXB2CONbits.TXREQ == 0 ) { ECANCON=(ECANCON&0b00000)|0b00101; } |
| 220 | // None of the transmit buffers were empty. |
222 | // None of the transmit buffers were empty. |
| 221 | else { return FALSE;} |
223 | else { return FALSE;} |
| Line 229... | Line 231... | ||
| 229 | 231 | ||
| 230 | //RXB0SIDH 28 27 26 25 24 23 22 21 |
232 | //RXB0SIDH 28 27 26 25 24 23 22 21 |
| 231 | //RXB0SIDL 20 19 18 xx xx xx 17 16 |
233 | //RXB0SIDL 20 19 18 xx xx xx 17 16 |
| 232 | //RXB0EIDH 15 14 13 12 11 10 09 08 |
234 | //RXB0EIDH 15 14 13 12 11 10 09 08 |
| 233 | //RXB0EIDL 07 06 05 04 03 02 01 00 |
235 | //RXB0EIDL 07 06 05 04 03 02 01 00 |
| 234 | 236 | ||
| 235 | 237 | ||
| 236 | RXB0SIDH = (BYTE)((cm.ident>>21)); |
238 | RXB0SIDH = (BYTE)((cm.ident>>21)); |
| 237 | RXB0SIDL = ((BYTE)(cm.ident>>16) & 0x03) + ((BYTE)(cm.ident>>13) & 0xE0); |
239 | RXB0SIDL = ((BYTE)(cm.ident>>16) & 0x03) + ((BYTE)(cm.ident>>13) & 0xE0); |
| 238 | RXB0EIDH = (BYTE)(cm.ident>>8); |
240 | RXB0EIDH = (BYTE)(cm.ident>>8); |
| 239 | RXB0EIDL = (BYTE)cm.ident; |
241 | RXB0EIDL = (BYTE)cm.ident; |
| 240 | 242 | ||
| Line 268... | Line 270... | ||
| 268 | 270 | ||
| 269 | // mark as redy to transmit |
271 | // mark as redy to transmit |
| 270 | _asm |
272 | _asm |
| 271 | bsf RXB0CON, 3, 0 |
273 | bsf RXB0CON, 3, 0 |
| 272 | _endasm |
274 | _endasm |
| 273 | - | ||
| 274 | 275 | ||
| 275 | return TRUE; |
276 | return TRUE; |
| 276 | 277 | ||
| 277 | } |
278 | } |
| 278 | 279 | ||