123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308 |
- #ifndef _FSL_FLEXCAN_H_
- #define _FSL_FLEXCAN_H_
- #include "fsl_common.h"
- #define FLEXCAN_DRIVER_VERSION (MAKE_VERSION(2, 2, 0))
- #define FLEXCAN_ID_STD(id) \
- (((uint32_t)(((uint32_t)(id)) << CAN_ID_STD_SHIFT)) & CAN_ID_STD_MASK)
- #define FLEXCAN_ID_EXT(id) \
- (((uint32_t)(((uint32_t)(id)) << CAN_ID_EXT_SHIFT)) & \
- (CAN_ID_EXT_MASK | CAN_ID_STD_MASK))
- #define FLEXCAN_RX_MB_STD_MASK(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- FLEXCAN_ID_STD(id))
- #define FLEXCAN_RX_MB_EXT_MASK(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- FLEXCAN_ID_EXT(id))
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- (FLEXCAN_ID_STD(id) << 1))
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- (((uint32_t)(id) & 0x7FF) << 19))
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \
- (((uint32_t)(id) & 0x7FF) << 3))
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH(id) \
- (((uint32_t)(id) & 0x7F8) << 21)
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH(id) \
- (((uint32_t)(id) & 0x7F8) << 13)
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW(id) \
- (((uint32_t)(id) & 0x7F8) << 5)
- #define FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id) \
- (((uint32_t)(id) & 0x7F8) >> 3)
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- (FLEXCAN_ID_EXT(id) << 1))
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 31) | (uint32_t)((uint32_t)(ide) << 30)) | \
- ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) << 1))
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW(id, rtr, ide) \
- (((uint32_t)((uint32_t)(rtr) << 15) | (uint32_t)((uint32_t)(ide) << 14)) | \
- ((FLEXCAN_ID_EXT(id) & 0x1FFF8000) >> \
- 15))
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id) \
- ((FLEXCAN_ID_EXT(id) & 0x1FE00000) << 3)
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH(id) \
- ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \
- 5)
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW(id) \
- ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> \
- 13)
- #define FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id) \
- ((FLEXCAN_ID_EXT(id) & 0x1FE00000) >> 21)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_A(id, rtr, ide) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_A(id, rtr, ide)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_HIGH(id, rtr, ide) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_HIGH( \
- id, rtr, ide)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_B_LOW(id, rtr, ide) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_B_LOW( \
- id, rtr, ide)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_HIGH(id) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_HIGH( \
- id)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_HIGH(id) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_HIGH( \
- id)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_MID_LOW(id) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_MID_LOW( \
- id)
- #define FLEXCAN_RX_FIFO_STD_FILTER_TYPE_C_LOW(id) \
- FLEXCAN_RX_FIFO_STD_MASK_TYPE_C_LOW(id)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_A(id, rtr, ide) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_A(id, rtr, ide)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_HIGH(id, rtr, ide) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_HIGH( \
- id, rtr, ide)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_B_LOW(id, rtr, ide) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_B_LOW( \
- id, rtr, ide)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_HIGH(id) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_HIGH(id)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_HIGH(id) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_HIGH( \
- id)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_MID_LOW(id) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_MID_LOW( \
- id)
- #define FLEXCAN_RX_FIFO_EXT_FILTER_TYPE_C_LOW(id) \
- FLEXCAN_RX_FIFO_EXT_MASK_TYPE_C_LOW(id)
- enum _flexcan_status
- {
- kStatus_FLEXCAN_TxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 0),
- kStatus_FLEXCAN_TxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 1),
- kStatus_FLEXCAN_TxSwitchToRx = MAKE_STATUS(
- kStatusGroup_FLEXCAN, 2),
- kStatus_FLEXCAN_RxBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 3),
- kStatus_FLEXCAN_RxIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 4),
- kStatus_FLEXCAN_RxOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 5),
- kStatus_FLEXCAN_RxFifoBusy = MAKE_STATUS(kStatusGroup_FLEXCAN, 6),
- kStatus_FLEXCAN_RxFifoIdle = MAKE_STATUS(kStatusGroup_FLEXCAN, 7),
- kStatus_FLEXCAN_RxFifoOverflow = MAKE_STATUS(kStatusGroup_FLEXCAN, 8),
- kStatus_FLEXCAN_RxFifoWarning = MAKE_STATUS(kStatusGroup_FLEXCAN, 9),
- kStatus_FLEXCAN_ErrorStatus = MAKE_STATUS(kStatusGroup_FLEXCAN, 10),
- kStatus_FLEXCAN_UnHandled = MAKE_STATUS(kStatusGroup_FLEXCAN, 11),
- };
- typedef enum _flexcan_frame_format
- {
- kFLEXCAN_FrameFormatStandard = 0x0U,
- kFLEXCAN_FrameFormatExtend = 0x1U,
- } flexcan_frame_format_t;
- typedef enum _flexcan_frame_type
- {
- kFLEXCAN_FrameTypeData = 0x0U,
- kFLEXCAN_FrameTypeRemote = 0x1U,
- } flexcan_frame_type_t;
- #if (!defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE)) || !FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE
- typedef enum _flexcan_clock_source
- {
- kFLEXCAN_ClkSrcOsc = 0x0U,
- kFLEXCAN_ClkSrcPeri = 0x1U,
- } flexcan_clock_source_t;
- #endif
- typedef enum _flexcan_rx_fifo_filter_type
- {
- kFLEXCAN_RxFifoFilterTypeA = 0x0U,
- kFLEXCAN_RxFifoFilterTypeB =
- 0x1U,
- kFLEXCAN_RxFifoFilterTypeC =
- 0x2U,
- kFLEXCAN_RxFifoFilterTypeD = 0x3U,
- } flexcan_rx_fifo_filter_type_t;
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- typedef enum _flexcan_mb_size
- {
- kFLEXCAN_8BperMB = 0x0U,
- kFLEXCAN_16BperMB = 0x1U,
- kFLEXCAN_32BperMB = 0x2U,
- kFLEXCAN_64BperMB = 0x3U,
- } flexcan_mb_size_t;
- #endif
- typedef enum _flexcan_rx_fifo_priority
- {
- kFLEXCAN_RxFifoPrioLow = 0x0U,
- kFLEXCAN_RxFifoPrioHigh = 0x1U,
- } flexcan_rx_fifo_priority_t;
- enum _flexcan_interrupt_enable
- {
- kFLEXCAN_BusOffInterruptEnable = CAN_CTRL1_BOFFMSK_MASK,
- kFLEXCAN_ErrorInterruptEnable = CAN_CTRL1_ERRMSK_MASK,
- kFLEXCAN_RxWarningInterruptEnable = CAN_CTRL1_RWRNMSK_MASK,
- kFLEXCAN_TxWarningInterruptEnable = CAN_CTRL1_TWRNMSK_MASK,
- kFLEXCAN_WakeUpInterruptEnable = CAN_MCR_WAKMSK_MASK,
- };
- enum _flexcan_flags
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- kFLEXCAN_FDErrorIntFlag = CAN_ESR1_ERRINT_FAST_MASK,
- kFLEXCAN_BusoffDoneIntFlag = CAN_ESR1_BOFFDONEINT_MASK,
- #endif
- kFLEXCAN_SynchFlag = CAN_ESR1_SYNCH_MASK,
- kFLEXCAN_TxWarningIntFlag = CAN_ESR1_TWRNINT_MASK,
- kFLEXCAN_RxWarningIntFlag = CAN_ESR1_RWRNINT_MASK,
- kFLEXCAN_TxErrorWarningFlag = CAN_ESR1_TXWRN_MASK,
- kFLEXCAN_RxErrorWarningFlag = CAN_ESR1_RXWRN_MASK,
- kFLEXCAN_IdleFlag = CAN_ESR1_IDLE_MASK,
- kFLEXCAN_FaultConfinementFlag = CAN_ESR1_FLTCONF_MASK,
- kFLEXCAN_TransmittingFlag = CAN_ESR1_TX_MASK,
- kFLEXCAN_ReceivingFlag = CAN_ESR1_RX_MASK,
- kFLEXCAN_BusOffIntFlag = CAN_ESR1_BOFFINT_MASK,
- kFLEXCAN_ErrorIntFlag = CAN_ESR1_ERRINT_MASK,
- kFLEXCAN_WakeUpIntFlag = CAN_ESR1_WAKINT_MASK,
- kFLEXCAN_ErrorFlag =
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- CAN_ESR1_STFERR_FAST_MASK | CAN_ESR1_FRMERR_FAST_MASK | CAN_ESR1_CRCERR_FAST_MASK | CAN_ESR1_BIT0ERR_FAST_MASK |
- CAN_ESR1_BIT1ERR_FAST_MASK | CAN_ESR1_ERROVR_MASK |
- #endif
- CAN_ESR1_BIT1ERR_MASK | CAN_ESR1_BIT0ERR_MASK | CAN_ESR1_ACKERR_MASK | CAN_ESR1_CRCERR_MASK | CAN_ESR1_FRMERR_MASK |
- CAN_ESR1_STFERR_MASK,
- };
- enum _flexcan_error_flags
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- kFLEXCAN_FDStuffingError = CAN_ESR1_STFERR_FAST_MASK,
- kFLEXCAN_FDFormError = CAN_ESR1_FRMERR_FAST_MASK,
- kFLEXCAN_FDCrcError = CAN_ESR1_CRCERR_FAST_MASK,
- kFLEXCAN_FDBit0Error = CAN_ESR1_BIT0ERR_FAST_MASK,
- kFLEXCAN_FDBit1Error = CAN_ESR1_BIT1ERR_FAST_MASK,
- kFLEXCAN_OverrunError = CAN_ESR1_ERROVR_MASK,
- #endif
- kFLEXCAN_StuffingError = CAN_ESR1_STFERR_MASK,
- kFLEXCAN_FormError = CAN_ESR1_FRMERR_MASK,
- kFLEXCAN_CrcError = CAN_ESR1_CRCERR_MASK,
- kFLEXCAN_AckError = CAN_ESR1_ACKERR_MASK,
- kFLEXCAN_Bit0Error = CAN_ESR1_BIT0ERR_MASK,
- kFLEXCAN_Bit1Error = CAN_ESR1_BIT1ERR_MASK,
- };
- enum _flexcan_rx_fifo_flags
- {
- kFLEXCAN_RxFifoOverflowFlag = CAN_IFLAG1_BUF7I_MASK,
- kFLEXCAN_RxFifoWarningFlag = CAN_IFLAG1_BUF6I_MASK,
- kFLEXCAN_RxFifoFrameAvlFlag = CAN_IFLAG1_BUF5I_MASK,
- };
- #if defined(__CC_ARM)
- #pragma anon_unions
- #endif
- typedef struct _flexcan_frame
- {
- struct
- {
- uint32_t timestamp : 16;
- uint32_t length : 4;
- uint32_t type : 1;
- uint32_t format : 1;
- uint32_t : 1;
- uint32_t idhit : 9;
- };
- struct
- {
- uint32_t id : 29;
- uint32_t : 3;
- };
- union
- {
- struct
- {
- uint32_t dataWord0;
- uint32_t dataWord1;
- };
- struct
- {
- uint8_t dataByte3;
- uint8_t dataByte2;
- uint8_t dataByte1;
- uint8_t dataByte0;
- uint8_t dataByte7;
- uint8_t dataByte6;
- uint8_t dataByte5;
- uint8_t dataByte4;
- };
- };
- } flexcan_frame_t;
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- typedef struct _flexcan_fd_frame
- {
- struct
- {
- uint32_t timestamp : 16;
- uint32_t length : 4;
- uint32_t type : 1;
- uint32_t format : 1;
- uint32_t srr : 1;
- uint32_t : 1;
- uint32_t code : 4;
- uint32_t : 1;
- uint32_t esi : 1;
- uint32_t brs : 1;
- uint32_t edl : 1;
- };
- struct
- {
- uint32_t id : 29;
- uint32_t : 3;
- };
- union
- {
- struct
- {
- uint32_t dataWord[16];
- };
- struct
- {
- uint8_t dataByte3;
- uint8_t dataByte2;
- uint8_t dataByte1;
- uint8_t dataByte0;
- uint8_t dataByte7;
- uint8_t dataByte6;
- uint8_t dataByte5;
- uint8_t dataByte4;
- };
- };
- } flexcan_fd_frame_t;
- #endif
- typedef struct _flexcan_timing_config
- {
- uint16_t preDivider;
- uint8_t rJumpwidth;
- uint8_t phaseSeg1;
- uint8_t phaseSeg2;
- uint8_t propSeg;
- } flexcan_timing_config_t;
- typedef struct _flexcan_config
- {
- uint32_t baudRate;
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- uint32_t baudRateFD;
- #endif
- #if (!defined(FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE)) || !FSL_FEATURE_FLEXCAN_SUPPORT_ENGINE_CLK_SEL_REMOVE
- flexcan_clock_source_t clkSrc;
- #endif
- uint8_t maxMbNum;
- bool enableLoopBack;
- bool enableSelfWakeup;
- bool enableIndividMask;
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT) && FSL_FEATURE_FLEXCAN_HAS_DOZE_MODE_SUPPORT)
- bool enableDoze;
- #endif
- flexcan_timing_config_t timingConfig;
- } flexcan_config_t;
- typedef struct _flexcan_rx_mb_config
- {
- uint32_t id;
- flexcan_frame_format_t format;
- flexcan_frame_type_t type;
- } flexcan_rx_mb_config_t;
- typedef struct _flexcan_rx_fifo_config
- {
- uint32_t *idFilterTable;
- uint8_t idFilterNum;
- flexcan_rx_fifo_filter_type_t idFilterType;
- flexcan_rx_fifo_priority_t priority;
- } flexcan_rx_fifo_config_t;
- typedef struct _flexcan_mb_transfer
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- flexcan_fd_frame_t *framefd;
- #endif
- flexcan_frame_t *frame;
- uint8_t mbIdx;
- } flexcan_mb_transfer_t;
- typedef struct _flexcan_fifo_transfer
- {
- flexcan_frame_t *frame;
- } flexcan_fifo_transfer_t;
- typedef struct _flexcan_handle flexcan_handle_t;
- typedef void (*flexcan_transfer_callback_t)(
- CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData);
- struct _flexcan_handle
- {
- flexcan_transfer_callback_t callback;
- void *userData;
- flexcan_frame_t *volatile mbFrameBuf[CAN_WORD1_COUNT];
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- flexcan_fd_frame_t *volatile mbFDFrameBuf[CAN_WORD1_COUNT];
- #endif
-
- flexcan_frame_t *volatile rxFifoFrameBuf;
- volatile uint8_t mbState[CAN_WORD1_COUNT];
- volatile uint8_t rxFifoState;
- };
- #if defined(__cplusplus)
- extern "C" {
- #endif
- void FLEXCAN_Init(CAN_Type *base, const flexcan_config_t *config, uint32_t sourceClock_Hz);
- void FLEXCAN_Deinit(CAN_Type *base);
- void FLEXCAN_GetDefaultConfig(flexcan_config_t *config);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- void FLEXCAN_FDEnable(CAN_Type *base, flexcan_mb_size_t dataSize, bool brs);
- #endif
- void FLEXCAN_SetTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- void FLEXCAN_SetFDTimingConfig(CAN_Type *base, const flexcan_timing_config_t *config);
- #endif
- void FLEXCAN_SetRxMbGlobalMask(CAN_Type *base, uint32_t mask);
- void FLEXCAN_SetRxFifoGlobalMask(CAN_Type *base, uint32_t mask);
- void FLEXCAN_SetRxIndividualMask(CAN_Type *base, uint8_t maskIdx, uint32_t mask);
- void FLEXCAN_SetTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- void FLEXCAN_SetFDTxMbConfig(CAN_Type *base, uint8_t mbIdx, bool enable);
- #endif
- void FLEXCAN_SetRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- void FLEXCAN_SetFDRxMbConfig(CAN_Type *base, uint8_t mbIdx, const flexcan_rx_mb_config_t *config, bool enable);
- #endif
- void FLEXCAN_SetRxFifoConfig(CAN_Type *base, const flexcan_rx_fifo_config_t *config, bool enable);
- static inline uint32_t FLEXCAN_GetStatusFlags(CAN_Type *base)
- {
- return base->ESR1;
- }
- static inline void FLEXCAN_ClearStatusFlags(CAN_Type *base, uint32_t mask)
- {
-
- base->ESR1 = mask;
- }
- static inline void FLEXCAN_GetBusErrCount(CAN_Type *base, uint8_t *txErrBuf, uint8_t *rxErrBuf)
- {
- if (txErrBuf)
- {
- *txErrBuf = (uint8_t)((base->ECR & CAN_ECR_TXERRCNT_MASK) >> CAN_ECR_TXERRCNT_SHIFT);
- }
- if (rxErrBuf)
- {
- *rxErrBuf = (uint8_t)((base->ECR & CAN_ECR_RXERRCNT_MASK) >> CAN_ECR_RXERRCNT_SHIFT);
- }
- }
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- static inline uint64_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint64_t mask)
- #else
- static inline uint32_t FLEXCAN_GetMbStatusFlags(CAN_Type *base, uint32_t mask)
- #endif
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- return ((((uint64_t)base->IFLAG1) & mask) | ((((uint64_t)base->IFLAG2) << 32) & mask));
- #else
- return (base->IFLAG1 & mask);
- #endif
- }
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint64_t mask)
- #else
- static inline void FLEXCAN_ClearMbStatusFlags(CAN_Type *base, uint32_t mask)
- #endif
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- base->IFLAG1 = (uint32_t)(mask & 0xFFFFFFFFU);
- base->IFLAG2 = (uint32_t)(mask >> 32);
- #else
- base->IFLAG1 = mask;
- #endif
- }
- static inline void FLEXCAN_EnableInterrupts(CAN_Type *base, uint32_t mask)
- {
-
- if (mask & kFLEXCAN_WakeUpInterruptEnable)
- {
- base->MCR |= CAN_MCR_WAKMSK_MASK;
- }
-
- base->CTRL1 |= (mask & (~((uint32_t)kFLEXCAN_WakeUpInterruptEnable)));
- }
- static inline void FLEXCAN_DisableInterrupts(CAN_Type *base, uint32_t mask)
- {
-
- if (mask & kFLEXCAN_WakeUpInterruptEnable)
- {
- base->MCR &= ~CAN_MCR_WAKMSK_MASK;
- }
-
- base->CTRL1 &= ~(mask & (~((uint32_t)kFLEXCAN_WakeUpInterruptEnable)));
- }
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint64_t mask)
- #else
- static inline void FLEXCAN_EnableMbInterrupts(CAN_Type *base, uint32_t mask)
- #endif
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- base->IMASK1 |= (uint32_t)(mask & 0xFFFFFFFFU);
- base->IMASK2 |= (uint32_t)(mask >> 32);
- #else
- base->IMASK1 |= mask;
- #endif
- }
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint64_t mask)
- #else
- static inline void FLEXCAN_DisableMbInterrupts(CAN_Type *base, uint32_t mask)
- #endif
- {
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER)) && (FSL_FEATURE_FLEXCAN_HAS_EXTENDED_FLAG_REGISTER > 0)
- base->IMASK1 &= ~((uint32_t)(mask & 0xFFFFFFFFU));
- base->IMASK2 &= ~((uint32_t)(mask >> 32));
- #else
- base->IMASK1 &= ~mask;
- #endif
- }
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA) && FSL_FEATURE_FLEXCAN_HAS_RX_FIFO_DMA)
- void FLEXCAN_EnableRxFifoDMA(CAN_Type *base, bool enable);
- static inline uint32_t FLEXCAN_GetRxFifoHeadAddr(CAN_Type *base)
- {
- return (uint32_t) & (base->MB[0].CS);
- }
- #endif
- static inline void FLEXCAN_Enable(CAN_Type *base, bool enable)
- {
- if (enable)
- {
- base->MCR &= ~CAN_MCR_MDIS_MASK;
-
- while (base->MCR & CAN_MCR_LPMACK_MASK)
- {
- }
- }
- else
- {
- base->MCR |= CAN_MCR_MDIS_MASK;
-
- while (!(base->MCR & CAN_MCR_LPMACK_MASK))
- {
- }
- }
- }
- status_t FLEXCAN_WriteTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_frame_t *txFrame);
- status_t FLEXCAN_ReadRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- status_t FLEXCAN_WriteFDTxMb(CAN_Type *base, uint8_t mbIdx, const flexcan_fd_frame_t *txFrame);
- status_t FLEXCAN_ReadFDRxMb(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *rxFrame);
- #endif
- status_t FLEXCAN_ReadRxFifo(CAN_Type *base, flexcan_frame_t *rxFrame);
- #if (defined(FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE) && FSL_FEATURE_FLEXCAN_HAS_FLEXIBLE_DATA_RATE)
- status_t FLEXCAN_TransferFDSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *txFrame);
- status_t FLEXCAN_TransferFDReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_fd_frame_t *rxFrame);
- status_t FLEXCAN_TransferFDSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
- status_t FLEXCAN_TransferFDReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
- void FLEXCAN_TransferFDAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
- #endif
- status_t FLEXCAN_TransferSendBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *txFrame);
- status_t FLEXCAN_TransferReceiveBlocking(CAN_Type *base, uint8_t mbIdx, flexcan_frame_t *rxFrame);
- status_t FLEXCAN_TransferReceiveFifoBlocking(CAN_Type *base, flexcan_frame_t *rxFrame);
- void FLEXCAN_TransferCreateHandle(CAN_Type *base,
- flexcan_handle_t *handle,
- flexcan_transfer_callback_t callback,
- void *userData);
- status_t FLEXCAN_TransferSendNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
- status_t FLEXCAN_TransferReceiveNonBlocking(CAN_Type *base, flexcan_handle_t *handle, flexcan_mb_transfer_t *xfer);
- status_t FLEXCAN_TransferReceiveFifoNonBlocking(CAN_Type *base,
- flexcan_handle_t *handle,
- flexcan_fifo_transfer_t *xfer);
- void FLEXCAN_TransferAbortSend(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
- void FLEXCAN_TransferAbortReceive(CAN_Type *base, flexcan_handle_t *handle, uint8_t mbIdx);
- void FLEXCAN_TransferAbortReceiveFifo(CAN_Type *base, flexcan_handle_t *handle);
- void FLEXCAN_TransferHandleIRQ(CAN_Type *base, flexcan_handle_t *handle);
- #if defined(__cplusplus)
- }
- #endif
- #endif
|