iLLD_TC27xD  1.0
IfxMultican_Can.c
Go to the documentation of this file.
1 /**
2  * \file IfxMultican_Can.c
3  * \brief MULTICAN CAN details
4  *
5  * \version iLLD_1_0_0_11_0
6  * \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
7  *
8  *
9  * IMPORTANT NOTICE
10  *
11  *
12  * Infineon Technologies AG (Infineon) is supplying this file for use
13  * exclusively with Infineon's microcontroller products. This file can be freely
14  * distributed within development tools that are supporting such microcontroller
15  * products.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
18  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
20  * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
21  * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
22  *
23  */
24 
25 /******************************************************************************/
26 /*----------------------------------Includes----------------------------------*/
27 /******************************************************************************/
28 
29 #include "IfxMultican_Can.h"
30 
31 /******************************************************************************/
32 /*-------------------------Function Implementations---------------------------*/
33 /******************************************************************************/
34 
36 {
37  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId);
38 
39  Ifx_CAN_MO_AR ar;
40  Ifx_CAN_MO_AMR amr;
41  Ifx_CAN_MO_FCR fcr;
42 
43  ar.U = hwObj->AR.U;
44  amr.U = hwObj->AMR.U;
45  fcr.U = hwObj->FCR.U;
46 
47  // TODO: distinguish remote frame
48  config->frame = (hwObj->STAT.B.DIR != 0) ? IfxMultican_Frame_transmit : IfxMultican_Frame_receive;
49 
50  config->control.singleDataTransfer = fcr.B.SDT;
51  config->control.messageLen = (IfxMultican_DataLengthCode)fcr.B.DLC;
52  config->control.extendedFrame = ar.B.IDE;
53  config->control.matchingId = amr.B.MIDE;
54 
55  config->messageId = ar.B.ID >> ((config->control.extendedFrame != 0) ? 0 : 18);
56  config->priority = ar.B.PRI;
57  config->acceptanceMask = amr.B.AM >> ((config->control.extendedFrame != 0) ? 0 : 18);
58 
59  // TODO: check if these parameters are used:
60  //config->control.singleTransmitTrial = FALSE;
61  //config->firstId = 0;
62  //config->lastId = 0;
63 
64  // TODO: config->nodeId;
65 }
66 
67 
69 {
70  msgObj->node = config->node;
71  msgObj->msgObjId = config->msgObjId;
72  msgObj->msgObjCount = config->msgObjCount;
73  msgObj->fifoPointer = 0;
74 
75  Ifx_CAN *mcanSFR = msgObj->node->mcan;
76 
77  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(mcanSFR, msgObj->msgObjId);
78 
80 
81  boolean longFrame = (config->control.messageLen > IfxMultican_DataLengthCode_8) ? TRUE : FALSE;
82 
83  /* check for the receive frame */
84  boolean receiveFrame = (config->frame == IfxMultican_Frame_receive) ||
87 
88  /* check for the transmit frame */
89  boolean transmitFrame = ((config->frame == IfxMultican_Frame_transmit) ||
91  (config->frame == IfxMultican_Frame_remoteRequest)) &&
92  (config->gatewayTransfers != 1);
93 
94  /* check for gateway source object */
95  boolean gatewaySourceObj = (config->gatewayTransfers != 0) ? TRUE : FALSE;
96 
97  /* check for the receive FIFO and trabsmit FIFO */
98  boolean receiveFifo = FALSE, transmitFifo = FALSE;
99 
100  if (config->gatewayTransfers != 1)
101  {
102  receiveFifo = (config->msgObjCount > 1) && (receiveFrame);
103  transmitFifo = (config->msgObjCount > 1) && (transmitFrame);
104  }
105 
106  /* check for the gateway FIFO */
107  boolean gatewayFifo = (config->msgObjCount > 1) && (gatewaySourceObj);
108 
109  /* will be used for Fifo slave objects */
110  IfxMultican_MsgObjId objId, firstSlaveObjId, lastSlaveObjId, gatewayDstObjId = 0;
111 
112  /* select the first slave object */
113  if (!config->firstSlaveObjId)
114  { // if not selected
115  firstSlaveObjId = config->msgObjId + 1;
116  }
117  else
118  {
119  firstSlaveObjId = config->firstSlaveObjId;
120  }
121 
122  /* select the last slave object */
123  lastSlaveObjId = firstSlaveObjId + (config->msgObjCount - 1);
124 
125  uint32 i;
126 
127  /* for standard and FIFO (Tx & Rx) base objects */
128  {
129  /* MSGVAL: Set message as not valid */
131 
132  /* reset RXPND */
134 
135  /* reset TXPND */
137 
138  /* reset RXUPD */
140 
141  /* reset NEWDAT */
143 
144  /* reset MSGLST */
146 
147  /* reset RTSEL */
149 
150  /* reset RXPND */
152 
153  /* Configuration of the CAN Message Object List Structure */
154  /* Allocate MO for the node associated list */
155  {
156  /* for standard, gateway and FIFO (Tx & Rx) base objects */
157  /* Append message object to the end of the list */
158  IfxMultican_setListCommand(mcanSFR, 0x2, msgObj->node->nodeId + 1, msgObj->msgObjId);
159 
160  /* long frame CAN FD */
161  if (longFrame)
162  {
163  /* Allocate MO with extended Data fields slected by FGPR.B.TOP and FGPR.B.BOT, for the unallocated list (0) */
164  /* Append message object to the end of the list(0) */
165  IfxMultican_setListCommand(mcanSFR, 0x2, 0, config->control.topMsgObjId);
166  IfxMultican_setListCommand(mcanSFR, 0x2, 0, config->control.bottomMsgObjId);
167  }
168 
169  /* for all standard FIFO (Tx and Rx) and gateway FIFO slave objects */
170  if (config->msgObjCount > 1)
171  {
172  for (i = 0; i < config->msgObjCount; i++)
173  {
174  objId = firstSlaveObjId + i;
175 
176  IfxMultican_setListCommand(mcanSFR, 0x2, msgObj->node->nodeId + 1, objId);
177  }
178  }
179  }
180 
181  if ((config->frame == IfxMultican_Frame_receive) || (config->frame == IfxMultican_Frame_remoteAnswer))
182  {
183  /* set RXEN, in case of recieve frame or remote answer*/
185  }
186 
187  /* in case of transmit frame */
188  if ((transmitFrame) && (config->gatewayTransfers != 1))
189  {
190  /* set TXEN0 */
192 
193  /* set TXEN1 */
195 
196  /* reset RTSEL */
198 
199  /* MSGVAL: Set message as valid */
201  }
202 
203  if (((config->frame == IfxMultican_Frame_transmit) || (config->frame == IfxMultican_Frame_remoteAnswer)) && (config->gatewayTransfers != 1))
204  {
205  /* set DIR, in case of transmit frame or remote answer*/
207  }
208  else
209  {
210  /* clear DIR, in case of receive frame or gateway transfers*/
212  }
213  }
214  {
215  /* for standard message object */
216  if (config->msgObjCount == 1)
217  {
218  /* gateway transfers */
219  if (gatewaySourceObj)
220  {
221  /* select Gateway Source mode for FCR.MMC */
223 
224  /* select the gateway destination object as the next object if not selected */
225  if (!config->gatewayConfig.gatewayDstObjId)
226  {
227  gatewayDstObjId = msgObj->msgObjId + 1;
228  }
229  else
230  {
231  gatewayDstObjId = config->gatewayConfig.gatewayDstObjId;
232  }
233  }
234  /* long frame CAN FD */
235  /* FDEN = 1, EDL = 1 and BRS = 0/1 */
236  else if (config->node->fastNode && longFrame)
237  {
238  /* select CAN FD object mode for FCR.MMC */
240  }
241  /* standard frame */
242  /* FDEN = 0/1, EDL = 0 and BRS = 0 (BRS = 1 also has no effect here) */
243  else
244  {
245  /* select standard object for FCR.MMC */
247  }
248  }
249  /* for receive FIFO base object */
250  else if (receiveFifo)
251  {
252  /* select receive FIFO base object for FCR.MMC */
254  }
255  /* for transmit FIFO base object */
256  else if (transmitFifo)
257  {
258  /* select transmit FIFO base object for FCR.MMC */
260  }
261  /* for gateway FIFO source object */
262  else if (gatewayFifo)
263  {
264  /* select transmit Gateway Source for FCR.MMC */
266  }
267  else
268  {}
269 
270  /* for standard and FIFO (Tx & Rx) base objects */
271  /* enable receive interrupt FCR.RXIE if choosen in case of receive frame */
272  boolean receiveInterruptEnabled = (config->rxInterrupt.enabled) && (receiveFrame);
273  IfxMultican_MsgObj_setReceiveInterrupt(hwObj, receiveInterruptEnabled);
274 
275  /* enable transmit interrupt FCR.TXIE if choosen in case of transmit frame */
276  boolean transmitInterruptEnabled = (config->txInterrupt.enabled) && (transmitFrame);
277  IfxMultican_MsgObj_setTransmitInterrupt(hwObj, transmitInterruptEnabled);
278 
279  /* set FCR.RMM in case of remote answer */
280  boolean remoteMonitoringEnabled = (config->frame == IfxMultican_Frame_remoteAnswer);
281  IfxMultican_MsgObj_setRemoteMonitoring(hwObj, remoteMonitoringEnabled);
282 
283  /* long frame CAN FD */
284  /* FDEN = 1, EDL = 1 and BRS = 0/1 */
285  /* in case of recieve Msg Obj, it recieves long and long+fast frames */
286  if (config->node->fastNode && longFrame)
287  {
288  /* enable extended data length */
290 
291  /* set data length code FCR.DLC */
293 
294  /* set bit rate switch (fast bit rate enable/disable) */
296  }
297  /* standard frame */
298  /* FDEN = 0/1, EDL = 0 and BRS = 0 (BRS = 1 also has no effect here) */
299  /* in case of recieve Msg Obj, it recieves only standard frames */
300  else
301  {
302  /* set data length code FCR.DLC */
304  }
305 
306  /* only for standard message object */
307  if ((config->msgObjCount == 1) && (!gatewaySourceObj))
308  {
309  /* set single transmit trial FCR.STT if choosen */
311 
312  /* set single data transfer FCR.SDT if choosen */
314  }
315  /* for FIFO (Tx or Rx) base object and gateway objects*/
316  else
317  {
318  /* clear single transmit trial FCR.STT */
320 
321  /* clear single data transfer FCR.SDT */
323  }
324  }
325 
326  {
327  /* for standard message object */
328  if (config->msgObjCount == 1)
329  {
330  /* long frame CAN FD */
331  if (longFrame)
332  {
333  /* set bottom pointer FGPR.BOT */
335 
336  /* set top pointer FGPR.TOP */
338  }
339  /* standard gateway transfers */
340  else if (gatewaySourceObj)
341  {
342  /* set (current pointer) FGPR.CUR, to gateway destination object */
343  IfxMultican_MsgObj_setCurrentObjectPointer(hwObj, gatewayDstObjId);
344  }
345  /* standard frame */
346  else
347  {
348  /* clear all pointers */
350  }
351  }
352 
353  /* for FIFO (Tx or Rx) base object and gateway FIFO object */
354  else
355  {
356  /* set bottom pointer FGPR.BOT, to the next message object (first FIFO slave object) */
357  IfxMultican_MsgObj_setBottomObjectPointer(hwObj, firstSlaveObjId);
358 
359  /* store the first slave object Id as the fifoPointer in msgObj structure for FIFO transfers */
360  msgObj->fifoPointer = firstSlaveObjId;
361 
362  /* set top pointer FGPR.TOP, to the last FIFO slave object */
363  IfxMultican_MsgObj_setTopObjectPointer(hwObj, lastSlaveObjId);
364 
365  /* set start of FIFO (current pointer) FGPR.CUR, to first FIFO slave object (bottom pointer) */
366  IfxMultican_MsgObj_setCurrentObjectPointer(hwObj, firstSlaveObjId);
367 
368  if (receiveFifo || transmitFifo)
369  {
370  /* set select object pointer FGPR.SEL to one object before last FIFO slave object */
371  IfxMultican_MsgObj_setSelectObjectPointer(hwObj, lastSlaveObjId - 1);
372  }
373  }
374  }
375 
376  {
377  /* for standard, gateway and FIFO (Tx & Rx) base objects */
378  /* set the given acceptance mask */
380 
381  /* enable matching ID if choosen */
383  }
384 
385  {
386  /* for standard, gateway and FIFO (Tx & Rx) base objects */
387  /* set message ID */
389 
390  /* set identifier extension if extended frame is choosen */
392 
393  /* set filtering priority */
395  }
396 
397  /* for standard, gateway and FIFO (Tx & Rx) base objects */
398  /* clear both data registers DATAL and DATAH */
400 
401  {
402  /* for standard, gateway and FIFO (Tx & Rx) base objects */
403  /* select IPR.RXINP */
405 
406  /* select IPR.TXINP */
408 
409  /* set IPR.MNP */
411  }
412 
413  /* for each receive FIFO slave object */
414  if (receiveFifo)
415  {
416  for (i = 0; i < config->msgObjCount; i++)
417  {
418  objId = firstSlaveObjId + i; /* increment the message object ID */
419 
420  Ifx_CAN_MO *hwSlaveObj = IfxMultican_MsgObj_getPointer(mcanSFR, objId);
421 
422  /* clear all RXEN flag */
424 
425  /* set data length code */
427 
428  /* clear DATAL and DATAH registers */
430  }
431  }
432 
433  /* for each transmit FIFO slave object */
434  if (transmitFifo)
435  {
436  /* configure each transmit FIFO slave object as an independent transmit object */
437  for (i = 0; i < config->msgObjCount; i++)
438  {
439  objId = firstSlaveObjId + i; /* increment the message object ID */
440 
441  Ifx_CAN_MO *hwSlaveObj = IfxMultican_MsgObj_getPointer(mcanSFR, objId);
442 
443  /* set message mode as transmit FIFO slave mode */
445 
446  /* point current pointer(FGPR.CUR) back to the base FIFO object */
448 
449  /* set data length code */
451 
452  /* clear DATAL and DATAH registers */
454 
455  /* set the given acceptance mask */
457 
458  /* enable matching ID if choosen */
460 
461  /* set message ID */
462  IfxMultican_MsgObj_setMessageId(hwSlaveObj, config->messageId, config->control.extendedFrame);
463 
464  /* set identifier extension if extended frame is choosen */
466 
467  /* set filtering priority */
468  IfxMultican_MsgObj_setPriorityClass(hwSlaveObj, config->priority);
469 
470  /* set TXEN0 */
472 
473  /* clear all TXEN1 flags expect for the slave object in the FGPR.CUR of the base FIFO object */
474  if (objId == firstSlaveObjId)
475  {
477  }
478  else
479  {
481  }
482 
483  /* set DIR, in case of transmit frame or remote answer*/
484  if ((config->frame == IfxMultican_Frame_transmit) || (config->frame == IfxMultican_Frame_remoteAnswer))
485  {
487  }
488  }
489  }
490 
491  /* for standard and receive FIFO base objects */
492  if (config->frame == IfxMultican_Frame_receive)
493  {
494  /* set RTSEL */
496 
497  /* MSGVAL: Set message as valid */
499  }
500 
501  /* for each receive FIFO slave object */
502  if (config->msgObjCount > 1)
503  {
504  IfxMultican_MsgObjId nextFifoObj;
505 
506  for (i = 0; i < config->msgObjCount; i++)
507  {
508  objId = firstSlaveObjId + i;
509 
510  Ifx_CAN_MO *hwSlaveObj = IfxMultican_MsgObj_getPointer(mcanSFR, objId);
511 
512  /* for receive FIFO and gateway FIFO */
513  if (!transmitFifo)
514  {
515  /* MSGVAL: Set message as valid */
517  }
518 
519  /* for transmit FIFO and receive FIFO */
520  if (!gatewayFifo)
521  {
522  /* store the next FIFO object number in the bottom pointer (FGPR.BOT) of the current FIFO object (for ease of use in transfers)*/
523  /* if it is the last FIFO object */
524  if (i == (config->msgObjCount - 1))
525  { /* wrap around the FIFO by making the next pointer of last object as the first FIFO object */
526  nextFifoObj = firstSlaveObjId;
527  }
528  else
529  {
530  nextFifoObj = objId + 1;
531  }
532 
533  IfxMultican_MsgObj_setBottomObjectPointer(hwSlaveObj, nextFifoObj);
534  }
535  }
536  }
537 
538  if (gatewaySourceObj)
539  {
540  /* set FCR.DLCC if chosen*/
542 
543  /* set FCR.DATC if chosen*/
545 
546  /* set FCR.IDC if chosen*/
548 
549  /* set FCR.GDFS if chosen*/
551  }
552 
553  return status;
554 }
555 
556 
558 {
559  // @$GENTABLE(MsgObjConfig,defaultConfig);
560 
561  config->node = node;
562  config->msgObjId = 0;
563  config->msgObjCount = 1;
564 
566 
567  config->control.topMsgObjId = 252;
568  config->control.bottomMsgObjId = 253;
569  config->control.fastBitRate = FALSE; /* fast bit rate enable/disable */
570 
571  config->control.extendedFrame = FALSE;
572  config->control.matchingId = FALSE;
573  config->control.singleDataTransfer = FALSE;
575  config->acceptanceMask = 0x7FFFFFFFUL;
576  config->messageId = 0;
577 
580  config->rxInterrupt.enabled = FALSE;
581  config->rxInterrupt.srcId = 0;
582  config->txInterrupt.enabled = FALSE;
583  config->txInterrupt.srcId = 0;
584 
585  config->firstSlaveObjId = 0;
586 
587  config->gatewayTransfers = FALSE;
589  config->gatewayConfig.copyData = TRUE;
590  config->gatewayConfig.copyId = TRUE;
592  config->gatewayConfig.gatewayDstObjId = 0;
593 }
594 
595 
597 {
598  if (msgObj->msgObjCount > 1)
599  {
600  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->fifoPointer);
601  return IfxMultican_MsgObj_isRxPending(hwObj);
602  }
603  else
604  {
605  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId);
606  return IfxMultican_MsgObj_isRxPending(hwObj);
607  }
608 }
609 
610 
612 {
613  if (msgObj->msgObjCount > 1)
614  {
615  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->fifoPointer);
616 
618  }
619  else
620  {
621  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId);
622 
624  }
625 }
626 
627 
629 {
630  if (msgObj->msgObjCount > 1)
631  {
632  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->fifoPointer);
633 
634  return IfxMultican_MsgObj_isTxPending(hwObj);
635  }
636  else
637  {
638  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId);
639 
640  return IfxMultican_MsgObj_isTxPending(hwObj);
641  }
642 }
643 
644 
646 {
648  IfxMultican_MsgObjId objId;
649 
650  if (msgObj->msgObjCount > 1)
651  {
652  /* for FIFO message Objects */
653  objId = msgObj->fifoPointer;
654  }
655  else
656  {
657  /* for standard message Objects */
658  objId = msgObj->msgObjId;
659  }
660 
661  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, objId);
662 
663  /* clear pending flag */
665 
666  /* read the message object */
667  status = IfxMultican_MsgObj_readMessage(hwObj, msg);
668 
669  /* if successfull: */
670  if (status & IfxMultican_Status_newData)
671  {
672  if (msgObj->msgObjCount > 1)
673  {
674  /* set next message object(MOSTAT.PNEXT) of the current object as the next txFIFO slave object */
676  }
677  else
678  {}
679  }
680 
681  return status;
682 }
683 
684 
686 {
688  IfxMultican_MsgObjId objId;
689 
690  if (msgObj->msgObjCount > 1)
691  {
692  /* for FIFO message Objects */
693  objId = msgObj->fifoPointer;
694 
695  Ifx_CAN_MO *hwBaseObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, msgObj->msgObjId);
696 
697  /* set message as valid, in case of FIFO MSGVAL of base object has to be set before setting it to each slave object */
699  }
700  else
701  {
702  /* for standard message Objects */
703  objId = msgObj->msgObjId;
704  }
705 
706  Ifx_CAN_MO *hwObj = IfxMultican_MsgObj_getPointer(msgObj->node->mcan, objId);
707 
708  /* send the message */
709  status = IfxMultican_MsgObj_sendMessage(hwObj, msg);
710 
711  /* if successfull: */
712  if (status == IfxMultican_Status_ok)
713  {
714  if (msgObj->msgObjCount > 1)
715  {
716  /* set next message object(MOSTAT.PNEXT) of the current object as the next txFIFO slave object */
718  }
719  else
720  {}
721  }
722 
723  return status;
724 }
725 
726 
728 {
729  Ifx_CAN_N *hwNode = node->node;
730 
731  IfxMultican_Can mcan;
732 
733  mcan.mcan = node->mcan;
734 
736 
737  IfxMultican_calcTimingFromBTR(fcan, hwNode->BTR.U, &config->baudrate, &config->samplePoint, &config->synchJumpWidth);
738 
739  config->loopBackMode = (hwNode->PCR.B.LBM != 0) ? TRUE : FALSE;
740  config->analyzerMode = (hwNode->CR.B.CALM != 0) ? TRUE : FALSE;
741 
742  //config->rxPin; // TODO
743  //config->txPin; // TODO
744 }
745 
746 
748 {
749  Ifx_CAN_N *hwNode = IfxMultican_Node_getPointer(config->module, config->nodeId);
751 
752  node->mcan = config->module;
753  node->node = hwNode;
754  node->nodeId = config->nodeId;
755  node->fastNode = FALSE;
756 
757  { /* Configure node control */
758  IfxMultican_Node_resetControlRegister(hwNode); // default value 0x00000041
764  }
765 
766  { /* Configure the interrupt source to service request node */
767  IfxMultican_Node_resetInterruptPointers(hwNode); // default value 0x00000041
773  }
774 
775  { /* NECNT write enabled only of NCR.CCE set */
780  }
781 
782  { /* NPCR write enabled only of NCR.CCE set */
784 
785  if (config->txPin != NULL_PTR)
786  {
788  }
789 
790  if (config->rxPin != NULL_PTR)
791  {
793  }
794  }
795 
796  {
797  IfxMultican_Can mcan;
798  mcan.mcan = node->mcan;
799 
801 
802  if (!config->flexibleDataRate)
803  {
804  IfxMultican_Node_setBitTiming(hwNode, fcan, config->baudrate, config->samplePoint, config->synchJumpWidth);
805  }
806  else
807  {
809  node->fastNode = TRUE;
810 
813 
814  if (config->fdConfig.loopDelayOffset)
815  {
818  }
819  }
820  }
821 
822  { /* Configuration of the Frame Counter */
825  }
826 
828  /* Configuration of the TTCAN Functionality: Not implemented */
829 
830  return status;
831 }
832 
833 
835 {
836  config->module = mcan->mcan;
837 
838  config->nodeId = IfxMultican_NodeId_0;
839 
840  config->loopBackMode = FALSE;
841  config->analyzerMode = FALSE;
842 
843  config->baudrate = 500000;
844  config->samplePoint = 8000;
845  config->synchJumpWidth = 2000;
846 
847  config->flexibleDataRate = FALSE;
848 
849  config->fdConfig.nominalBaudrate = 500000;
850  config->fdConfig.nominalSynchJumpWidth = 8000;
851  config->fdConfig.nominalSamplePoint = 2000;
852  config->fdConfig.fastBaudrate = 1000000;
853  config->fdConfig.fastSynchJumpWidth = 8000;
854  config->fdConfig.fastSamplePoint = 2000;
855  config->fdConfig.loopDelayOffset = 0;
856 
857  config->rxPin = NULL_PTR;
859  config->txPin = NULL_PTR;
861 
862  config->transferInterrupt.enabled = FALSE;
863  config->transferInterrupt.srcId = 0;
864 
866  config->lastErrorCodeInterrupt.srcId = 0;
867 
868  config->alertInterrupt.enabled = FALSE;
869  config->alertInterrupt.srcId = 0;
870 
872  config->frameCounterInterrupt.srcId = 0;
873 
874  config->timerInterrupt.enabled = FALSE;
875  config->timerInterrupt.srcId = 0;
876 
877  config->errorWarningLevel = 96;
878 }
879 
880 
882 {
883  uint32 i, counter;
884 
885  for (counter = 1; counter < 256; counter = counter * 2)
886  {
887  node->node->ECNT.B.TEC = counter;
888  }
889 
890  for (i = 0; i < 10; ++i)
891  {
892  node->node->ECNT.B.TEC = ++counter;
893  }
894 }
895 
896 
898 {
899  config->clockSelect = IfxMultican_getInputClock(mcan->mcan);
900 
902  {
904 
905  uint16 dividerMode = IfxMultican_getFractionalDividerMode(mcan->mcan);
907 
908  if (dividerMode == 1)
909  {
910  config->moduleFreq = fsys / (1024 - stepValue);
911  }
912  else if (dividerMode == 2)
913  {
914  config->moduleFreq = (fsys * stepValue) / 1024;
915  }
916  else
917  {
918  config->moduleFreq = 0;
919  }
920  }
921  else if (config->clockSelect == IfxMultican_ClockSelect_fosc0)
922  {
924  }
925  else if (config->clockSelect == IfxMultican_ClockSelect_fErayPll)
926  {
928  }
929  else
930  {
931  config->moduleFreq = 0.0;
932  }
933 }
934 
935 
937 {
938  IfxMultican_Can_Config config;
939 
940  IfxMultican_Can_getConfig(mcan, &config);
941 
942  return config.moduleFreq;
943 }
944 
945 
947 {
948  Ifx_CAN *mcanSFR = config->module;
949 
950  mcan->mcan = mcanSFR;
951 
952  uint16 stepValue, dividerMode, i;
953 
954  /* currently supports only fclc */
956  {
957  {
958  uint16 stepN, stepF;
959  boolean normalDiv;
960  float32 freqN, freqF;
961 
963 
964  /* Normal divider mode */
965  stepN = (uint16)__minf(__maxf(0, 1024.0 - (fsys / config->moduleFreq)), 1023);
966  freqN = fsys / (1024 - stepN);
967 
968  /* Fractional divider mode */
969  stepF = (uint16)__minf(((config->moduleFreq * 1024) / fsys), 1023);
970  freqF = (fsys * stepF) / 1024;
971 
972  normalDiv = (__absf(config->moduleFreq - freqN) <= __absf(config->moduleFreq - freqF));
973 
974  stepValue = (normalDiv != 0) ? stepN : stepF;
975  dividerMode = (normalDiv != 0) ? 1 : 2;
976  }
977 
980 
981  /* Enable module, disregard Sleep Mode request */
982  IfxMultican_enableModule(mcanSFR);
984 
985  /* Wait until module is enabled */
986  while (IfxMultican_isModuleEnabled(mcanSFR) == FALSE)
987  {}
988 
989  /* Select the clock input, two writes to the CLKSEL are always necessary */
991  IfxMultican_setInputClock(mcanSFR, IfxMultican_ClockSelect_fclc); /* Selects Fclc = Fspb */
992 
993  IfxMultican_setFractionalDividerStepValue(mcanSFR, stepValue);
994  IfxMultican_setFractionalDividerMode(mcanSFR, dividerMode);
995  IfxScuWdt_setCpuEndinit(passwd);
996  }
997  else
998  {}
999 
1001 
1002 #if 0
1003  // TODO
1004 
1005  /* deinitialise all nodes */
1006  {
1007  for (i = 0; i < IFXMULTICAN_NUM_NODES; i++)
1008  {
1010  }
1011  }
1012 
1013  /* deinitialise all message objects */
1014  for (i = 0; i < IFXMULTICAN_NUM_MESSAGE_OBJECTS; i++)
1015  {
1016  IfxMultican_MsgObj_deinit(mcan, i);
1017  }
1018 
1019 #endif
1020 
1021  /* deinitialise all pending bits */
1022  for (i = 0; i < 8; i++)
1023  {
1025  }
1026 
1027  /* The position is simply given by the message pending number MPN */
1029 
1030  /* All MO contribute to the calculation of the Message index */
1031  IfxMultican_setMessageIndexMask(mcanSFR, 0xFFFFFFFF);
1032 
1033  /* Configure interrupt node pointers */
1034  IfxMultican_SrcId srcId;
1035 
1036  for (srcId = 0; srcId < IFXMULTICAN_NUM_SRC; srcId++)
1037  {
1038  volatile Ifx_SRC_SRCR *srcPointer = IfxMultican_getSrcPointer(mcanSFR, srcId);
1039  IfxSrc_init(srcPointer, config->nodePointer[srcId].typeOfService, config->nodePointer[srcId].priority);
1040 
1041  if (config->nodePointer[srcId].priority)
1042  {
1043  IfxSrc_enable(srcPointer);
1044  }
1045  else
1046  {
1047  IfxSrc_disable(srcPointer);
1048  }
1049  }
1050 
1051  return IfxMultican_Status_ok;
1052 }
1053 
1054 
1056 {
1057  IfxMultican_SrcId srcId;
1058  /** - take over module pointer */
1059  config->module = mcan;
1060 
1061  /** - Selected input clock is from CLC */
1063 
1064  /** - Module frequency is fSPB */
1066 
1067  for (srcId = 0; srcId < IFXMULTICAN_NUM_SRC; srcId++)
1068  {
1069  config->nodePointer[srcId].priority = 0;
1070  config->nodePointer[srcId].typeOfService = IfxSrc_Tos_cpu0;
1071  }
1072 }