57 boolean result =
FALSE;
61 stat.U = hwObj->STAT.U;
63 if ((stat.B.TXRQ != 0) && (stat.B.NEWDAT != 0))
93 hwObj->CTR.U = 0x0000FFFFUL;
95 hwObj->FCR.U = 0x00000000UL;
96 hwObj->FGPR.U = 0x00000000UL;
97 hwObj->IPR.U = 0x00000000UL;
98 hwObj->AMR.U = 0x3FFFFFFFUL;
99 hwObj->DATAL.U = 0x00000000UL;
100 hwObj->DATAH.U = 0x00000000UL;
101 hwObj->AR.U = 0x00000000UL;
124 *data++ = hwObj->DATAL.U;
125 *data++ = hwObj->DATAH.U;
131 *data++ = hwTopObj->EDATA0.U;
136 *data++ = hwTopObj->EDATA1.U;
141 *data++ = hwTopObj->EDATA2.U;
146 *data++ = hwTopObj->EDATA3.U;
151 *data++ = hwTopObj->EDATA4.U;
152 *data++ = hwTopObj->EDATA5.U;
157 *data++ = hwTopObj->EDATA6.U;
159 *data++ = hwBotObj->EDATA0.U;
160 *data++ = hwBotObj->EDATA1.U;
161 *data++ = hwBotObj->EDATA2.U;
166 *data++ = hwBotObj->EDATA3.U;
167 *data++ = hwBotObj->EDATA4.U;
168 *data++ = hwBotObj->EDATA5.U;
169 *data++ = hwBotObj->EDATA6.U;
188 msg->
data[0] = hwObj->DATAL.U;
189 msg->
data[1] = hwObj->DATAH.U;
202 uint32 index = mcan->MSID[msgObjGroup].U;
207 mcan->MSPND[msgObjGroup].U = ~(1UL << index);
208 msgObjId = index + (msgObjGroup << 5);
219 status.
U = hwObj->STAT.U;
227 uint32 shift = (1U << flag);
229 return (hwObj->STAT.U & shift) ?
TRUE :
FALSE;
238 boolean longFrame = (hwObj->FCR.B.FDF != 0) ?
TRUE :
FALSE;
245 IfxMultican_MsgObj_doReadLongFrame(mcan, msgObjId, msg, data);
249 if (hwObj->STAT.B.RXUPD != 0)
253 else if (hwObj->STAT.B.NEWDAT != 0)
258 IfxMultican_MsgObj_doReadLongFrame(mcan, msgObjId, msg, data);
278 if (hwObj->STAT.B.NEWDAT != 0)
281 if (hwObj->STAT.B.RXUPD != 0)
286 else if (hwObj->STAT.B.MSGLST != 0)
293 IfxMultican_MsgObj_doReadMessage(hwObj, msg);
317 boolean longFrame = (hwObj->FCR.B.FDF != 0) ?
TRUE :
FALSE;
324 if (hwObj->STAT.B.TXRQ)
335 hwObj->DATAL.U = *data++;
336 hwObj->DATAH.U = *data++;
342 hwTopObj->EDATA0.U = *data++;
347 hwTopObj->EDATA1.U = *data++;
352 hwTopObj->EDATA2.U = *data++;
357 hwTopObj->EDATA3.U = *data++;
362 hwTopObj->EDATA4.U = *data++;
363 hwTopObj->EDATA5.U = *data++;
368 hwTopObj->EDATA6.U = *data++;
370 hwBotObj->EDATA0.U = *data++;
371 hwBotObj->EDATA1.U = *data++;
372 hwBotObj->EDATA2.U = *data++;
377 hwBotObj->EDATA3.U = *data++;
378 hwBotObj->EDATA4.U = *data++;
379 hwBotObj->EDATA5.U = *data++;
380 hwBotObj->EDATA6.U = *data++;
431 if (hwObj->STAT.B.TXRQ)
441 hwObj->DATAL.U = msg->
data[0];
442 hwObj->DATAH.U = msg->
data[1];
481 hwObj->CTR.U = ctr.U;
483 hwObj->AMR.B.AM = accMask << ((extend != 0) ? 0 : 18);
484 hwObj->AR.B.IDE = (
id << ((extend != 0) ? 0 : 18)) | (extend << 29);
488 hwObj->CTR.U = ctr.U;
497 ctr.U = 1U << (flag + 16);
499 hwObj->CTR.U = ctr.U;
505 hwNode->CR.U = 0x00000001;
506 hwNode->SR.U = 0x00000000;
507 hwNode->IPR.U = 0x00000000;
508 hwNode->PCR.U = 0x00000000;
509 hwNode->BTEVR.U = 0x00000000;
510 hwNode->ECNT.U = 0x00600000;
511 hwNode->FCR.U = 0x00000000;
518 hwNode->PCR.B.RXSEL = rxd->
select;
537 boolean busOffState = hwNode->SR.B.BOFF;
538 boolean errorWarningStatus = hwNode->SR.B.EWRN;
541 if ((busOffState != 0) && (hwNode->ECNT.B.TEC > 254))
546 hwNode->ECNT.B.TEC = 0x01;
547 hwNode->ECNT.B.REC = 0x01;
550 hwNode->SR.B.EWRN = 0;
553 hwNode->SR.B.ALERT = 0;
560 else if ((busOffState != 0) && (errorWarningStatus != 0))
566 else if ((busOffState == 0) && (errorWarningStatus == 0))
580 sint32 tempBRP, tempSJW, tempTSEG1 = 12;
581 sint32 bestBRP = 0, bestSJW = 0, bestTBAUD = 0, bestTSEG1 = 1, bestTSEG2;
603 for (tempBRP = 1; tempBRP <= (0x3F + 1); tempBRP++)
605 float32 Fquanta = moduleFreq / tempBRP;
606 sint32 tempTBAUD = Fquanta / baudrate;
607 float32 tempBaudrate = Fquanta / tempTBAUD;
610 if ((tempTBAUD <= 20) && (bestError > error))
613 bestTBAUD = tempTBAUD;
626 for (tempTSEG1 = 16; tempTSEG1 >= 3; tempTSEG1--)
628 sint32 tempSamplePoint = ((tempTSEG1 + 1) * 10000) / bestTBAUD;
629 sint32 error =
__abs(tempSamplePoint - samplePoint);
631 if (bestError > error)
633 bestTSEG1 = tempTSEG1;
637 if (tempSamplePoint < samplePoint)
643 bestTSEG2 = bestTBAUD - bestTSEG1 - 1;
648 for (tempSJW = 1; tempSJW <= 4; tempSJW++)
650 sint32 tempSynchJumpWidth = (tempSJW * 10000) / bestTBAUD;
651 sint32 error =
__abs(tempSynchJumpWidth - synchJumpWidth);
653 if (bestError > error)
663 nbtr.B.BRP = bestBRP - 1;
664 nbtr.B.SJW = bestSJW - 1;
665 nbtr.B.TSEG1 = bestTSEG1 - 1;
666 nbtr.B.TSEG2 = bestTSEG2 - 1;
670 hwNode->BTR.U = nbtr.U;
677 sint32 tempFBRP, tempFSJW, tempFTSEG1 = 12;
678 sint32 bestFBRP = 0, bestFSJW = 0, bestFTBAUD = 0, bestFTSEG1 = 1, bestFTSEG2;
700 for (tempFBRP = 1; tempFBRP <= (0x3F + 1); tempFBRP++)
702 float32 Fquanta = moduleFreq / tempFBRP;
703 sint32 tempTBAUD = Fquanta / baudrate;
704 float32 tempBaudrate = Fquanta / tempTBAUD;
707 if ((tempTBAUD <= 20) && (bestError > error))
710 bestFTBAUD = tempTBAUD;
723 for (tempFTSEG1 = 16; tempFTSEG1 >= 3; tempFTSEG1--)
725 sint32 tempSamplePoint = ((tempFTSEG1 + 1) * 10000) / bestFTBAUD;
726 sint32 error =
__abs(tempSamplePoint - samplePoint);
728 if (bestError > error)
730 bestFTSEG1 = tempFTSEG1;
734 if (tempSamplePoint < samplePoint)
740 bestFTSEG2 = bestFTBAUD - bestFTSEG1 - 1;
745 for (tempFSJW = 1; tempFSJW <= 4; tempFSJW++)
747 sint32 tempSynchJumpWidth = (tempFSJW * 10000) / bestFTBAUD;
748 sint32 error =
__abs(tempSynchJumpWidth - synchJumpWidth);
750 if (bestError > error)
758 Ifx_CAN_N_FBTR nfbtr;
760 nfbtr.B.FBRP = bestFBRP - 1;
761 nfbtr.B.FSJW = bestFSJW - 1;
762 nfbtr.B.FTSEG1 = bestFTSEG1 - 1;
763 nfbtr.B.FTSEG2 = bestFTSEG2 - 1;
765 hwNode->FBTR.U = nfbtr.U;
772 sint32 tempBRP, tempSJW, tempTSEG1 = 12;
773 sint32 bestBRP = 0, bestSJW = 0, bestTBAUD = 0, bestTSEG1 = 1, bestTSEG2;
795 for (tempBRP = 1; tempBRP <= (0x3F + 1); tempBRP++)
797 float32 Fquanta = moduleFreq / tempBRP;
798 sint32 tempTBAUD = Fquanta / baudrate;
799 float32 tempBaudrate = Fquanta / tempTBAUD;
802 if ((tempTBAUD <= 20) && (bestError > error))
805 bestTBAUD = tempTBAUD;
818 for (tempTSEG1 = 64; tempTSEG1 >= 3; tempTSEG1--)
820 sint32 tempSamplePoint = ((tempTSEG1 + 1) * 10000) / bestTBAUD;
821 sint32 error =
__abs(tempSamplePoint - samplePoint);
823 if (bestError > error)
825 bestTSEG1 = tempTSEG1;
829 if (tempSamplePoint < samplePoint)
835 bestTSEG2 = bestTBAUD - bestTSEG1 - 1;
840 for (tempSJW = 1; tempSJW <= 16; tempSJW++)
842 sint32 tempSynchJumpWidth = (tempSJW * 10000) / bestTBAUD;
843 sint32 error =
__abs(tempSynchJumpWidth - synchJumpWidth);
845 if (bestError > error)
853 Ifx_CAN_N_BTEVR nbtevr;
855 nbtevr.B.BRP = bestBRP - 1;
856 nbtevr.B.SJW = bestSJW - 1;
857 nbtevr.B.TSEG1 = bestTSEG1 - 1;
858 nbtevr.B.TSEG2 = bestTSEG2 - 1;
862 hwNode->BTEVR.U = nbtevr.U;
869 Ifx_CAN_N_BTR nbtr = {.U = btr};
870 uint32 tempBRP = 1U + nbtr.B.BRP;
871 uint32 tempSJW = 1U + nbtr.B.SJW;
872 uint32 tempTSEG1 = 1U + nbtr.B.TSEG1;
873 uint32 tempTSEG2 = 1U + nbtr.B.TSEG2;
874 uint32 tempDIV8 = (nbtr.B.DIV8 != 0) ? 8U : 1U;
876 uint32 tempTSEG = 1 + tempTSEG1 + tempTSEG2;
878 *baudrate = (
uint32)(moduleFreq / (
float32)(tempDIV8 * tempBRP * tempTSEG));
904 MODULE_SRC.CAN.CAN[0].INT[i].U = 0x00000000;
907 for (i = 0; i < 8; i++)
909 mcan->MSPND[i].U = 0x00000000;
912 mcan->MSIMASK.U = 0x00000000;
913 mcan->MCR.U = 0x00000000;
917 mcan->FDR.U = 0x00000000;
920 mcan->CLC.U = 0x00000001;
928 return &(MODULE_SRC.CAN.CAN[0].INT[srcId]);
934 Ifx_CAN_PANCTR panctr;
936 panctr.B.PANAR1 = arg1;
937 panctr.B.PANAR2 = arg2;
938 panctr.B.PANCMD = cmd;
941 mcan->PANCTR.U = panctr.U;