📄 can.lst
字号:
251 1 return(ubReturn);
252 1
253 1 }
254
255 void CAN_vTransmit(ubyte ubObjNr)
256 {
257 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xe7ff; // set TXRQ, reset CPUUPD
258 1
259 1 }
260
261 void CAN_vConfigMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj)
262 {
263 1 ubyte i;
264 1
265 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfb7f; // set CPUUPD, reset MSGVAL
266 1
267 1 if(pstObj->uwMsgCfg & 0x0004) // extended identifier
268 1 {
269 2 CAN_HWOBJ[ubObjNr].uwMSGCFG |= 0x0004;
270 2 CAN_HWOBJ[ubObjNr].ulCANAR = pstObj->ulID ;
271 2 CAN_HWOBJ[ubObjNr].ulCANAMR = pstObj->ulMask ;
272 2 }
273 1 else // standard identifier
274 1 {
275 2 CAN_HWOBJ[ubObjNr].uwMSGCFG &= ~(uword)0x0004;
276 2 CAN_HWOBJ[ubObjNr].ulCANAR = pstObj->ulID << 18;
277 2 CAN_HWOBJ[ubObjNr].ulCANAMR = pstObj->ulMask << 18;
278 2 }
279 1
280 1 CAN_HWOBJ[ubObjNr].uwCounter = pstObj->uwCounter;
281 1
282 1 CAN_HWOBJ[ubObjNr].uwMSGCFG = (CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x000f) | (pstObj->uwMsgCfg & 0x00f0);
283 1
284 1 if(CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x0008) // if transmit direction
285 1 {
286 2 for(i = 0; i < (pstObj->uwMsgCfg & 0x00f0) >> 4; i++)
287 2 {
288 3 CAN_HWOBJ[ubObjNr].ubData[i] = pstObj->ubData[i];
289 3 }
290 2 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf6bf; // set NEWDAT, reset CPUUPD,
291 2 } // set MSGVAL
292 1 else // if receive direction
293 1 {
294 2 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf7bf; // reset CPUUPD, set MSGVAL
295 2 }
296 1
297 1 }
298
299
300 void CAN_vLoadData(ubyte ubObjNr, ubyte *pubData)
301 {
C166 COMPILER V6.04, CAN 09/02/2008 15:32:01 PAGE 6
302 1 ubyte i;
303 1
304 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfaff; // set CPUUPD and NEWDAT
305 1
306 1 for(i = 0; i < (CAN_HWOBJ[ubObjNr].uwMSGCFG & 0xf0) >> 4; i++)
307 1 {
308 2 CAN_HWOBJ[ubObjNr].ubData[i] = *(pubData++);
309 2 }
310 1
311 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf7ff; // reset CPUUPD
312 1
313 1 }
314
315 ubyte CAN_ubMsgLost(ubyte ubObjNr)
316 {
317 1 ubyte ubReturn;
318 1
319 1 ubReturn = 0;
320 1 if((CAN_HWOBJ[ubObjNr].uwMSGCTR & 0x0c00) == 0x0800) // if set MSGLST
321 1 {
322 2 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf7ff; // reset MSGLST
323 2 ubReturn = 1;
324 2 }
325 1 return(ubReturn);
326 1
327 1 }
328
329
330 ubyte CAN_ubDelMsgObj(ubyte ubObjNr)
331 {
332 1 ubyte ubReturn;
333 1
334 1 ubReturn = 0;
335 1 if(!(CAN_HWOBJ[ubObjNr].uwMSGCTR & 0xa200)) // if set RMTPND, TXRQ or NEWDAT
336 1 {
337 2 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xff7f; // reset MSGVAL
338 2 ubReturn = 1;
339 2 }
340 1 return(ubReturn);
341 1
342 1 }
343
344 void CAN_vReleaseObj(ubyte ubObjNr)
345 {
346 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfdff; // reset NEWDAT
347 1
348 1 }
349
350 void CAN_vSetMSGVAL(ubyte ubObjNr)
351 {
352 1 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xffbf; // set MSGVAL
353 1
354 1 } // End of function CAN_vSetMSGVAL
355
356
357 ubyte CAN_ubWriteFIFO(ubyte ubObjNr, TCAN_SWObj *pstObj)
358 {
359 1 ubyte i,j;
360 1 ubyte ubReturn;
361 1
362 1 ubReturn = 2;
363 1
C166 COMPILER V6.04, CAN 09/02/2008 15:32:01 PAGE 7
364 1 if((CAN_HWOBJ[ubObjNr].uwCANPTR & 0x0700) == 0x0200) // if FIFO base object
365 1 {
366 2 j = aubFIFOWritePtr[ubObjNr / 2];
367 2
368 2 ubReturn = 0;
369 2 if((CAN_HWOBJ[j].uwMSGCTR & 0x3000) == 0x1000) // if reset TXRQ
370 2 {
371 3 // CANPTRn(new) = CANPTR(old) & ~(uword)FSIZEn | (CANPTRn(old) + 1) & FZIZEn
372 3 aubFIFOWritePtr[ubObjNr / 2] = ((aubFIFOWritePtr[ubObjNr / 2] & ~(uword)(CAN_HWOBJ[ubObjNr].uwCANFCR
- & 0x001f)) |
373 3 ((aubFIFOWritePtr[ubObjNr / 2] + 1) & (CAN_HWOBJ[ubObjNr].uwCANFCR &
-0x001f)));
*** WARNING C192 IN LINE 373 OF CAN.C: '=': value truncated
374 3
375 3 CAN_HWOBJ[j].uwMSGCTR = 0xf9ff; // set CPUUPD, reset NEWDAT
376 3
377 3 if(CAN_HWOBJ[j].uwMSGCFG & 0x0004) // if extended identifier
378 3 {
379 4 CAN_HWOBJ[j].ulCANAR = pstObj->ulID ;
380 4 }
381 3 else // if standard identifier
382 3 {
383 4 CAN_HWOBJ[j].ulCANAR = pstObj->ulID << 18;
384 4 }
385 3
386 3 CAN_HWOBJ[j].uwMSGCFG = (CAN_HWOBJ[j].uwMSGCFG & 0x000f) |
387 3 (pstObj->uwMsgCfg & 0x00f0); // set DLC
388 3
389 3 for(i = 0; i < (pstObj->uwMsgCfg & 0x00f0) >> 4; i++)
390 3 {
391 4 CAN_HWOBJ[j].ubData[i] = pstObj->ubData[i];
392 4 }
393 3 CAN_HWOBJ[j].uwMSGCTR = 0x66bf; // set TXRQ, NEWDAT, MSGVAL
394 3 // reset CPUUPD, RMTPND
395 3 ubReturn = 1;
396 3 }
397 2 }
398 1 return(ubReturn);
399 1
400 1 }
401
402 ubyte CAN_ubReadFIFO(ubyte ubObjNr, TCAN_SWObj *pstObj)
403 {
404 1 ubyte i,j;
405 1 ubyte ubReturn;
406 1
407 1 ubReturn = 2;
408 1
409 1 if((CAN_HWOBJ[ubObjNr].uwCANPTR & 0x0700) == 0x0200) // if FIFO base object
410 1 {
411 2 j = aubFIFOReadPtr[ubObjNr / 2];
412 2
413 2 ubReturn = 0;
414 2 if((CAN_HWOBJ[j].uwMSGCTR & 0x0300) == 0x0200) // if NEWDAT
415 2 {
416 3 CAN_HWOBJ[j].uwMSGCTR = 0xfdff; // clear NEWDAT
417 3
418 3 // CANPTRn(new) = CANPTR(old) & ~(uword)FSIZEn | (CANPTRn(old) + 1) & FZIZEn
419 3 aubFIFOReadPtr[ubObjNr / 2] = ((aubFIFOReadPtr[ubObjNr / 2] & ~(uword)(CAN_HWOBJ[ubObjNr].uwCANFCR &
- 0x001f)) |
420 3 ((aubFIFOReadPtr[ubObjNr / 2] + 1) & (CAN_HWOBJ[ubObjNr].uwCANFCR & 0x
-001f)));
C166 COMPILER V6.04, CAN 09/02/2008 15:32:01 PAGE 8
*** WARNING C192 IN LINE 420 OF CAN.C: '=': value truncated
421 3
422 3 // check if the previous message was lost
423 3 if((CAN_HWOBJ[j].uwMSGCTR & 0x0c00) == 0x0800) // if set MSGLST
424 3 {
425 4 CAN_HWOBJ[j].uwMSGCTR = 0xf7ff; // reset MSGLST
426 4 return(3);
427 4 }
428 3
429 3 for(i = 0; i < (CAN_HWOBJ[j].uwMSGCFG & 0x00f0) >> 4; i++)
430 3 {
431 4 pstObj->ubData[i] = CAN_HWOBJ[j].ubData[i];
432 4 }
433 3
434 3 if(CAN_HWOBJ[j].uwMSGCFG & 0x04) // if extended identifier
435 3 {
436 4 pstObj->ulID = CAN_HWOBJ[j].ulCANAR;
437 4 }
438 3 else // if standard identifier
439 3 {
440 4 pstObj->ulID = CAN_HWOBJ[j].ulCANAR >> 18;
441 4 }
442 3
443 3 pstObj->uwMsgCfg = CAN_HWOBJ[j].uwMSGCFG;
444 3
445 3 // check if the message was corrupted
446 3 if((CAN_HWOBJ[j].uwMSGCTR & 0x0300) == 0x0200) // if NEWDAT
447 3 {
448 4 CAN_HWOBJ[j].uwMSGCTR = 0xfdff; // clear NEWDAT
449 4 return(4);
450 4 }
451 3 ubReturn = 1;
452 3 }
453 2 }
454 1 return(ubReturn);
455 1
456 1 }
457
458 ubyte CAN_ubFlushReadFIFO(ubyte ubObjNr)
459 {
460 1 ubyte j;
461 1 ubyte ubReturn;
462 1
463 1 ubReturn = 0;
464 1
465 1 if((CAN_HWOBJ[ubObjNr].uwCANPTR & 0x0700) == 0x0200) // if FIFO base object
466 1 {
467 2 aubFIFOReadPtr[ubObjNr / 2] = ubObjNr;
468 2 CAN_HWOBJ[ubObjNr].uwCANPTR = (CAN_HWOBJ[ubObjNr].uwCANPTR & ~(uword)0x001F) | ubObjNr;
469 2
470 2 for(j = ubObjNr; j < ubObjNr + (CAN_HWOBJ[ubObjNr].uwCANFCR & 0x001f); j++)
471 2 {
472 3 CAN_HWOBJ[j].uwMSGCTR = 0xf5ff; // reset MSGLST, NEWDAT
473 3 }
474 2 // make sure that no new frame was received
475 2 CAN_HWOBJ[ubObjNr].uwCANPTR = (CAN_HWOBJ[ubObjNr].uwCANPTR & ~(uword)0x001F) | ubObjNr;
476 2 CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf5ff; // reset MSGLST, NEWDAT
477 2
478 2 ubReturn = 1;
479 2 }
480 1 return(ubReturn);
481 1
C166 COMPILER V6.04, CAN 09/02/2008 15:32:01 PAGE 9
482 1 }
MODULE INFORMATION: INITIALIZED UNINITIALIZED
CODE SIZE = 2022 --------
NEAR-CONST SIZE = -------- --------
FAR-CONST SIZE = -------- --------
HUGE-CONST SIZE = -------- --------
XHUGE-CONST SIZE = -------- --------
NEAR-DATA SIZE = 32 --------
FAR-DATA SIZE = -------- --------
XHUGE-DATA SIZE = -------- --------
IDATA-DATA SIZE = -------- --------
SDATA-DATA SIZE = -------- --------
BDATA-DATA SIZE = -------- --------
HUGE-DATA SIZE = -------- --------
BIT SIZE = -------- --------
INIT'L SIZE = -------- --------
END OF MODULE INFORMATION.
C166 COMPILATION COMPLETE. 4 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -