45 #ifndef CAN_FLAG //it allows to include the library in multiple points
49 typedef unsigned char BYTE;
210 while((CANSTAT & 0b11100000) != mode );
234 phaseSeg1 = phaseSeg1 <<3;
235 BRGCON2 |= phaseSeg1;
241 BRGCON2bits.SEG2PHTS = 1;
243 BRGCON3 |= phaseSeg2;
246 BRGCON3bits.WAKFIL = 1;
253 RXB0CONbits.RXB0DBEN = 1;
263 switch( (flags & CAN_CONFIG_MSG_BITS) | ~CAN_CONFIG_MSG_BITS )
298 if (TXB0CONbits.TXREQ == 0)
299 { TXB0DLC = dataLength;
300 if (0b01000000 & flags)
301 TXB0DLCbits.TXRTR = 0x01;
303 TXB0DLCbits.TXRTR = 0x00;
308 tamp = identifier & 0x000000FF;
309 TXB0EIDL = (
unsigned char) tamp;
311 tamp = identifier & 0x0000FF00;
313 TXB0EIDH = (
unsigned char) tamp;
316 TXB0SIDLbits.EXIDE = 0x01;
318 if (identifier & 0x00010000)
319 TXB0SIDLbits.EID16 = 0x01;
320 if (identifier & 0x00020000)
321 TXB0SIDLbits.EID17 = 0x01;
322 if (identifier & 0x00040000)
323 TXB0SIDLbits.SID0 = 0x01;
324 if (identifier & 0x00080000)
325 TXB0SIDLbits.SID1 = 0x01;
326 if (identifier & 0x00100000)
327 TXB0SIDLbits.SID2 = 0x01;
329 tamp = (identifier >> 21);
330 tamp = tamp & 0x000000FF;
331 TXB0SIDH = (
unsigned char) tamp;
337 TXB0SIDLbits.EXIDE = 0x00;
339 tamp = (identifier >> 3);
340 tamp = tamp & 0x000000FF;
341 TXB0SIDH = (
unsigned char) tamp;
343 tamp = identifier & 0x00000007;
345 TXB0SIDL = TXB0SIDL & 0b00011111;
346 TXB0SIDL = (
unsigned char) tamp;
349 if (0b00000001 & flags)
350 TXB0CONbits.TXPRI0 = 0x01;
352 TXB0CONbits.TXPRI0 = 0x00;
353 if (0b00000010 & flags)
354 TXB0CONbits.TXPRI1 = 0x01;
356 TXB0CONbits.TXPRI1 = 0x00;
367 TXB0CONbits.TXREQ = 0x01;
373 if (TXB1CONbits.TXREQ == 0)
374 { TXB1DLC = dataLength;
376 if (0b01000000 & flags)
377 TXB1DLCbits.TXRTR = 0x01;
379 TXB1DLCbits.TXRTR = 0x00;
383 tamp = identifier & 0x000000FF;
384 TXB1EIDL = (
unsigned char) tamp;
386 tamp = identifier & 0x0000FF00;
388 TXB1EIDH = (
unsigned char) tamp;
391 TXB1SIDLbits.EXIDE = 0x01;
393 if (identifier & 0x00010000)
394 TXB1SIDLbits.EID16 = 0x01;
395 if (identifier & 0x00020000)
396 TXB1SIDLbits.EID17 = 0x01;
397 if (identifier & 0x00040000)
398 TXB1SIDLbits.SID0 = 0x01;
399 if (identifier & 0x00080000)
400 TXB1SIDLbits.SID1 = 0x01;
401 if (identifier & 0x00100000)
402 TXB1SIDLbits.SID2 = 0x01;
404 tamp = (identifier >> 21);
405 tamp = tamp & 0x000000FF;
406 TXB1SIDH = (
unsigned char) tamp;
412 TXB1SIDLbits.EXIDE = 0x00;
414 tamp = (identifier >> 3);
415 tamp = tamp & 0x000000FF;
416 TXB1SIDH = (
unsigned char) tamp;
418 tamp = identifier & 0x00000007;
420 TXB1SIDL = TXB1SIDL & 0b00011111;
421 TXB1SIDL = (
unsigned char) tamp;
424 if (0b00000001 & flags)
425 TXB1CONbits.TXPRI0 = 0x01;
427 TXB1CONbits.TXPRI0 = 0x00;
428 if (0b00000010 & flags)
429 TXB1CONbits.TXPRI1 = 0x01;
431 TXB1CONbits.TXPRI1 = 0x00;
442 TXB1CONbits.TXREQ = 0x01;
449 if (TXB2CONbits.TXREQ == 0)
450 { TXB2DLC = dataLength;
452 if (0b01000000 & flags)
453 TXB2DLCbits.TXRTR = 0x01;
455 TXB2DLCbits.TXRTR = 0x00;
459 tamp = identifier & 0x000000FF;
460 TXB2EIDL = (
unsigned char) tamp;
462 tamp = identifier & 0x0000FF00;
464 TXB2EIDH = (
unsigned char) tamp;
467 TXB2SIDLbits.EXIDE = 0x01;
469 if (identifier & 0x00010000)
470 TXB2SIDLbits.EID16 = 0x01;
471 if (identifier & 0x00020000)
472 TXB2SIDLbits.EID17 = 0x01;
473 if (identifier & 0x00040000)
474 TXB2SIDLbits.SID0 = 0x01;
475 if (identifier & 0x00080000)
476 TXB2SIDLbits.SID1 = 0x01;
477 if (identifier & 0x00100000)
478 TXB2SIDLbits.SID2 = 0x01;
480 tamp = (identifier >> 21);
481 tamp = tamp & 0x000000FF;
482 TXB2SIDH = (
unsigned char) tamp;
488 TXB2SIDLbits.EXIDE = 0x00;
490 tamp = (identifier >> 3);
491 tamp = tamp & 0x000000FF;
492 TXB2SIDH = (
unsigned char) tamp;
494 tamp = identifier & 0x00000007;
496 TXB2SIDL = TXB2SIDL & 0b00011111;
497 TXB2SIDL = (
unsigned char) tamp;
500 if (0b00000001 & flags)
501 TXB2CONbits.TXPRI0 = 0x01;
503 TXB2CONbits.TXPRI0 = 0x00;
504 if (0b00000010 & flags)
505 TXB2CONbits.TXPRI1 = 0x01;
507 TXB2CONbits.TXPRI1 = 0x00;
518 TXB2CONbits.TXREQ = 0x01;
533 if (COMSTATbits.RXB0OVFL == 0x01)
536 if (COMSTATbits.RXB1OVFL == 0x01)
540 if (RXB1CONbits.RXFUL ==0x01)
543 msg->
data[0] =RXB1D0;
544 msg->
data[1] =RXB1D1;
545 msg->
data[2] =RXB1D2;
546 msg->
data[3] =RXB1D3;
547 msg->
data[4] =RXB1D4;
548 msg->
data[5] =RXB1D5;
549 msg->
data[6] =RXB1D6;
550 msg->
data[7] =RXB1D7;
552 msg->
RTR = RXB1DLCbits.RXRTR;
554 msg->
length = RXB1DLC & 0x0F;
556 msg->
type = RXB1SIDLbits.EXID;
558 if (RXB1SIDLbits.EXID == 0)
560 msg->
identifier = ((
unsigned long)RXB1SIDH)<< 3;
561 tamp = (RXB1SIDL >> 5 ) & 0x07;
567 msg->
identifier += ((
unsigned long) RXB1EIDH) << 8;
569 if (RXB1SIDLbits.EID16)
571 if (RXB1SIDLbits.EID17)
573 if (RXB1SIDLbits.SID0)
575 if (RXB1SIDLbits.SID1)
577 if (RXB1SIDLbits.SID2)
580 msg->
identifier |= ((
unsigned long) RXB1SIDH) << 21;
583 RXB1CONbits.RXFUL = 0x00;
587 if (RXB0CONbits.RXFUL ==0x01)
590 msg->
data[0] =RXB0D0;
591 msg->
data[1] =RXB0D1;
592 msg->
data[2] =RXB0D2;
593 msg->
data[3] =RXB0D3;
594 msg->
data[4] =RXB0D4;
595 msg->
data[5] =RXB0D5;
596 msg->
data[6] =RXB0D6;
597 msg->
data[7] =RXB0D7;
599 msg->
RTR = RXB0DLCbits.RXRTR;
601 msg->
length = RXB0DLC & 0x0F;
603 msg->
type = RXB0SIDLbits.EXID;
605 if (RXB0SIDLbits.EXID == 0)
607 msg->
identifier = ((
unsigned long)RXB0SIDH)<< 3;
608 tamp = (RXB0SIDL >> 5 ) & 0x07;
614 msg->
identifier += ((
unsigned long) RXB0EIDH) << 8;
616 if (RXB0SIDLbits.EID16)
618 if (RXB0SIDLbits.EID17)
620 if (RXB0SIDLbits.SID0)
622 if (RXB0SIDLbits.SID1)
624 if (RXB0SIDLbits.SID2)
627 msg->
identifier |= ((
unsigned long) RXB0SIDH) << 21;
630 RXB0CONbits.RXFUL = 0x00;
641 {
unsigned long tamp;
646 tamp = tamp & 0x000000FF;
647 RXM0SIDH = (
unsigned char) tamp;
649 tamp = mask & 0x00000007;
651 RXM0SIDL = (
unsigned char) tamp;
657 tamp = tamp & 0x000000FF;
658 RXM1SIDH = (
unsigned char) tamp;
660 tamp = mask & 0x00000007;
662 RXM1SIDL = (
unsigned char) tamp;
667 tamp = mask & 0x000000FF;
668 RXM0EIDL = (
unsigned char) tamp;
670 tamp = mask & 0x0000FF00;
672 RXM0EIDH = (
unsigned char) tamp;
674 if (mask & 0x00010000)
675 RXM0SIDLbits.EID16 = 0x01;
677 RXM0SIDLbits.EID16 = 0x00;
679 if (mask & 0x00020000)
680 RXM0SIDLbits.EID17 = 0x01;
682 RXM0SIDLbits.EID17 = 0x00;
684 if (mask & 0x00040000)
685 RXM0SIDLbits.SID0 = 0x01;
687 RXM0SIDLbits.SID0 = 0x00;
689 if (mask & 0x00080000)
690 RXM0SIDLbits.SID1 = 0x01;
692 RXM0SIDLbits.SID1 = 0x00;
694 if (mask & 0x00100000)
695 RXM0SIDLbits.SID2 = 0x01 ;
697 RXM0SIDLbits.SID2 = 0x00 ;
700 tamp = tamp & 0x000000FF;
701 RXM0SIDH = (
unsigned char) tamp;
706 tamp = mask & 0x000000FF;
707 RXM1EIDL = (
unsigned char) tamp;
709 tamp = mask & 0x0000FF00;
711 RXM1EIDH = (
unsigned char) tamp;
713 if (mask & 0x00010000)
714 RXM1SIDLbits.EID16 = 0x01;
716 RXM1SIDLbits.EID16 = 0x00;
718 if (mask & 0x00020000)
719 RXM1SIDLbits.EID17 = 0x01;
721 RXM1SIDLbits.EID17 = 0x00;
723 if (mask & 0x00040000)
724 RXM1SIDLbits.SID0 = 0x01;
726 RXM1SIDLbits.SID0 = 0x00;
728 if (mask & 0x00080000)
729 RXM1SIDLbits.SID1 = 0x01;
731 RXM1SIDLbits.SID1 = 0x00;
733 if (mask & 0x00100000)
734 RXM1SIDLbits.SID2 = 0x01 ;
736 RXM1SIDLbits.SID2 = 0x00 ;
739 tamp = tamp & 0x000000FF;
740 RXM1SIDH = (
unsigned char) tamp;
754 RXF0SIDLbits.EXIDEN = 0x00;
756 tamp = (filter >> 3);
757 tamp = tamp & 0x000000FF;
758 RXF0SIDH = (
unsigned char) tamp;
760 tamp = filter & 0x00000007;
762 RXF0SIDL = (
unsigned char) tamp;
767 RXF1SIDLbits.EXIDEN = 0x00;
769 tamp = (filter >> 3);
770 tamp = tamp & 0x000000FF;
771 RXF1SIDH = (
unsigned char) tamp;
773 tamp = filter & 0x00000007;
775 RXF1SIDL = (
unsigned char) tamp;
780 RXF2SIDLbits.EXIDEN = 0x00;
782 tamp = (filter >> 3);
783 tamp = tamp & 0x000000FF;
784 RXF2SIDH = (
unsigned char) tamp;
786 tamp = filter & 0x00000007;
788 RXF2SIDL = (
unsigned char) tamp;
793 RXF3SIDLbits.EXIDEN = 0x00;
795 tamp = (filter >> 3);
796 tamp = tamp & 0x000000FF;
797 RXF3SIDH = (
unsigned char) tamp;
799 tamp = filter & 0x00000007;
801 RXF3SIDL = (
unsigned char) tamp;
806 RXF4SIDLbits.EXIDEN = 0x00;
808 tamp = (filter >> 3);
809 tamp = tamp & 0x000000FF;
810 RXF4SIDH = (
unsigned char) tamp;
812 tamp = filter & 0x00000007;
814 RXF4SIDL = (
unsigned char) tamp;
819 RXF5SIDLbits.EXIDEN = 0x00;
821 tamp = (filter >> 3);
822 tamp = tamp & 0x000000FF;
823 RXF5SIDH = (
unsigned char) tamp;
825 tamp = filter & 0x00000007;
827 RXF5SIDL = (
unsigned char) tamp;
833 RXF0SIDLbits.EXIDEN = 0x01;
835 tamp = filter & 0x000000FF;
836 RXF0EIDL = (
unsigned char) tamp;
838 tamp = filter & 0x0000FF00;
840 RXF0EIDH = (
unsigned char) tamp;
842 if (filter & 0x00010000)
843 RXF0SIDLbits.EID16 = 0x01;
845 RXF0SIDLbits.EID16 = 0x00;
847 if (filter & 0x00020000)
848 RXF0SIDLbits.EID17 = 0x01;
850 RXF0SIDLbits.EID17 = 0x00;
852 if (filter & 0x00040000)
853 RXF0SIDLbits.SID0 = 0x01;
855 RXF0SIDLbits.SID0 = 0x00;
857 if (filter & 0x00080000)
858 RXF0SIDLbits.SID1 = 0x01;
860 RXF0SIDLbits.SID1 = 0x00;
862 if (filter & 0x00100000)
863 RXF0SIDLbits.SID2 = 0x01 ;
865 RXF0SIDLbits.SID2 = 0x00 ;
867 tamp = (filter >> 21);
868 tamp = tamp & 0x000000FF;
869 RXF0SIDH = (
unsigned char) tamp;
874 RXF1SIDLbits.EXIDEN = 0x01;
876 tamp = filter & 0x000000FF;
877 RXF1EIDL = (
unsigned char) tamp;
879 tamp = filter & 0x0000FF00;
881 RXF1EIDH = (
unsigned char) tamp;
883 if (filter & 0x00010000)
884 RXF1SIDLbits.EID16 = 0x01;
886 RXF1SIDLbits.EID16 = 0x00;
888 if (filter & 0x00020000)
889 RXF1SIDLbits.EID17 = 0x01;
891 RXF1SIDLbits.EID17 = 0x00;
893 if (filter & 0x00040000)
894 RXF1SIDLbits.SID0 = 0x01;
896 RXF1SIDLbits.SID0 = 0x00;
898 if (filter & 0x00080000)
899 RXF1SIDLbits.SID1 = 0x01;
901 RXF1SIDLbits.SID1 = 0x00;
903 if (filter & 0x00100000)
904 RXF1SIDLbits.SID2 = 0x01 ;
906 RXF1SIDLbits.SID2 = 0x00 ;
908 tamp = (filter >> 21);
909 tamp = tamp & 0x000000FF;
910 RXF1SIDH = (
unsigned char) tamp;
916 RXF2SIDLbits.EXIDEN = 0x01;
918 tamp = filter & 0x000000FF;
919 RXF2EIDL = (
unsigned char) tamp;
921 tamp = filter & 0x0000FF00;
923 RXF2EIDH = (
unsigned char) tamp;
925 if (filter & 0x00010000)
926 RXF2SIDLbits.EID16 = 0x01;
928 RXF2SIDLbits.EID16 = 0x00;
930 if (filter & 0x00020000)
931 RXF2SIDLbits.EID17 = 0x01;
933 RXF2SIDLbits.EID17 = 0x00;
935 if (filter & 0x00040000)
936 RXF2SIDLbits.SID0 = 0x01;
938 RXF2SIDLbits.SID0 = 0x00;
940 if (filter & 0x00080000)
941 RXF2SIDLbits.SID1 = 0x01;
943 RXF2SIDLbits.SID1 = 0x00;
945 if (filter & 0x00100000)
946 RXF2SIDLbits.SID2 = 0x01 ;
948 RXF2SIDLbits.SID2 = 0x00 ;
950 tamp = (filter >> 21);
951 tamp = tamp & 0x000000FF;
952 RXF2SIDH = (
unsigned char) tamp;
957 RXF3SIDLbits.EXIDEN = 0x01;
959 tamp = filter & 0x000000FF;
960 RXF3EIDL = (
unsigned char) tamp;
962 tamp = filter & 0x0000FF00;
964 RXF3EIDH = (
unsigned char) tamp;
966 if (filter & 0x00010000)
967 RXF3SIDLbits.EID16 = 0x01;
969 RXF3SIDLbits.EID16 = 0x00;
971 if (filter & 0x00020000)
972 RXF3SIDLbits.EID17 = 0x01;
974 RXF3SIDLbits.EID17 = 0x00;
976 if (filter & 0x00040000)
977 RXF3SIDLbits.SID0 = 0x01;
979 RXF3SIDLbits.SID0 = 0x00;
981 if (filter & 0x00080000)
982 RXF3SIDLbits.SID1 = 0x01;
984 RXF3SIDLbits.SID1 = 0x00;
986 if (filter & 0x00100000)
987 RXF3SIDLbits.SID2 = 0x01 ;
989 RXF3SIDLbits.SID2 = 0x00 ;
991 tamp = (filter >> 21);
992 tamp = tamp & 0x000000FF;
993 RXF3SIDH = (
unsigned char) tamp;
998 RXF4SIDLbits.EXIDEN = 0x01;
1000 tamp = filter & 0x000000FF;
1001 RXF4EIDL = (
unsigned char) tamp;
1003 tamp = filter & 0x0000FF00;
1005 RXF4EIDH = (
unsigned char) tamp;
1007 if (filter & 0x00010000)
1008 RXF4SIDLbits.EID16 = 0x01;
1010 RXF4SIDLbits.EID16 = 0x00;
1012 if (filter & 0x00020000)
1013 RXF4SIDLbits.EID17 = 0x01;
1015 RXF4SIDLbits.EID17 = 0x00;
1017 if (filter & 0x00040000)
1018 RXF4SIDLbits.SID0 = 0x01;
1020 RXF4SIDLbits.SID0 = 0x00;
1022 if (filter & 0x00080000)
1023 RXF4SIDLbits.SID1 = 0x01;
1025 RXF4SIDLbits.SID1 = 0x00;
1027 if (filter & 0x00100000)
1028 RXF4SIDLbits.SID2 = 0x01 ;
1030 RXF4SIDLbits.SID2 = 0x00 ;
1032 tamp = (filter >> 21);
1033 tamp = tamp & 0x000000FF;
1034 RXF4SIDH = (
unsigned char) tamp;
1039 RXF5SIDLbits.EXIDEN = 0x01;
1041 tamp = filter & 0x000000FF;
1042 RXF5EIDL = (
unsigned char) tamp;
1044 tamp = filter & 0x0000FF00;
1046 RXF5EIDH = (
unsigned char) tamp;
1048 if (filter & 0x00010000)
1049 RXF5SIDLbits.EID16 = 0x01;
1051 RXF5SIDLbits.EID16 = 0x00;
1053 if (filter & 0x00020000)
1054 RXF5SIDLbits.EID17 = 0x01;
1056 RXF5SIDLbits.EID17 = 0x00;
1058 if (filter & 0x00040000)
1059 RXF5SIDLbits.SID0 = 0x01;
1061 RXF5SIDLbits.SID0 = 0x00;
1063 if (filter & 0x00080000)
1064 RXF5SIDLbits.SID1 = 0x01;
1066 RXF5SIDLbits.SID1 = 0x00;
1068 if (filter & 0x00100000)
1069 RXF5SIDLbits.SID2 = 0x01 ;
1071 RXF5SIDLbits.SID2 = 0x00 ;
1073 tamp = (filter >> 21);
1074 tamp = tamp & 0x000000FF;
1075 RXF5SIDH = (
unsigned char) tamp;
1087 CANCONbits.ABAT = 1;
1096 return (COMSTATbits.TXBO);
1104 return (COMSTATbits.TXBP);
1113 return (COMSTATbits.RXBP);
1121 return (COMSTATbits.TXWARN);
1129 return (COMSTATbits.RXWARN);
1156 return (!TXB0CONbits.TXREQ || !TXB1CONbits.TXREQ || !TXB2CONbits.TXREQ);
1165 return (RXB0CONbits.RXFUL || RXB1CONbits.RXFUL);