1 /****************************************************************************
2  * @file     canfd.h
3  * @version  V1.00
4  * @brief    CAN FD driver source file
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
8  *****************************************************************************/
9 
10 #ifndef __CANFD_H__
11 #define __CANFD_H__
12 
13 #if defined ( __CC_ARM   )
14     #pragma anon_unions
15 #endif
16 
17 #include "NuMicro.h"
18 
19 #ifdef __cplusplus
20 extern "C"
21 {
22 #endif
23 
24 /** @addtogroup Standard_Driver Standard Driver
25   @{
26 */
27 
28 /** @addtogroup CANFD_Driver CAN_FD Driver
29   @{
30 */
31 
32 /** @addtogroup CANFD_EXPORTED_CONSTANTS CAN_FD Exported Constants
33   @{
34 */
35 
36 #define CANFD_OP_CAN_MODE     0
37 #define CANFD_OP_CAN_FD_MODE  1
38 
39 /* Reserved number of elements in Message RAM - used for calculation of start addresses within RAM Configuration
40    some element_numbers set to less than max, to stay altogether below 256 words of Message RAM requirement*/
41 #define CANFD_MAX_11_BIT_FTR_ELEMS    128ul  /*!<  maximum is 128 11-bit Filter */
42 #define CANFD_MAX_29_BIT_FTR_ELEMS    64ul   /*!<  maximum is  64 29-bit Filter */
43 #define CANFD_MAX_RX_FIFO0_ELEMS      64ul   /*!<  maximum is  64 Rx FIFO 0 elements */
44 #define CANFD_MAX_RX_FIFO1_ELEMS      64ul   /*!<  maximum is  64 Rx FIFO 1 elements */
45 #define CANFD_MAX_RX_BUF_ELEMS        64ul   /*!<  maximum is  64 Rx Buffers */
46 #define CANFD_MAX_TX_BUF_ELEMS        32ul   /*!<  maximum is  32 Tx Buffers */
47 #define CANFD_MAX_TX_EVNT_FIFO_ELEMS  32ul   /*!<  maximum is  32 Tx Event FIFO elements */
48 
49 /* CAN FD sram size  */
50 #define CANFD_SRAM_SIZE          0x1800ul
51 #define CANFD_SRAM_OFFSET        0x200ul
52 
53 /* CAN FD sram address  */
54 #define CANFD_SRAM_BASE_ADDR(psCanfd)  ((uint32_t)psCanfd + CANFD_SRAM_OFFSET)
55 
56 /* CAN FD  Mask all interrupt */
57 #define CANFD_INT_ALL_SIGNALS         0x3FFFFFFFul
58 
59 /* Maximum size of a CAN FD frame. Must be a valid CAN FD value */
60 #define CANFD_MAX_MESSAGE_BYTES     64
61 
62 /* Maximum size of a CAN FD frame. Must be a valid CAN FD value */
63 #define CANFD_MAX_MESSAGE_WORDS     (CANFD_MAX_MESSAGE_BYTES/4)
64 
65 /* Receive message buffer helper macro */
66 #define CANFD_RX_BUFFER_STD(id, mbIdx)               ((7UL << 27) | ((id & 0x7FF) << 16) | (mbIdx & 0x3F))
67 
68 /* Receive message buffer extended helper macro - low */
69 #define CANFD_RX_BUFFER_EXT_LOW(id, mbIdx)           ((7UL << 29) | (id & 0x1FFFFFFFUL))
70 
71 /*  Receive message buffer extended helper macro - high */
72 #define CANFD_RX_BUFFER_EXT_HIGH(id, mbIdx)          (mbIdx & 0x3FUL)
73 
74 /*  CAN FD Rx FIFO 0 Mask helper macro. */
75 #define CANFD_RX_FIFO0_STD_MASK(match, mask)         ((2UL << 30) | (1UL << 27) | ((match & 0x7FF) << 16) | (mask & 0x7FF))
76 
77 /* CAN FD Rx FIFO 0 extended Mask helper macro - low. */
78 #define CANFD_RX_FIFO0_EXT_MASK_LOW(match)           ((1UL << 29) | (match & 0x1FFFFFFF))
79 
80 /* CAN FD Rx FIFO 0 extended Mask helper macro - high. */
81 #define CANFD_RX_FIFO0_EXT_MASK_HIGH(mask)           ((2UL << 30) | (mask & 0x1FFFFFFF))
82 
83 /* CAN FD Rx FIFO 1 Mask helper macro. */
84 #define CANFD_RX_FIFO1_STD_MASK(match, mask)         ((2UL << 30) | (2UL << 27) | ((match & 0x7FF) << 16) | (mask & 0x7FF))
85 
86 /* CANFD Rx FIFO 1 extended Mask helper macro - low. */
87 #define CANFD_RX_FIFO1_EXT_MASK_LOW(match)           ((2UL << 29) | (match & 0x1FFFFFFF))
88 
89 /* CANFD Rx FIFO 1 extended Mask helper macro - high. */
90 #define CANFD_RX_FIFO1_EXT_MASK_HIGH(mask)           ((2UL << 30) | (mask & 0x1FFFFFFF))
91 
92 /**
93  *    @brief        Get the CAN Communication State Flag
94  *
95  *    @param[in]    canfd    The pointer of the specified CANFD module
96  *
97  *    @retval       0 Synchronizing - node is synchronizing on CANFD communication.
98  *    @retval       1 Idle - node is neither receiver nor transmitter.
99  *    @retval       2 Receiver - node is operating as receiver.
100  *    @retval       3 Transmitter - node is operating as transmitter.
101  *
102  *    @details      This macro gets the CANFD communication state.
103  *    \hideinitializer
104  */
105 #define CANFD_GET_COMMUNICATION_STATE(canfd)    (((canfd)->PSR  & CANFD_PSR_ACT_Msk) >> CANFD_PSR_ACT_Pos)
106 
107 
108 /* CAN FD frame data field size. */
109 typedef enum
110 {
111     eCANFD_BYTE8  = 0, /*!< 8 byte data field. */
112     eCANFD_BYTE12 = 1, /*!< 12 byte data field. */
113     eCANFD_BYTE16 = 2, /*!< 16 byte data field. */
114     eCANFD_BYTE20 = 3, /*!< 20 byte data field. */
115     eCANFD_BYTE24 = 4, /*!< 24 byte data field. */
116     eCANFD_BYTE32 = 5, /*!< 32 byte data field. */
117     eCANFD_BYTE48 = 6, /*!< 48 byte data field. */
118     eCANFD_BYTE64 = 7  /*!< 64 byte data field. */
119 } E_CANFD_DATA_FIELD_SIZE;
120 
121 /* CAN FD Tx FIFO/Queue Mode. */
122 typedef enum
123 {
124     eCANFD_QUEUE_MODE = 0, /*!< Tx FIFO operation. */
125     eCANFD_FIFO_MODE = 1   /*!< Tx Queue operation. */
126 } E_CANFD_MODE;
127 
128 /* TX Buffer Configuration Parameters  */
129 typedef struct
130 {
131     E_CANFD_DATA_FIELD_SIZE eDataFieldSize;     /*!< TX Buffer Data Field Size (8byte .. 64byte) */
132     E_CANFD_MODE            eModeSel;           /*!< select: CANFD_QUEUE_MODE/CANFD_FIFO_MODE */
133     uint32_t                u32ElemCnt;         /*!< Elements in FIFO/Queue */
134     uint32_t                u32DBufNumber;      /*!< Number of dedicated TX buffers */
135 } CANFD_TX_BUF_CONFIG_T;
136 
137 
138 /* Nominal Bit Timing Parameters */
139 typedef struct
140 {
141     uint32_t u32BitRate;          /*!< Transceiver baud rate in bps */
142     uint16_t u16TDCOffset;        /*!< Transceiver Delay Compensation Offset */
143     uint16_t u16TDCFltrWin;       /*!< Transceiver Delay Compensation Filter Window Length */
144     uint8_t  u8TDC;               /*!< Transceiver Delay Compensation (1:Yes, 0:No) */
145 } CANFD_NBT_CONFIG_T;
146 
147 
148 /* Data Bit Timing Parameters */
149 typedef struct
150 {
151     uint32_t u32BitRate;          /*!< Transceiver baud rate in bps */
152     uint16_t u16TDCOffset;        /*!< Transceiver Delay Compensation Offset */
153     uint16_t u16TDCFltrWin;       /*!< Transceiver Delay Compensation Filter Window Length */
154     uint8_t  u8TDC;               /*!< Transceiver Delay Compensation (1:Yes, 0:No) */
155 } CANFD_DBT_CONFIG_T;
156 
157 /*! CAN FD protocol timing characteristic configuration structure. */
158 typedef struct
159 {
160     uint8_t  u8PreDivider;        /*!< Global Clock Division Factor. */
161     uint16_t u16NominalPrescaler; /*!< Nominal clock prescaler. */
162     uint8_t  u8NominalRJumpwidth; /*!< Nominal Re-sync Jump Width. */
163     uint8_t  u8NominalPhaseSeg1;  /*!< Nominal Phase Segment 1. */
164     uint8_t  u8NominalPhaseSeg2;  /*!< Nominal Phase Segment 2. */
165     uint8_t  u8NominalPropSeg;    /*!< Nominal Propagation Segment. */
166     uint8_t  u8DataPrescaler;     /*!< Data clock prescaler. */
167     uint8_t  u8DataRJumpwidth;    /*!< Data Re-sync Jump Width. */
168     uint8_t  u8DataPhaseSeg1;     /*!< Data Phase Segment 1. */
169     uint8_t  u8DataPhaseSeg2;     /*!< Data Phase Segment 2. */
170     uint8_t  u8DataPropSeg;       /*!< Data Propagation Segment. */
171 
172 } CANFD_TIMEING_CONFIG_T;
173 
174 /* CAN FD module configuration structure. */
175 typedef struct
176 {
177     CANFD_NBT_CONFIG_T sNormBitRate;       /*!< Normal bit rate. */
178     CANFD_DBT_CONFIG_T sDataBitRate;       /*!< Data bit rate.   */
179     CANFD_TIMEING_CONFIG_T sConfigBitTing; /*!< Bit timing config*/
180     uint8_t bFDEn;                         /*!< 1 == FD Operation enabled. */
181     uint8_t bBitRateSwitch;                /*!< 1 == Bit Rate Switch enabled (only evaluated in HW, if FD operation enabled). */
182     uint8_t bEnableLoopBack;               /*!< 1 == Bit Rate Switch enabled (only evaluated in HW, if FD operation enabled). */
183 } CANFD_FD_BT_CONFIG_T;
184 
185 /* CAN FD Message RAM Partitioning - i.e. Start Addresses (BYTE) */
186 typedef struct
187 {
188     uint32_t u32SIDFC_FLSSA; /*!<Standard ID Filter Configuration */
189     uint32_t u32XIDFC_FLESA; /*!<Extended ID Filter Configuration */
190     uint32_t u32RXF0C_F0SA;  /*!< RX FIFO 0 Start Address */
191     uint32_t u32RXF1C_F1SA;  /*!< RX FIFO 1 Start Address */
192     uint32_t u32RXBC_RBSA;   /*!< Rx Buffer Configuration */
193     uint32_t u32TXEFC_EFSA;  /*!< Tx Event FIFO Configuration */
194     uint32_t u32TXBC_TBSA;   /*!< Tx Buffer Configuration */
195 } CANFD_RAM_PART_T;
196 
197 /*CAN FD element size structure */
198 typedef struct
199 {
200     uint32_t  u32SIDFC;          /*!< Standard Message ID Filter element size in words  */
201     uint32_t  u32XIDFC;          /*!< Extended Message ID Filter element size in words  */
202     uint32_t  u32RxFifo0;        /*!< Rx FIFO0 element size in words  */
203     uint32_t  u32RxFifo1;        /*!< Rx FIFO1 element size in words  */
204     uint32_t  u32RxBuf;          /*!< Rx Buffer element size in words */
205     uint32_t  u32TxBuf;          /*!< Tx Buffer element size in words */
206     uint32_t  u32TxEventFifo;    /*!< Tx Event FIFO element size in words */
207 } CANFD_ELEM_SIZE_T;
208 
209 /* CAN FD Message frame structure */
210 typedef struct
211 {
212     CANFD_FD_BT_CONFIG_T    sBtConfig;        /*!< Bit Timing Configuration */
213     CANFD_RAM_PART_T        sMRamStartAddr;   /*!< Absolute Byte Start Addresses for Element Types in Message RAM */
214     CANFD_ELEM_SIZE_T       sElemSize;        /*!< Size of Elements in Message RAM (RX Elem. in FIFO0, in FIFO1, TX Buffer) given in words */
215     CANFD_TX_BUF_CONFIG_T   sTxConfig;        /*!< TX Buffer Configuration  */
216     uint32_t                u32MRamSize;      /*!< Size of the Message RAM: number of words */
217 } CANFD_FD_T;
218 
219 /* CAN FD Message ID Type */
220 typedef enum
221 {
222     eCANFD_SID = 0,  /*!< Standard frame format attribute. */
223     eCANFD_XID = 1   /*!< Extend frame format attribute. */
224 } E_CANFD_ID_TYPE;
225 
226 /* CAN FD Rx Message Type */
227 typedef enum
228 {
229     eCANFD_RX_FIFO_0 = 0,
230     eCANFD_RX_FIFO_1 = 1,
231     eCANFD_RX_DBUF = 2
232 } E_CANFD_RX_BUF_TYPE;
233 
234 /* CAN FD communication state.*/
235 typedef enum
236 {
237     eCANFD_SYNC         = 0,
238     eCANFD_IDLE         = 1,
239     eCANFD_RECEIVER     = 2,
240     eCANFD_TRANSMITTER  = 3
241 } E_CANFD_COMMUNICATION_STATE;
242 
243 /* CAN FD Message receive Information: via which RX Buffers, etc. */
244 typedef struct
245 {
246     E_CANFD_RX_BUF_TYPE  eRxBuf;         /*!< Type of RX Buffer */
247     uint32_t            u32BufIdx;       /*!< RX Buffer: buffer index, if RX FIFO: GetIndex */
248 } CANFD_RX_INFO_T;
249 
250 /* CAN FD frame type. */
251 typedef enum
252 {
253     eCANFD_DATA_FRM = 0,      /*!< Data frame type attribute. */
254     eCANFD_REMOTE_FRM = 1     /*!< Remote frame type attribute. */
255 } E_CANFD_FRM_TYPE;
256 
257 /* CAN FD Message Struct */
258 typedef struct
259 {
260     E_CANFD_ID_TYPE   eIdType;                         /*! Standard ID or Extended ID */
261     CANFD_RX_INFO_T   sRxInfo;                         /*! Information regarding the reception of the frame */
262     E_CANFD_FRM_TYPE  eFrmType;                        /*! eCANFD_DATA_FRM/eCANFD_REMOTE_FRM */
263     uint32_t          u32Id;                           /*! Standard ID (11bits) or Extended ID (29bits) */
264     uint32_t          u32DLC;                          /*! Data Length */
265     union
266     {
267         uint32_t au32Data[CANFD_MAX_MESSAGE_WORDS];    /*!< Word access to buffer data. */
268         uint8_t  au8Data[CANFD_MAX_MESSAGE_BYTES];     /*!< Byte access to buffer data. */
269     };
270     uint8_t           u8MsgMarker;                     /*! Message marker (will be copied to TX Event FIFO element) */
271     uint8_t           bFDFormat;                       /*! FD Format (1 = FD Format) */
272     uint8_t           bBitRateSwitch;                  /*! Bit Rate Switch (1 = with Bit Rate Switch) */
273     uint8_t           bErrStaInd;                      /*! Error State Indicator */
274     uint8_t           bEvntFifoCon;                    /*! Event FIFO Control (1 = Store TX Event FIFO element after transmission)*/
275 } CANFD_FD_MSG_T;
276 
277 
278 /*   Transmit and Receive message element structure. */
279 typedef struct
280 {
281     uint32_t u32Id;     /*!< Message identifier and associated flags. */
282     uint32_t u32Config; /*!< Buffer configuration. */
283     union
284     {
285         uint32_t au32Data[CANFD_MAX_MESSAGE_WORDS];  /*!< Word access to buffer data. */
286         uint8_t  au8Data[CANFD_MAX_MESSAGE_BYTES];   /*!< Byte access to buffer data. */
287     };
288 } CANFD_BUF_T;
289 
290 /* Standard ID message filter element structure.*/
291 typedef struct
292 {
293     union
294     {
295         struct
296         {
297             uint32_t SFID2     : 11; /*!<Standard Filter ID 2. */
298             uint32_t reserved1 : 5;
299             uint32_t SFID1     : 11; /*!<Standard Filter ID 1. */
300             uint32_t SFEC      : 3;  /*!<Standard Filter Element Configuration */
301             uint32_t SFT       : 2;  /*!<Standard Filter Type */
302         };
303         struct
304         {
305             uint32_t VALUE; /*!< Access to filter as a word. */
306         };
307     };
308 } CANFD_STD_FILTER_T;
309 
310 /* Extended ID message filter element structure.*/
311 typedef struct
312 {
313     union
314     {
315         struct
316         {
317             uint32_t EFID1     : 29; /*!< Extended Filter ID 1. */
318             uint32_t EFEC      : 3;  /*!< Extended Filter Element Configuration. */
319             uint32_t EFID2     : 29; /*!< Extended Filter ID 2. */
320             uint32_t reserved1 : 1;
321             uint32_t EFT       : 2;  /*!< Extended Filter Type. */
322         };
323         struct
324         {
325             uint32_t LOWVALUE;  /*!< Access to filter low word. */
326             uint32_t HIGHVALUE; /*!< Access to filter high word. */
327         };
328     };
329 } CANFD_EXT_FILTER_T;
330 
331 /* Accept Non-matching Frames (GFC Register) */
332 typedef enum
333 {
334     eCANFD_ACC_NON_MATCH_FRM_RX_FIFO0 = 0x0,  /*!< Accept Non-Masking Frames in Rx FIFO 0. */
335     eCANFD_ACC_NON_MATCH_FRM_RX_FIFO1 = 0x1,  /*!< Accept Non-Masking Frames in Rx FIFO 1. */
336     eCANFD_REJ_NON_MATCH_FRM   = 0x3          /*!< Reject Non-Matching Frames. */
337 } E_CANFD_ACC_NON_MATCH_FRM;
338 
339 
340 /* Standard ID Filter Element Type */
341 typedef enum
342 {
343     eCANFD_SID_FLTR_TYPE_RANGE     = 0x0, /*!< Range filter from SFID1 to SFID2. */
344     eCANFD_SID_FLTR_TYPE_DUAL      = 0x1, /*!< Dual ID filter for SFID1 or SFID2. */
345     eCANFD_SID_FLTR_TYPE_CLASSIC   = 0x2, /*!< Classic filter: SFID1 = filter, SFID2 = mask. */
346     eCANFD_SID_FLTR_TYPE_DIS       = 0x3  /*!< Filter element disabled */
347 } E_CANFD_SID_FLTR_ELEM_TYPE;
348 
349 /* Extended ID Filter Element Type */
350 typedef enum
351 {
352     eCANFD_XID_FLTR_TYPE_RANGE      = 0x0,  /*!< Range filter from EFID1 to EFID2. */
353     eCANFD_XID_FLTR_TYPE_DUAL       = 0x1,  /*!< Dual ID filter for EFID1 or EFID2. */
354     eCANFD_XID_FLTR_TYPE_CLASSIC    = 0x2,  /*!< Classic filter: EFID1=filter, EFID2=mask */
355     eCANFD_XID_FLTR_TYPE_RANGE_XIDAM_NOT_APP     = 0x3   /*!< XID range filter from EFID1 to EFID2(EFID2 > EFID1), XIDAM not applied */
356 }  E_CANFD_XID_FLTR_ELEM_TYPE;
357 
358 /* Filter Element Configuration - Can be used for SFEC(Standard Id filter configuration) and EFEC(Extended Id filter configuration) */
359 typedef enum
360 {
361     eCANFD_FLTR_ELEM_DIS         = 0x0,            /*!< Filter Element Disable  */
362     eCANFD_FLTR_ELEM_STO_FIFO0   = 0x1,            /*!< Filter Element Store In Fifo0  */
363     eCANFD_FLTR_ELEM_STO_FIFO1   = 0x2,            /*!< Filter Element Store In Fifo1  */
364     eCANFD_FLTR_ELEM_REJ_ID      = 0x3,            /*!< Filter Element RejectId  */
365     eCANFD_FLTR_ELEM_SET_PRI     = 0x4,            /*!< Filter Element Set Priority */
366     eCANFD_FLTR_ELEM_SET_PRI_STO_FIFO0 = 0x5,      /*!< Filter Element Set Priority And Store In Fifo0  */
367     eCANFD_FLTR_ELEM_SET_PRI_STO_FIFO1 = 0x6,      /*!< Filter Element Set Priority And Store In Fifo1  */
368     eCANFD_FLTR_ELEM_STO_RX_BUF_OR_DBG_MSG = 0x7   /*!< Filter Element Store In Rx Buf Or Debug Msg  */
369 } E_CANFD_FLTR_CONFIG;
370 
371 /* TX Event FIFO Element Struct */
372 typedef struct
373 {
374     E_CANFD_ID_TYPE     eIdType;         /*!< Standard ID or Extended ID */
375     uint32_t            u32Id;           /*!< Standard ID (11bits) or Extended ID (29bits) */
376     uint32_t            u32DLC;          /*!< Data Length Code used in the frame on the bus */
377     uint32_t            u32TxTs;         /*!< Tx Timestamp */
378     uint32_t            u32MsgMarker;    /*!< Message marker */
379     uint8_t             bErrStaInd;      /*!< Error State Indicator */
380     uint8_t             bRemote;         /*!< Remote transmission request */
381     uint8_t             bFDFormat;       /*!< FD Format */
382     uint8_t             bBitRateSwitch;  /*!< Bit Rate Switch */
383 } CANFD_TX_EVNT_ELEM_T;
384 
385 
386 #define CANFD_TIMEOUT            SystemCoreClock    /*!< CANFD time-out counter (1 second time-out) */
387 #define CANFD_OK                 ( 0L)              /*!< CANFD operation OK */
388 #define CANFD_ERR_FAIL           (-1L)              /*!< CANFD operation failed */
389 #define CANFD_ERR_TIMEOUT        (-2L)              /*!< CANFD operation abort due to timeout error */
390 #define CANFD_READ_REG_TIMEOUT   (48UL)             /*!< CANFD read register time-out count */
391 
392 void CANFD_Open(CANFD_T *canfd, CANFD_FD_T *psCanfdStr);
393 void CANFD_Close(CANFD_T *canfd);
394 void CANFD_EnableInt(CANFD_T *canfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE);
395 void CANFD_DisableInt(CANFD_T *canfd, uint32_t u32IntLine0, uint32_t u32IntLine1, uint32_t u32TXBTIE, uint32_t u32TXBCIE);
396 uint32_t CANFD_TransmitTxMsg(CANFD_T *canfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg);
397 uint32_t CANFD_TransmitDMsg(CANFD_T *canfd, uint32_t u32TxBufIdx, CANFD_FD_MSG_T *psTxMsg);
398 void CANFD_SetGFC(CANFD_T *canfd, E_CANFD_ACC_NON_MATCH_FRM eNMStdFrm, E_CANFD_ACC_NON_MATCH_FRM eEMExtFrm, uint32_t u32RejRmtStdFrm, uint32_t u32RejRmtExtFrm);
399 void CANFD_SetSIDFltr(CANFD_T *canfd, uint32_t u32FltrIdx, uint32_t u32Filter);
400 void CANFD_SetXIDFltr(CANFD_T *canfd, uint32_t u32FltrIdx, uint32_t u32FilterLow, uint32_t u32FilterHigh);
401 uint32_t CANFD_ReadRxBufMsg(CANFD_T *canfd, uint8_t u8MbIdx, CANFD_FD_MSG_T *psMsgBuf);
402 uint32_t CANFD_ReadRxFifoMsg(CANFD_T *canfd, uint8_t u8FifoIdx, CANFD_FD_MSG_T *psMsgBuf);
403 void CANFD_CopyDBufToMsgBuf(CANFD_BUF_T *psRxBuffer, CANFD_FD_MSG_T *psMsgBuf);
404 void CANFD_CopyRxFifoToMsgBuf(CANFD_BUF_T *psRxBuf, CANFD_FD_MSG_T *psMsgBuf);
405 uint32_t CANFD_GetRxFifoWaterLvl(CANFD_T *canfd, uint32_t u32RxFifoNum);
406 void CANFD_TxBufCancelReq(CANFD_T *canfd, uint32_t u32TxBufIdx);
407 uint32_t CANFD_IsTxBufCancelFin(CANFD_T *canfd, uint32_t u32TxBufIdx);
408 uint32_t CANFD_IsTxBufTransmitOccur(CANFD_T *canfd, uint32_t u32TxBufIdx);
409 uint32_t CANFD_GetTxEvntFifoWaterLvl(CANFD_T *canfd);
410 void CANFD_CopyTxEvntFifoToUsrBuf(CANFD_T *canfd, uint32_t u32TxEvntNum, CANFD_TX_EVNT_ELEM_T *psTxEvntElem);
411 void CANFD_GetBusErrCount(CANFD_T *canfd, uint8_t *pu8TxErrBuf, uint8_t *pu8RxErrBuf);
412 int32_t CANFD_RunToNormal(CANFD_T *canfd, uint8_t u8Enable);
413 void CANFD_GetDefaultConfig(CANFD_FD_T *psConfig, uint8_t u8OpMode);
414 void CANFD_ClearStatusFlag(CANFD_T *canfd, uint32_t u32InterruptFlag);
415 uint32_t CANFD_GetStatusFlag(CANFD_T *canfd, uint32_t u32IntTypeFlag);
416 uint32_t CANFD_ReadReg(__I uint32_t* pu32RegAddr);
417 
418 /*@}*/ /* end of group CANFD_EXPORTED_FUNCTIONS */
419 
420 /*@}*/ /* end of group CANFD_Driver */
421 
422 /*@}*/ /* end of group Standard_Driver */
423 
424 #ifdef __cplusplus
425 }
426 #endif
427 
428 #if defined ( __CC_ARM   )
429     #pragma no_anon_unions
430 #endif
431 
432 #endif /* __CANFD_H__ */
433