Kinetis Bootloader  2.0.0
Common bootloader for Kinetis devices
fsl_flexcan.h
1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * o Redistributions of source code must retain the above copyright notice, this list
9  * of conditions and the following disclaimer.
10  *
11  * o Redistributions in binary form must reproduce the above copyright notice, this
12  * list of conditions and the following disclaimer in the documentation and/or
13  * other materials provided with the distribution.
14  *
15  * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from this
17  * software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 #ifndef _FSL_FLEXCAN_H_
31 #define _FSL_FLEXCAN_H_
32 
33 #include "fsl_common.h"
34 
42 /******************************************************************************
43  * Definitions
44  *****************************************************************************/
46 #define FLEXCAN_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
49 #define FLEXCAN_ID_STD(id) \
50  (((uint32_t)(((uint32_t)(id)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK)
51 #define FLEXCAN_ID_EXT(id) \
52  (((uint32_t)(((uint32_t)(id)) << CAN_ID_EXT_SHIFT)) & \
53  (CAN_ID_EXT_MASK | CAN_ID_STD_MASK))
56 #define FLEXCAN_RX_MB_STD_MASK(id, rtr, ide) \
57  (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
58  FLEXCAN_ID_STD(id))
59 #define FLEXCAN_RX_MB_EXT_MASK(id, rtr, ide) \
60  (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
61  FLEXCAN_ID_EXT(id))
64 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) \
65  (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
66  (FLEXCAN_ID_STD(id) << 1))
67 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH(id, rtr, ide) \
68  (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
69  (FLEXCAN_ID_STD(id) << 16))
70 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW(id, rtr, ide) \
71  (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \
72  FLEXCAN_ID_STD(id))
73 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH(id) \
74  ((FLEXCAN_ID_STD(id) & 0x7F8) << 21)
75 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH(id) \
76  ((FLEXCAN_ID_STD(id) & 0x7F8) << 13)
78 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW(id) \
79  ((FLEXCAN_ID_STD(id) & 0x7F8) << 5)
80 #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id) \
81  ((FLEXCAN_ID_STD(id) & 0x7F8) >> 3)
82 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) \
83  (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
84  (FLEXCAN_ID_EXT(id) << 1))
85 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH(id, rtr, ide) \
86  ( \
87  ((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
88  ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) \
89  << 1))
90 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW(id, rtr, ide) \
91  (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \
92  ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) >> \
93  15))
94 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id) \
95  ((FLEXCAN_ID_EXT(id) & 0x1FE00000) << 3)
96 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH(id) \
97  ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \
98  5)
99 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW(id) \
100  ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \
101  13)
102 #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) \
103  ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> 21)
106 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_A(id, rtr, ide) \
107  FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide)
108 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_HIGH(id, rtr, ide) \
109  FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH( \
110  id, rtr, ide)
111 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_LOW(id, rtr, ide) \
112  FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW( \
113  id, rtr, ide)
114 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_HIGH(id) \
115  FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH( \
116  id)
117 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_HIGH(id) \
118  FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH( \
119  id)
120 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_LOW(id) \
121  FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW( \
122  id)
123 #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_LOW(id) \
124  FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id)
126 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_A(id, rtr, ide) \
127  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide)
128 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_HIGH(id, rtr, ide) \
129  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH( \
130  id, rtr, ide)
131 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_LOW(id, rtr, ide) \
132  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW( \
133  id, rtr, ide)
134 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_HIGH(id) \
135  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id)
137 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_HIGH(id) \
138  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH( \
139  id)
140 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_LOW(id) \
141  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW( \
142  id)
143 #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_LOW(id) \
144  FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id)
147 enum _flexcan_status
148 {
162 };
163 
165 typedef enum _flexcan_frame_format
166 {
170 
172 typedef enum _flexcan_frame_type
173 {
177 
179 typedef enum _flexcan_clock_source
180 {
184 
186 typedef enum _flexcan_rx_fifo_filter_type
187 {
190  0x1U,
192  0x2U,
195 
203 typedef enum _flexcan_rx_fifo_priority
204 {
208 
216 {
217  kFLEXCAN_BusOffInterruptEnable = CAN_CTRL1_BOFFMSK_MASK,
218  kFLEXCAN_ErrorInterruptEnable = CAN_CTRL1_ERRMSK_MASK,
219  kFLEXCAN_RxWarningInterruptEnable = CAN_CTRL1_RWRNMSK_MASK,
220  kFLEXCAN_TxWarningInterruptEnable = CAN_CTRL1_TWRNMSK_MASK,
221  kFLEXCAN_WakeUpInterruptEnable = CAN_MCR_WAKMSK_MASK,
222 };
223 
233 {
234  kFLEXCAN_SynchFlag = CAN_ESR1_SYNCH_MASK,
235  kFLEXCAN_TxWarningIntFlag = CAN_ESR1_TWRNINT_MASK,
236  kFLEXCAN_RxWarningIntFlag = CAN_ESR1_RWRNINT_MASK,
237  kFLEXCAN_TxErrorWarningFlag = CAN_ESR1_TXWRN_MASK,
238  kFLEXCAN_RxErrorWarningFlag = CAN_ESR1_RXWRN_MASK,
239  kFLEXCAN_IdleFlag = CAN_ESR1_IDLE_MASK,
240  kFLEXCAN_FaultConfinementFlag = CAN_ESR1_FLTCONF_MASK,
241  kFLEXCAN_TransmittingFlag = CAN_ESR1_TX_MASK,
242  kFLEXCAN_ReceivingFlag = CAN_ESR1_RX_MASK,
243  kFLEXCAN_BusOffIntFlag = CAN_ESR1_BOFFINT_MASK,
244  kFLEXCAN_ErrorIntFlag = CAN_ESR1_ERRINT_MASK,
245  kFLEXCAN_WakeUpIntFlag = CAN_ESR1_WAKINT_MASK,
246  kFLEXCAN_ErrorFlag = CAN_ESR1_BIT1ERR_MASK |
247  CAN_ESR1_BIT0ERR_MASK |
248  CAN_ESR1_ACKERR_MASK | CAN_ESR1_CRCERR_MASK | CAN_ESR1_FRMERR_MASK | CAN_ESR1_STFERR_MASK,
249 };
250 
259 {
260  kFLEXCAN_StuffingError = CAN_ESR1_STFERR_MASK,
261  kFLEXCAN_FormError = CAN_ESR1_FRMERR_MASK,
262  kFLEXCAN_CrcError = CAN_ESR1_CRCERR_MASK,
263  kFLEXCAN_AckError = CAN_ESR1_ACKERR_MASK,
264  kFLEXCAN_Bit0Error = CAN_ESR1_BIT0ERR_MASK,
265  kFLEXCAN_Bit1Error = CAN_ESR1_BIT1ERR_MASK,
266 };
267 
277 {
278  kFLEXCAN_RxFifoOverflowFlag = CAN_IFLAG1_BUF7I_MASK,
279  kFLEXCAN_RxFifoWarningFlag = CAN_IFLAG1_BUF6I_MASK,
280  kFLEXCAN_RxFifoFrameAvlFlag = CAN_IFLAG1_BUF5I_MASK,
281 };
282 
283 #if defined(__CC_ARM)
284 #pragma anon_unions
285 #endif
286 
287 typedef struct _flexcan_frame
288 {
289  struct
290  {
291  uint32_t timestamp : 16;
292  uint32_t length : 4;
293  uint32_t type : 1;
294  uint32_t format : 1;
295  uint32_t reserve1 : 1;
296  uint32_t idhit : 9;
297  };
298  struct
299  {
300  uint32_t id : 29;
301  uint32_t reserve2 : 3;
302  };
303  union
304  {
305  struct
306  {
307  uint32_t dataWord0;
308  uint32_t dataWord1;
309  };
310  struct
311  {
312  uint8_t dataByte3;
313  uint8_t dataByte2;
314  uint8_t dataByte1;
315  uint8_t dataByte0;
316  uint8_t dataByte7;
317  uint8_t dataByte6;
318  uint8_t dataByte5;
319  uint8_t dataByte4;
320  };
321  };
323 
325 typedef struct _flexcan_config
326 {
327  uint32_t baudRate;
329  uint8_t maxMbNum;
333 #if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT)
334  bool enableDoze;
335 #endif
337 
339 typedef struct _flexcan_timing_config
340 {
341  uint8_t preDivider;
342  uint8_t rJumpwidth;
343  uint8_t phaseSeg1;
344  uint8_t phaseSeg2;
345  uint8_t propSeg;
347 
357 typedef struct _flexcan_rx_mb_config
358 {
359  uint32_t id;
364 
366 typedef struct _flexcan_rx_fifo_config
367 {
368  uint32_t *idFilterTable;
369  uint8_t idFilterNum;
373 
375 typedef struct _flexcan_mb_transfer
376 {
378  uint8_t mbIdx;
380 
382 typedef struct _flexcan_fifo_transfer
383 {
386 
388 typedef struct _flexcan_handle flexcan_handle_t;
389 
401  CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData);
402 
405 {
407  void *userData;
408  flexcan_frame_t *volatile mbFrameBuf[CAN_WORD1_COUNT];
411  volatile uint8_t mbState[CAN_WORD1_COUNT];
412  volatile uint8_t rxFifoState;
413 };
414 
415 /******************************************************************************
416  * API
417  *****************************************************************************/
418 
419 #if defined(__cplusplus)
420 extern "C" {
421 #endif
422 
450 void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *config, uint32_t sourceClock_Hz);
451 
460 void FLEXCAN_Deinit(CAN_Type *base);
461 
478 
479 /* @} */
480 
501 void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config);
502 
512 void FlEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask);
513 
522 void FlEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask);
523 
538 void FlEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask);
539 
552 void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable);
553 
567 void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable);
568 
580 void FlEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *config, bool enable);
581 
582 /* @} */
583 
599 static inline uint32_t FLEXCAN_GetStatusFlags(CAN_Type *base)
600 {
601  return base->ESR1;
602 }
603 
613 static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint32_t mask)
614 {
615  /* Write 1 to clear status flag. */
616  base->ESR1 = mask;
617 }
618 
629 static inline void FlEXCAN_GetBusErrCount(CAN_Type *base, uint8_t *txErrBuf, uint8_t *rxErrBuf)
630 {
631  if (txErrBuf)
632  {
633  *txErrBuf = (uint8_t)((base->ECR & CAN_ECR_TXERRCNT_MASK) >> CAN_ECR_TXERRCNT_SHIFT);
634  }
635 
636  if (rxErrBuf)
637  {
638  *rxErrBuf = (uint8_t)((base->ECR & CAN_ECR_RXERRCNT_MASK) >> CAN_ECR_RXERRCNT_SHIFT);
639  }
640 }
641 
651 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
652 static inline uint64_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint64_t mask)
653 #else
654 static inline uint32_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint32_t mask)
655 #endif
656 {
657 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
658  return ((((uint64_t)base->IFLAG1) & mask) | ((((uint64_t)base->IFLAG2) << 32) & mask));
659 #else
660  return (base->IFLAG1 & mask);
661 #endif
662 }
663 
672 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
673 static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint64_t mask)
674 #else
675 static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint32_t mask)
676 #endif
677 {
678 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
679  base->IFLAG1 = (uint32_t)(mask & 0xFFFFFFFF);
680  base->IFLAG2 = (uint32_t)(mask >> 32);
681 #else
682  base->IFLAG1 = mask;
683 #endif
684 }
685 
686 /* @} */
687 
702 static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint32_t mask)
703 {
704  /* Solve Wake Up Interrupt. */
706  {
707  base->MCR |= CAN_MCR_WAKMSK_MASK;
708  }
709 
710  /* Solve others. */
711  base->CTRL1 |= (mask & (~((uint32_t)kFLEXCAN_WakeUpInterruptEnable)));
712 }
713 
723 static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint32_t mask)
724 {
725  /* Solve Wake Up Interrupt. */
727  {
728  base->MCR &= ~CAN_MCR_WAKMSK_MASK;
729  }
730 
731  /* Solve others. */
732  base->CTRL1 &= ~(mask & (~((uint32_t)kFLEXCAN_WakeUpInterruptEnable)));
733 }
734 
743 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
744 static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint64_t mask)
745 #else
746 static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint32_t mask)
747 #endif
748 {
749 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
750  base->IMASK1 |= (uint32_t)(mask & 0xFFFFFFFF);
751  base->IMASK2 |= (uint32_t)(mask >> 32);
752 #else
753  base->IMASK1 |= mask;
754 #endif
755 }
756 
765 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
766 static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint64_t mask)
767 #else
768 static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint32_t mask)
769 #endif
770 {
771 #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
772  base->IMASK1 &= ~((uint32_t)(mask & 0xFFFFFFFF));
773  base->IMASK2 &= ~((uint32_t)(mask >> 32));
774 #else
775  base->IMASK1 &= ~mask;
776 #endif
777 }
778 
779 /* @} */
780 
781 #if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA)
782 
795 void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable);
796 
805 static inline uint32_t FLEXCAN_GetRxFifoHeadAddr(CAN_Type *base)
806 {
807  return (uint32_t) & (base->MB[0].CS);
808 }
809 
810 /* @} */
811 #endif /* FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA */
812 
826 static inline void FLEXCAN_Enable(CAN_Type *base, bool enable)
827 {
828  if (enable)
829  {
830  base->MCR &= ~CAN_MCR_MDIS_MASK;
831 
832  /* Wait FlexCAN exit from low-power mode. */
833  while (base->MCR & CAN_MCR_LPMACK_MASK)
834  {
835  }
836  }
837  else
838  {
839  base->MCR |= CAN_MCR_MDIS_MASK;
840 
841  /* Wait FlexCAN enter low-power mode. */
842  while (!(base->MCR & CAN_MCR_LPMACK_MASK))
843  {
844  }
845  }
846 }
847 
861 status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *txFrame);
862 
878 status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame);
879 
890 status_t FlEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *rxFrame);
891 
892 /* @} */
893 
910 status_t FlEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *txFrame);
911 
924 status_t FlEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame);
925 
937 
950 void FLEXCAN_TransferCreateHandle(CAN_Type *base,
951  flexcan_handle_t *handle,
953  void *userData);
954 
968 status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
969 
982 status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
983 
997  flexcan_handle_t *handle,
999 
1009 void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
1010 
1020 void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
1021 
1030 void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle);
1031 
1040 void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle);
1041 
1042 /* @} */
1043 
1044 #if defined(__cplusplus)
1045 }
1046 #endif
1047 
1050 #endif /* _FSL_FLEXCAN_H_ */
flexcan_rx_fifo_filter_type_t
FlexCAN Rx Fifo Filter type.
Definition: fsl_flexcan.h:186
FlexCAN Rx FIFO transfer.
Definition: fsl_flexcan.h:382
void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle)
Abort interrupt driven message receive from Rx FIFO process.
Definition: fsl_flexcan.c:1115
Definition: fsl_flexcan.h:237
flexcan_rx_fifo_priority_t
FlexCAN Rx FIFO priority.
Definition: fsl_flexcan.h:203
Definition: fsl_flexcan.h:242
flexcan_frame_t *volatile rxFifoFrameBuf
Definition: fsl_flexcan.h:410
Definition: fsl_flexcan.h:161
Definition: fsl_flexcan.h:150
static void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint64_t mask) static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base
Disable FlexCAN Message Buffer interrupts.
Definition: fsl_flexcan.h:156
flexcan_frame_format_t format
Definition: fsl_flexcan.h:361
uint32_t baudRate
Definition: fsl_flexcan.h:327
Definition: fsl_flexcan.h:160
bool enableSelfWakeup
Definition: fsl_flexcan.h:331
_flexcan_interrupt_enable
FlexCAN interrupt configuration structure, default settings all disabled.
Definition: fsl_flexcan.h:215
Definition: fsl_flexcan.h:220
void(* flexcan_transfer_callback_t)(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData)
FlexCAN transfer callback function.
Definition: fsl_flexcan.h:400
Definition: fsl_flexcan.h:188
FlexCAN Message Buffer transfer.
Definition: fsl_flexcan.h:375
Definition: fsl_flexcan.h:244
Definition: fsl_flexcan.h:240
uint32_t id
Definition: fsl_flexcan.h:359
uint8_t phaseSeg1
Definition: fsl_flexcan.h:343
FlexCAN handle structure.
Definition: fsl_flexcan.h:404
Definition: fsl_flexcan.h:153
status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_fifo_transfer_t *xfer)
Receive message from Rx FIFO using IRQ.
Definition: fsl_flexcan.c:1047
Definition: fsl_flexcan.h:243
void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
Abort interrupt driven message send process.
Definition: fsl_flexcan.c:1073
Definition: fsl_flexcan.h:175
flexcan_transfer_callback_t callback
Definition: fsl_flexcan.h:406
Definition: fsl_flexcan.h:261
uint8_t propSeg
Definition: fsl_flexcan.h:345
Definition: fsl_flexcan.h:264
Definition: fsl_flexcan.h:157
_flexcan_error_flags
FlexCAN error status flags.
Definition: fsl_flexcan.h:258
Definition: fsl_flexcan.h:154
Definition: fsl_flexcan.h:239
Definition: fsl_flexcan.h:191
uint8_t idFilterNum
Definition: fsl_flexcan.h:369
Definition: fsl_flexcan.h:262
Definition: fsl_flexcan.h:260
status_t FlEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *rxFrame)
Read a FlexCAN Message from Rx FIFO.
Definition: fsl_flexcan.c:824
uint8_t preDivider
Definition: fsl_flexcan.h:341
void FLEXCAN_TransferCreateHandle(CAN_Type *base, flexcan_handle_t *handle, flexcan_transfer_callback_t callback, void *userData)
Initialize the FlexCAN handle.
Definition: fsl_flexcan.c:921
uint8_t mbIdx
Definition: fsl_flexcan.h:378
volatile uint8_t rxFifoState
Definition: fsl_flexcan.h:412
static void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint64_t mask) static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base
Clear FlexCAN Message Buffer interrupt flags.
status_t FlEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame)
Performs a polling receive transaction on the CAN bus.
Definition: fsl_flexcan.c:889
static uint64_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint64_t mask) static inline uint32_t FLEXCAN_GetMbStatusFlags(CAN_Type *base
Get FlexCAN Message Buffer interrupt flags.
void FlEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask)
Set the FlexCAN Receive Message Buffer Global Mask.
Definition: fsl_flexcan.c:469
Definition: fsl_flexcan.h:218
uint32_t * idFilterTable
Definition: fsl_flexcan.h:368
status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *txFrame)
Write FlexCAN Message to Transmit Message Buffer.
Definition: fsl_flexcan.c:712
Definition: fsl_flexcan.h:219
Definition: fsl_flexcan.h:221
Definition: fsl_common.h:100
void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle)
FlexCAN IRQ handle function.
Definition: fsl_flexcan.c:1134
Definition: fsl_flexcan.h:151
_flexcan_flags
FlexCAN status flags.
Definition: fsl_flexcan.h:232
static void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint64_t mask) static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base
Enable FlexCAN Message Buffer interrupts.
void FlEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask)
Set the FlexCAN Receive Individual Mask.
Definition: fsl_flexcan.c:495
Definition: fsl_flexcan.h:241
Definition: fsl_flexcan.h:236
Definition: fsl_flexcan.h:167
Definition: fsl_flexcan.h:168
void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable)
Configure a FlexCAN Receive Message Buffer.
Definition: fsl_flexcan.c:535
Definition: fsl_flexcan.h:181
Definition: fsl_flexcan.h:217
FlexCAN protocol timing characteristic configuration structure.
Definition: fsl_flexcan.h:339
flexcan_rx_fifo_priority_t priority
Definition: fsl_flexcan.h:371
flexcan_clock_source_t
FlexCAN clock source.
Definition: fsl_flexcan.h:179
static void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint32_t mask)
Clear status flags with provide mask.
Definition: fsl_flexcan.h:613
Definition: fsl_flexcan.h:235
static void FLEXCAN_EnableInterrupts(CAN_Type *base, uint32_t mask)
Enable FlexCAN interrupts according to provided mask.
Definition: fsl_flexcan.h:702
static uint32_t FLEXCAN_GetStatusFlags(CAN_Type *base)
Get FlexCAN module interrupt flags.
Definition: fsl_flexcan.h:599
static void FLEXCAN_DisableInterrupts(CAN_Type *base, uint32_t mask)
Disable FlexCAN interrupts according to provided mask.
Definition: fsl_flexcan.h:723
static uint32_t FLEXCAN_GetRxFifoHeadAddr(CAN_Type *base)
Get the Rx FIFO Head address.
Definition: fsl_flexcan.h:805
void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config)
Setting FlexCAN protocol timing characteristic.
Definition: fsl_flexcan.c:448
void FlEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *config, bool enable)
Configure the FlexCAN Rx FIFO.
Definition: fsl_flexcan.c:579
flexcan_frame_t * frame
Definition: fsl_flexcan.h:377
void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx)
Abort interrupt driven message receive process.
Definition: fsl_flexcan.c:1096
Definition: fsl_flexcan.h:245
Definition: fsl_flexcan.h:234
static void FlEXCAN_GetBusErrCount(CAN_Type *base, uint8_t *txErrBuf, uint8_t *rxErrBuf)
Get the FlexCAN Bus Error Counter value.
Definition: fsl_flexcan.h:629
Definition: fsl_flexcan.h:278
bool enableIndividMask
Definition: fsl_flexcan.h:332
status_t FlEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *txFrame)
Performs a polling send transaction on the CAN bus.
Definition: fsl_flexcan.c:868
FlexCAN message frame structure.
Definition: fsl_flexcan.h:287
Definition: fsl_flexcan.h:149
FlexCAN Receive Message Buffer configuration structure.
Definition: fsl_flexcan.h:357
Definition: fsl_flexcan.h:279
Definition: fsl_flexcan.h:265
status_t FlEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *rxFrame)
Performs a polling receive transaction from Rx FIFO on the CAN bus.
Definition: fsl_flexcan.c:903
void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable)
Configure a FlexCAN Transmit Message Buffer.
Definition: fsl_flexcan.c:509
Definition: fsl_flexcan.h:155
Definition: fsl_flexcan.h:189
FlexCAN module configuration structure.
Definition: fsl_flexcan.h:325
void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable)
Enable or disable FlexCAN Rx FIFO DMA request.
Definition: fsl_flexcan.c:685
Definition: fsl_flexcan.h:174
flexcan_rx_fifo_filter_type_t idFilterType
Definition: fsl_flexcan.h:370
Definition: fsl_flexcan.h:159
Definition: fsl_flexcan.h:205
Definition: fsl_flexcan.h:193
void * userData
Definition: fsl_flexcan.h:407
uint8_t phaseSeg2
Definition: fsl_flexcan.h:344
Definition: fsl_flexcan.h:238
Definition: fsl_flexcan.h:263
Definition: fsl_flexcan.h:182
void FLEXCAN_Deinit(CAN_Type *base)
De-initializes a FlexCAN instance.
Definition: fsl_flexcan.c:419
static void FLEXCAN_Enable(CAN_Type *base, bool enable)
Enables or disable the FlexCAN module operation.
Definition: fsl_flexcan.h:826
void FlEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask)
Set the FlexCAN Receive FIFO Global Mask.
Definition: fsl_flexcan.c:483
flexcan_frame_type_t type
Definition: fsl_flexcan.h:362
_flexcan_rx_fifo_flags
FlexCAN Rx FIFO status flags.
Definition: fsl_flexcan.h:276
flexcan_frame_type_t
FlexCAN frame type.
Definition: fsl_flexcan.h:172
flexcan_frame_format_t
FlexCAN frame format.
Definition: fsl_flexcan.h:165
bool enableDoze
Definition: fsl_flexcan.h:334
status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame)
Read a FlexCAN Message from Receive Message Buffer.
Definition: fsl_flexcan.c:765
uint8_t rJumpwidth
Definition: fsl_flexcan.h:342
Definition: fsl_flexcan.h:280
status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
Receive message using IRQ.
Definition: fsl_flexcan.c:1016
void FLEXCAN_GetDefaultConfig(flexcan_config_t *config)
Get the default configuration structure.
Definition: fsl_flexcan.c:431
int32_t status_t
Type used for all status and error return values.
Definition: fsl_common.h:121
bool enableLoopBack
Definition: fsl_flexcan.h:330
void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *config, uint32_t sourceClock_Hz)
Initializes a FlexCAN instance.
Definition: fsl_flexcan.c:366
Definition: fsl_flexcan.h:206
FlexCAN Rx FIFO configure structure.
Definition: fsl_flexcan.h:366
flexcan_clock_source_t clkSrc
Definition: fsl_flexcan.h:328
uint8_t maxMbNum
Definition: fsl_flexcan.h:329
Definition: fsl_flexcan.h:246
Definition: fsl_flexcan.h:158
status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer)
send message using IRQ
Definition: fsl_flexcan.c:969