724 lines
39 KiB
C
724 lines
39 KiB
C
|
/**
|
||
|
*******************************************************************************
|
||
|
* @file hc32f4a0_can.h
|
||
|
* @brief This file contains all the functions prototypes of the CAN driver
|
||
|
* library.
|
||
|
@verbatim
|
||
|
Change Logs:
|
||
|
Date Author Notes
|
||
|
2020-06-12 Wuze First version
|
||
|
2020-12-14 Wuze Modified comment of structure stc_can_bt_cfg_t
|
||
|
@endverbatim
|
||
|
*******************************************************************************
|
||
|
* Copyright (C) 2020, Huada Semiconductor Co., Ltd. All rights reserved.
|
||
|
*
|
||
|
* This software component is licensed by HDSC under BSD 3-Clause license
|
||
|
* (the "License"); You may not use this file except in compliance with the
|
||
|
* License. You may obtain a copy of the License at:
|
||
|
* opensource.org/licenses/BSD-3-Clause
|
||
|
*
|
||
|
*******************************************************************************
|
||
|
*/
|
||
|
#ifndef __HC32F4A0_CAN_H__
|
||
|
#define __HC32F4A0_CAN_H__
|
||
|
|
||
|
/* C binding of definitions if building with C++ compiler */
|
||
|
#ifdef __cplusplus
|
||
|
extern "C"
|
||
|
{
|
||
|
#endif
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Include files
|
||
|
******************************************************************************/
|
||
|
#include "hc32_common.h"
|
||
|
#include "ddl_config.h"
|
||
|
|
||
|
/**
|
||
|
* @addtogroup HC32F4A0_DDL_Driver
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @addtogroup DDL_CAN
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
#if (DDL_CAN_ENABLE == DDL_ON)
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Global type definitions ('typedef')
|
||
|
******************************************************************************/
|
||
|
/**
|
||
|
* @defgroup CAN_Global_Types CAN Global Types
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief CAN bit timing configuration structure. See 11898-1 for details.
|
||
|
* @note 1. Restrictions: u32SEG1 >= u32SEG2 + 1, u32SEG2 >= u32SJW.
|
||
|
* @note 2. TQ = u32Prescaler / CANClock.
|
||
|
* @note 3. Bit time = (u32SEG2 + u32SEG2) x TQ.
|
||
|
* @note 4. Baudrate = CANClock/(u32Prescaler*(u32SEG1 + u32SEG2))
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t u32SEG1; /*!< TQs of segment 1. Contains synchronization segment, \
|
||
|
propagation time segment and phase buffer segment 1. */
|
||
|
uint32_t u32SEG2; /*!< TQs of segment 2. Phase buffer segment 2. */
|
||
|
uint32_t u32SJW; /*!< TQs of synchronization jump width. */
|
||
|
uint32_t u32Prescaler; /*!< Range [1, 256]. */
|
||
|
} stc_can_bt_cfg_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN acceptance filter structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t u32ID; /*!< 11 bits standard ID or 29 bits extended ID, depending on IDE. */
|
||
|
uint32_t u32IDMsk; /*!< ID mask. The mask bits of ID will be ignored by the acceptance filter. */
|
||
|
uint32_t u32MskType; /*!< Acceptance filter mask type. This parameter can be a value of @ref CAN_AF_Mask_Type */
|
||
|
} stc_can_af_cfg_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN FD configuration structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t u8CANFDMode; /*!< CAN-FD mode, Bosch CAN-FD or 11898-1:2015 CAN-FD.
|
||
|
This parameter can be a value of @ref CAN_FD_Mode */
|
||
|
stc_can_bt_cfg_t stcFBT; /*!< Bit timing configuration of fast bit timing. */
|
||
|
uint8_t u8TDCCmd; /*!< Transmiter delay compensation function control.
|
||
|
This parameter can be a value of @ref CAN_FD_TDC_Command */
|
||
|
uint8_t u8TDCSSP; /*!< Specify secondary sample point(SSP) of transmitter delay compensatin(TDC). Number of TQ. */
|
||
|
} stc_can_fd_cfg_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN time-triggered communication configuration structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t u8TransBufMode; /*!< TTCAN Transmit Buffer Mode.
|
||
|
This parameter can be a value of @ref CAN_TTC_Transmit_Buffer_Mode */
|
||
|
uint8_t u8NTUPrescaler; /*!< Prescaler of NTU(network time unit). The source is the bit time which is defined by SBT.
|
||
|
This parameter can be a value of @ref CAN_TTC_NTU_Prescaler */
|
||
|
uint32_t u32RefMsgIDE; /*!< Reference message identifier extension bit.
|
||
|
'1' to set the ID which is specified by parameter 'u32RefMsgID' as an extended ID while \
|
||
|
'0' to set it as a standard ID. */
|
||
|
uint32_t u32RefMsgID; /*!< Reference message identifier. */
|
||
|
uint16_t u16TrigType; /*!< Trigger type of TTC.
|
||
|
This parameter can be a value of @ref CAN_TTC_Trigger_Type */
|
||
|
uint16_t u16TxEnWindow; /*!< Tx_Enable window. Time period within which the transmission of a message may be started. Range is [1, 16U] */
|
||
|
uint16_t u16TxTrigTime; /*!< Specifies for the referred message the time window of the matrix cycle at which it is to be transmitted. */
|
||
|
uint16_t u16WatchTrigTime; /*!< Time mark used to check whether the time since the last valid reference message has been too long. */
|
||
|
} stc_can_ttc_cfg_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN initialization structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint8_t u8WorkMode; /*!< Specify the work mode of CAN.
|
||
|
This parameter can be a value of @ref CAN_Work_Mode */
|
||
|
stc_can_bt_cfg_t stcSBT; /*!< Bit timing configuration of slow bit timing. */
|
||
|
|
||
|
en_functional_state_t enCANFDCmd; /*!< Enable or Disable CAN-FD. If Disable, the following configuration valuse will not \
|
||
|
be written to the registers. */
|
||
|
|
||
|
stc_can_fd_cfg_t stcFDCfg; /*!< CAN-FD configuration structure. */
|
||
|
|
||
|
uint8_t u8TransMode; /*!< Transmission mode of PTB and STB.
|
||
|
This parameter can be a value of @ref CAN_Trans_Mode */
|
||
|
uint8_t u8STBPrioMode; /*!< Priority mode of STB. First in first transmit. OR the priority is determined by ID. Smaller ID higher priority.
|
||
|
Whatever the priority mode of STB is, PTB always has the highest priority.
|
||
|
This parameter can be a value of @ref CAN_STB_Priority_Mode */
|
||
|
uint8_t u8RBSWarnLimit; /*!< Specify receive buffer almost full warning limit. Rang is [1, 8]. \
|
||
|
Each CAN unit has 8 receive buffer slots. When the number of received frames reaches \
|
||
|
the set value of u8RBSWarnLimit, register bit RTIF.RAFIF is set and the interrupt occurred \
|
||
|
if it was enabled. */
|
||
|
uint8_t u8ErrWarnLimit; /*!< Specify programmable error warning limit. Range is [0, 15]. \
|
||
|
Error warning limit = (u8ErrWarnLimit + 1) * 8. */
|
||
|
stc_can_af_cfg_t *pstcAFCfg; /*!< Points to a stc_can_af_cfg_t structure type pointer value that
|
||
|
contains the configuration informations for the acceptance filters. */
|
||
|
uint16_t u16AFSel; /*!< Specify acceptance filter for receive buffer.
|
||
|
This parameter can be values of @ref CAN_AF */
|
||
|
uint8_t u8RBStoreSel; /*!< Receive buffer stores all data frames, includes error data.
|
||
|
This parameter can be a value of @ref CAN_RB_Store_Selection */
|
||
|
uint8_t u8RBOvfOp; /*!< Operation when receive buffer overflow.
|
||
|
This parameter can be a value of @ref CAN_RB_Overflow_Operation */
|
||
|
uint8_t u8SelfACKCmd; /*!< Self ACK. Only for external loopback mode.
|
||
|
This parameter can be a value of @ref CAN_Self_ACK_Command */
|
||
|
} stc_can_init_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN transmit data structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t u32ID; /*!< 11 bits standard ID or 29 bits extended ID, depending on IDE. */
|
||
|
union
|
||
|
{
|
||
|
uint32_t u32Ctrl;
|
||
|
struct
|
||
|
{
|
||
|
uint32_t DLC: 4; /*!< Data length code. Length of the data segment of data frame. \
|
||
|
It should be zero while the frame is remote frame. \
|
||
|
This parameter can be a value of @ref CAN_DLC */
|
||
|
uint32_t BRS: 1; /*!< Bit rate switch. */
|
||
|
uint32_t FDF: 1; /*!< CAN FD frame. */
|
||
|
uint32_t RTR: 1; /*!< Remote transmission request bit.
|
||
|
It is used to distinguish between data frames and remote frames. */
|
||
|
uint32_t IDE: 1; /*!< Identifier extension flag.
|
||
|
It is used to distinguish between standard format and extended format.
|
||
|
This parameter can be a 1 or 0. */
|
||
|
uint32_t RSVD: 24; /*!< Reserved bits. */
|
||
|
};
|
||
|
};
|
||
|
uint8_t *pu8Data; /*!< Pointer to data filed of data frame. */
|
||
|
} stc_can_tx_t;
|
||
|
|
||
|
/**
|
||
|
* @brief CAN receive data structure.
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t u32ID; /*!< 11 bits standard ID or 29 bits extended ID, depending on IDE. */
|
||
|
union
|
||
|
{
|
||
|
uint32_t u32Ctrl;
|
||
|
struct
|
||
|
{
|
||
|
uint32_t DLC: 4; /*!< Data length code. Length of the data segment of data frame. \
|
||
|
It should be zero while the frame is remote frame. \
|
||
|
This parameter can be a value of @ref CAN_DLC */
|
||
|
uint32_t BRS: 1; /*!< Bit rate switch. */
|
||
|
uint32_t FDF: 1; /*!< CAN FD frame. */
|
||
|
uint32_t RTR: 1; /*!< Remote transmission request bit.
|
||
|
It is used to distinguish between data frames and remote frames. */
|
||
|
uint32_t IDE: 1; /*!< Identifier extension flag.
|
||
|
It is used to distinguish between standard format and extended format.
|
||
|
This parameter can be 1 or 0. */
|
||
|
uint32_t RSVD: 4; /*!< Reserved bits. */
|
||
|
uint32_t TX: 1; /*!< This bit is set to 1 when receiving self-transmitted data in loopback mode. */
|
||
|
uint32_t ERRT: 3; /*!< Error type. */
|
||
|
uint32_t CYCLE_TIME: 16; /*!< Cycle time of time-triggered communication(TTC). */
|
||
|
};
|
||
|
};
|
||
|
uint8_t *pu8Data; /*!< Pointer to data filed of data frame. */
|
||
|
} stc_can_rx_t;
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Global pre-processor symbols/macros ('#define')
|
||
|
******************************************************************************/
|
||
|
/**
|
||
|
* @defgroup CAN_Global_Macros CAN Global Macros
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Work_Mode CAN Work Mode
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_MODE_NORMAL (0U) /*!< Normal work mode. */
|
||
|
#define CAN_MODE_SILENT (1U) /*!< Silent work mode. Prohibit data transmission. */
|
||
|
#define CAN_MODE_ILB (2U) /*!< Internal loopback mode, just for self-test while developing. */
|
||
|
#define CAN_MODE_ELB (3U) /*!< External loopback mode, just for self-test while developing. */
|
||
|
#define CAN_MODE_ELB_SILENT (4U) /*!< External loppback silent mode, just for self-test while developing. \
|
||
|
It is forbidden to respond to received frames and error frames, but data can be transmitted. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Transmit_Buffer_Type CAN Transmit Buffer Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_BUF_PTB (0U) /*!< Primary transmit buffer. */
|
||
|
#define CAN_BUF_STB (1U) /*!< Secondary transmit buffer. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_DLC CAN Data_Length_Code
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_DLC_0 (0x0U) /*!< CAN2.0 and CAN FD: payload is 0 in bytes. */
|
||
|
#define CAN_DLC_1 (0x1U) /*!< CAN2.0 and CAN FD: payload is 1 in bytes. */
|
||
|
#define CAN_DLC_2 (0x2U) /*!< CAN2.0 and CAN FD: payload is 2 in bytes. */
|
||
|
#define CAN_DLC_3 (0x3U) /*!< CAN2.0 and CAN FD: payload is 3 in bytes. */
|
||
|
#define CAN_DLC_4 (0x4U) /*!< CAN2.0 and CAN FD: payload is 4 in bytes. */
|
||
|
#define CAN_DLC_5 (0x5U) /*!< CAN2.0 and CAN FD: payload is 5 in bytes. */
|
||
|
#define CAN_DLC_6 (0x6U) /*!< CAN2.0 and CAN FD: payload is 6 in bytes. */
|
||
|
#define CAN_DLC_7 (0x7U) /*!< CAN2.0 and CAN FD: payload is 7 in bytes. */
|
||
|
#define CAN_DLC_8 (0x8U) /*!< CAN2.0 and CAN FD: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_12 (0x9U) /*!< CAN FD: payload is 12 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_16 (0xAU) /*!< CAN FD: payload is 16 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_20 (0xBU) /*!< CAN FD: payload is 20 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_24 (0xCU) /*!< CAN FD: payload is 24 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_32 (0xDU) /*!< CAN FD: payload is 32 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_48 (0xEU) /*!< CAN FD: payload is 48 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
#define CAN_DLC_64 (0xFU) /*!< CAN FD: payload is 64 in bytes. CAN2.0: payload is 8 in bytes. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Trans_Mode CAN Transmission Mode
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TRANS_PTB_STB_AUTO_RETX (0x0U) /*!< Both PTB and STB automatically retransmit. */
|
||
|
#define CAN_TRANS_PTB_SSHOT (CAN_CFG_STAT_TPSS) /*!< PTB single shot transmission mode. */
|
||
|
#define CAN_TRANS_STB_SSHOT (CAN_CFG_STAT_TSSS) /*!< STB single shot transmission mode. */
|
||
|
#define CAN_TRANS_PTB_STB_SSHOT (CAN_CFG_STAT_TPSS | \
|
||
|
CAN_CFG_STAT_TSSS) /*!< STB single shot, PTB single shot. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_STB_Trans_Control CAN STB Transmission Control
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_STB_TRANS_ALL (0U) /*!< Transmit all of STB slots. */
|
||
|
#define CAN_STB_TRANS_ONE (1U) /*!< Transmit one STB slot. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_STB_Priority_Mode CAN STB Priority Mode
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_STB_PRIO_FIFO (0x0U) /*!< Data first in and first be transmitted. */
|
||
|
#define CAN_STB_PRIO_ID (CAN_TCTRL_TSMODE) /*!< Data with smallest ID first be transmitted. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TB_Status CAN Transmit Buffer Status
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TB_STAT_EMPTY (0x0U) /*!< TTCAN is disabled(TTEN == 0): STB is empty. \
|
||
|
TTCAN is disabled(TTEN == 1) and transmit buffer is specified by TBPTR and TTPTR(TTTBM == 1): \
|
||
|
PTB and STB are both empty. */
|
||
|
#define CAN_TB_STAT_LESS_HALF (0x1U) /*!< TTEN == 0: STB is not less than half full; \
|
||
|
TTEN == 1 && TTTBM == 1: PTB and STB are neither empty. */
|
||
|
#define CAN_TB_STAT_MORE_HALF (0x2U) /*!< TTEN == 0: STB is more than half full; \
|
||
|
TTEN == 1 && TTTBM == 1: reserved value. */
|
||
|
#define CAN_TB_STAT_FULL (0x3U) /*!< TTEN == 0: STB is full; \
|
||
|
TTEN == 1 && TTTBM == 1: PTB and STB are both full. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_RB_Status CAN Receive Buffer Status
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_RB_STAT_EMPTY (0x0U) /*!< Receive buffer(RB) is empty. */
|
||
|
#define CAN_RB_STAT_LESS_WARN_LIMIT (0x1U) /*!< RB is not empty, but is less than almost full warning limit. */
|
||
|
#define CAN_RB_STAT_MORE_WARN_LIMIT (0x2U) /*!< RB is not full, but is more than or equal to almost full warning limit. */
|
||
|
#define CAN_RB_STAT_FULL (0x3U) /*!< RB is full. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_FD_Mode CAN FD Mode
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_FD_MODE_BOSCH (0x0U)
|
||
|
#define CAN_FD_MODE_ISO_11898 (CAN_TCTRL_FD_ISO)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_RB_Store_Selection CAN Receive Buffer Store Selection
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_RB_STORE_CORRECT_DATA (0x0U) /*!< Receive buffer stores correct data frames only. */
|
||
|
#define CAN_RB_STORE_ALL_DATA (CAN_RCTRL_RBALL) /*!< Receive buffer stores all data frames, includes error data. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_RB_Overflow_Operation CAN Receive Buffer Overflow Operation
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_RB_OVF_SAVE_NEW (0x0U) /*!< Saves the newly received data and the first received data will be overwritten. */
|
||
|
#define CAN_RB_OVF_DISCARD_NEW (CAN_RCTRL_ROM) /*!< Discard the newly received data. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Self_ACK_Command CAN Self ACK Command
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_SELF_ACK_DISABLE (0x0U)
|
||
|
#define CAN_SELF_ACK_ENABLE (CAN_RCTRL_SACK)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_FD_TDC_Command CAN-FD Transmiter Delay Compensation Command
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_FD_TDC_DISABLE (0x0U)
|
||
|
#define CAN_FD_TDC_ENABLE (CAN_TDC_TDCEN)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Interrupt_Type CAN Interrupt Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_INT_ERR_INT (1UL << 1U) /*!< Register bit RTIE.EIE. Error interrupt. */
|
||
|
#define CAN_INT_STB_TRANS_OK (1UL << 2U) /*!< Register bit RTIE.TSIE. Secondary transmit buffer was transmitted successfully. */
|
||
|
#define CAN_INT_PTB_TRANS_OK (1UL << 3U) /*!< Register bit RTIE.TPIE. Primary transmit buffer was transmitted successfully. */
|
||
|
#define CAN_INT_RB_ALMOST_FULL (1UL << 4U) /*!< Register bit RTIE.RAFIE. The number of filled RB slot is greater than or equal to the LIMIT.AFWL setting value. */
|
||
|
#define CAN_INT_RB_FIFO_FULL (1UL << 5U) /*!< Register bit RTIE.RFIE. The FIFO of receive buffer is full. */
|
||
|
#define CAN_INT_RX_OVERRUN (1UL << 6U) /*!< Register bit RTIE.ROIE. Receive buffers are full and there is a further message to be stored. */
|
||
|
#define CAN_INT_RX (1UL << 7U) /*!< Register bit RTIE.RIE. Received a valid data frame or remote frame. */
|
||
|
#define CAN_INT_BUS_ERR (1UL << 9U) /*!< Register bit ERRINT.BEIE. Arbitration lost caused bus error */
|
||
|
#define CAN_INT_ARB_LOST (1UL << 11U) /*!< Register bit ERRINT.ALIE. Arbitration lost. */
|
||
|
#define CAN_INT_ERR_PASSIVE (1UL << 13U) /*!< Register bit ERRINT.EPIE. A change from error-passive to error-active or error-active to error-passive has occurred. */
|
||
|
|
||
|
#define CAN_INT_ALL (CAN_INT_ERR_INT | \
|
||
|
CAN_INT_STB_TRANS_OK | \
|
||
|
CAN_INT_PTB_TRANS_OK | \
|
||
|
CAN_INT_RB_ALMOST_FULL | \
|
||
|
CAN_INT_RB_FIFO_FULL | \
|
||
|
CAN_INT_RX_OVERRUN | \
|
||
|
CAN_INT_RX | \
|
||
|
CAN_INT_BUS_ERR | \
|
||
|
CAN_INT_ARB_LOST | \
|
||
|
CAN_INT_ERR_PASSIVE)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Common_Status_Flag CAN Common Status Flag
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_FLAG_BUS_OFF (1UL << 0U) /*!< Register bit CFG_STAT.BUSOFF. CAN bus off. */
|
||
|
#define CAN_FLAG_BUS_TX (1UL << 1U) /*!< Register bit CFG_STAT.TACTIVE. CAN bus is transmitting. */
|
||
|
#define CAN_FLAG_BUS_RX (1UL << 2U) /*!< Register bit CFG_STAT.RACTIVE. CAN bus is receiving. */
|
||
|
#define CAN_FLAG_RB_OVF (1UL << 5U) /*!< Register bit RCTRL.ROV. Receive buffer is full and there is a further bit to be stored. At least one data is lost. */
|
||
|
#define CAN_FLAG_TB_FULL (1UL << 8U) /*!< Register bit RTIE.TSFF. Transmit buffers are all full. \
|
||
|
TTCFG.TTEN == 0 or TCTRL.TTTEM == 0: ALL STB slots are filled. \
|
||
|
TTCFG.TTEN == 1 and TCTRL.TTTEM == 1: Transmit buffer that pointed by TBSLOT.TBPTR is filled.*/
|
||
|
#define CAN_FLAG_TRANS_ABORTED (1UL << 16U) /*!< Register bit RTIF.AIF. Transmit messages requested via TCMD.TPA and TCMD.TSA were successfully canceled. */
|
||
|
#define CAN_FLAG_ERR_INT (1UL << 17U) /*!< Register bit RTIF.EIF. The CFG_STAT.BUSOFF bit changes, or the relative relationship between the value of the error counter and the \
|
||
|
set value of the ERROR warning limit changes. For example, the value of the error counter changes from less than \
|
||
|
the set value to greater than the set value, or from greater than the set value to less than the set value. */
|
||
|
#define CAN_FLAG_STB_TRANS_OK (1UL << 18U) /*!< Register bit RTIF.TSIF. STB was transmitted successfully. */
|
||
|
#define CAN_FLAG_PTB_TRANS_OK (1UL << 19U) /*!< Register bit RTIF.TPIF. PTB was transmitted successfully. */
|
||
|
#define CAN_FLAG_RB_ALMOST_FULL (1UL << 20U) /*!< Register bit RTIF.RAFIF. The number of filled RB slot is greater than or equal to the LIMIT.AFWL setting value. */
|
||
|
#define CAN_FLAG_RB_FIFO_FULL (1UL << 21U) /*!< Register bit RTIF.RFIF. The FIFO of receive buffer is full. */
|
||
|
#define CAN_FLAG_RX_OVERRUN (1UL << 22U) /*!< Register bit RTIF.ROIF. Receive buffers are all full and there is a further message to be stored. */
|
||
|
#define CAN_FLAG_RX_OK (1UL << 23U) /*!< Register bit RTIF.RIF. Received a valid data frame or remote frame. */
|
||
|
#define CAN_FLAG_BUS_ERR (1UL << 24U) /*!< Register bit ERRINT.BEIF. Arbitration lost caused bus error. */
|
||
|
#define CAN_FLAG_ARB_LOST (1UL << 26U) /*!< Register bit ERRINT.ALIF. Arbitration lost. */
|
||
|
#define CAN_FLAG_ERR_PASSIVE (1UL << 28U) /*!< Register bit ERRINT.EPIF. A change from error-passive to error-active or error-active to error-passive has occurred. */
|
||
|
#define CAN_FLAG_ERR_PASSIVE_NODE (1UL << 30U) /*!< Register bit ERRINT.EPASS. The node is an error-passive node. */
|
||
|
#define CAN_FLAG_REACH_WARN_LIMIT (1UL << 31U) /*!< Register bit ERRINT.EWARN. REC or TEC is greater than or equal to the LIMIT.EWL setting value. */
|
||
|
|
||
|
#define CAN_FLAG_ALL (CAN_FLAG_BUS_OFF | \
|
||
|
CAN_FLAG_BUS_TX | \
|
||
|
CAN_FLAG_BUS_RX | \
|
||
|
CAN_FLAG_RB_OVF | \
|
||
|
CAN_FLAG_TB_FULL | \
|
||
|
CAN_FLAG_TRANS_ABORTED | \
|
||
|
CAN_FLAG_ERR_INT | \
|
||
|
CAN_FLAG_STB_TRANS_OK | \
|
||
|
CAN_FLAG_PTB_TRANS_OK | \
|
||
|
CAN_FLAG_RB_ALMOST_FULL | \
|
||
|
CAN_FLAG_RB_FIFO_FULL | \
|
||
|
CAN_FLAG_RX_OVERRUN | \
|
||
|
CAN_FLAG_RX_OK | \
|
||
|
CAN_FLAG_BUS_ERR | \
|
||
|
CAN_FLAG_ARB_LOST | \
|
||
|
CAN_FLAG_ERR_PASSIVE | \
|
||
|
CAN_FLAG_ERR_PASSIVE_NODE | \
|
||
|
CAN_FLAG_REACH_WARN_LIMIT)
|
||
|
|
||
|
#define CAN_FLAG_CLR_MSK (CAN_FLAG_RB_OVF | \
|
||
|
CAN_FLAG_TRANS_ABORTED | \
|
||
|
CAN_FLAG_ERR_INT | \
|
||
|
CAN_FLAG_STB_TRANS_OK | \
|
||
|
CAN_FLAG_PTB_TRANS_OK | \
|
||
|
CAN_FLAG_RB_ALMOST_FULL | \
|
||
|
CAN_FLAG_RB_FIFO_FULL | \
|
||
|
CAN_FLAG_RX_OVERRUN | \
|
||
|
CAN_FLAG_RX_OK | \
|
||
|
CAN_FLAG_BUS_ERR | \
|
||
|
CAN_FLAG_ARB_LOST | \
|
||
|
CAN_FLAG_ERR_PASSIVE | \
|
||
|
CAN_FLAG_ERR_PASSIVE_NODE | \
|
||
|
CAN_FLAG_REACH_WARN_LIMIT)
|
||
|
|
||
|
#define CAN_FLAG_TX_ERR_MSK (CAN_FLAG_BUS_OFF | \
|
||
|
CAN_FLAG_TB_FULL | \
|
||
|
CAN_FLAG_ERR_INT | \
|
||
|
CAN_FLAG_BUS_ERR | \
|
||
|
CAN_FLAG_ARB_LOST | \
|
||
|
CAN_FLAG_ERR_PASSIVE | \
|
||
|
CAN_FLAG_ERR_PASSIVE_NODE | \
|
||
|
CAN_FLAG_REACH_WARN_LIMIT)
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_AF_Mask_Type CAN AF Mask Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_AF_MSK_STD_EXT (0x0U) /*!< Acceptance filter accept standard ID mask and extended ID mask. */
|
||
|
#define CAN_AF_MSK_STD (CAN_ACF_AIDEE) /*!< Acceptance filter accept standard ID mask. */
|
||
|
#define CAN_AF_MSK_EXT (CAN_ACF_AIDEE | \
|
||
|
CAN_ACF_AIDE) /*!< Acceptance filter accept extended ID mask. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_Error_Type CAN Error Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_ERR_NO (0U) /*!< No error. */
|
||
|
#define CAN_ERR_BIT (CAN_EALCAP_KOER_0) /*!< Error is bit error. */
|
||
|
#define CAN_ERR_FORM (CAN_EALCAP_KOER_1) /*!< Error is form error. */
|
||
|
#define CAN_ERR_STUFF (CAN_EALCAP_KOER_1 | \
|
||
|
CAN_EALCAP_KOER_0) /*!< Error is stuff error. */
|
||
|
#define CAN_ERR_ACK (CAN_EALCAP_KOER_2) /*!< Error is ACK error. */
|
||
|
#define CAN_ERR_CRC (CAN_EALCAP_KOER_2 | \
|
||
|
CAN_EALCAP_KOER_0) /*!< Error is CRC error. */
|
||
|
#define CAN_ERR_OTHER (CAN_EALCAP_KOER_2 | \
|
||
|
CAN_EALCAP_KOER_1) /*!< Error is other error. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_AF CAN Acceptance Filter
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_AF1 (CAN_ACFEN_AE_1) /*!< Acceptance filter 1 select bit. */
|
||
|
#define CAN_AF2 (CAN_ACFEN_AE_2) /*!< Acceptance filter 2 select bit. */
|
||
|
#define CAN_AF3 (CAN_ACFEN_AE_3) /*!< Acceptance filter 3 select bit. */
|
||
|
#define CAN_AF4 (CAN_ACFEN_AE_4) /*!< Acceptance filter 4 select bit. */
|
||
|
#define CAN_AF5 (CAN_ACFEN_AE_5) /*!< Acceptance filter 5 select bit. */
|
||
|
#define CAN_AF6 (CAN_ACFEN_AE_6) /*!< Acceptance filter 6 select bit. */
|
||
|
#define CAN_AF7 (CAN_ACFEN_AE_7) /*!< Acceptance filter 7 select bit. */
|
||
|
#define CAN_AF8 (CAN_ACFEN_AE_8) /*!< Acceptance filter 8 select bit. */
|
||
|
#define CAN_AF9 (CAN_ACFEN_AE_9) /*!< Acceptance filter 9 select bit. */
|
||
|
#define CAN_AF10 (CAN_ACFEN_AE_10) /*!< Acceptance filter 10 select bit. */
|
||
|
#define CAN_AF11 (CAN_ACFEN_AE_11) /*!< Acceptance filter 11 select bit. */
|
||
|
#define CAN_AF12 (CAN_ACFEN_AE_12) /*!< Acceptance filter 12 select bit. */
|
||
|
#define CAN_AF13 (CAN_ACFEN_AE_13) /*!< Acceptance filter 13 select bit. */
|
||
|
#define CAN_AF14 (CAN_ACFEN_AE_14) /*!< Acceptance filter 14 select bit. */
|
||
|
#define CAN_AF15 (CAN_ACFEN_AE_15) /*!< Acceptance filter 15 select bit. */
|
||
|
#define CAN_AF16 (CAN_ACFEN_AE_16) /*!< Acceptance filter 16 select bit. */
|
||
|
#define CAN_AF_ALL (0xFFFFU)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_Transmit_Buffer_Mode CAN Time-triggered Communication Transmit Buffer Mode
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_TB_MODE_NORMAL (0x0U) /*!< TTC transmit buffer depends on the priority of STB which is defined by @ref CAN_STB_Priority_Mode */
|
||
|
#define CAN_TTC_TB_MODE_PTR (CAN_TCTRL_TTTBM) /*!< TTC transmit buffer is pointed by TBSLOT.TBPTR(for data filling) and \
|
||
|
TRG_CFG.TTPTR(for data transmission). */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_TBS_Pointer CAN Time-triggered Communication Transmit Buffer Slot Pointer
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_TBS_PTB (0x0U) /*!< Point to PTB. */
|
||
|
#define CAN_TTC_TBS_STB1 (0x1U) /*!< Point to STB slot 1. */
|
||
|
#define CAN_TTC_TBS_STB2 (0x2U) /*!< Point to STB slot 2. */
|
||
|
#define CAN_TTC_TBS_STB3 (0x3U) /*!< Point to STB slot 3. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_Status_Flag CAN Time-triggered Communication Status Flag
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_FLAG_TTI (CAN_TTCFG_TTIF) /*!< Time trigger interrupt flag. */
|
||
|
#define CAN_TTC_FLAG_TEI (CAN_TTCFG_TEIF) /*!< Trigger error interrupt flag. */
|
||
|
#define CAN_TTC_FLAG_WTI (CAN_TTCFG_WTIF) /*!< Watch trigger interrupt flag. */
|
||
|
|
||
|
#define CAN_TTC_FLAG_ALL (CAN_TTC_FLAG_TTI | \
|
||
|
CAN_TTC_FLAG_TEI | \
|
||
|
CAN_TTC_FLAG_WTI)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_Interrupt_Type CAN Time-triggered Communication Interrupt Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_INT_TTI (CAN_TTCFG_TTIE) /*!< Time trigger interrupt. */
|
||
|
#define CAN_TTC_INT_WTI (CAN_TTCFG_WTIE) /*!< Watch trigger interrupt. */
|
||
|
#define CAN_TTC_INT_ALL (CAN_TTC_INT_TTI | CAN_TTC_INT_WTI)
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_NTU_Prescaler CAN Time-triggered Communication Network Time Unit Prescaler
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_NTU_PRESC_1 (0x0U) /*!< NTU is SBT bit time * 1. */
|
||
|
#define CAN_TTC_NTU_PRESC_2 (CAN_TTCFG_T_PRESC_0) /*!< NTU is SBT bit time * 2. */
|
||
|
#define CAN_TTC_NTU_PRESC_4 (CAN_TTCFG_T_PRESC_1) /*!< NTU is SBT bit time * 4. */
|
||
|
#define CAN_TTC_NTU_PRESC_8 (CAN_TTCFG_T_PRESC_1 | \
|
||
|
CAN_TTCFG_T_PRESC_0) /*!< NTU is SBT bit time * 8. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @defgroup CAN_TTC_Trigger_Type CAN Time-triggered Communication Trigger Type
|
||
|
* @{
|
||
|
*/
|
||
|
#define CAN_TTC_TRIG_IMMED_TRIG (0x0U) /*!< Immediate trigger for immediate transmission. */
|
||
|
#define CAN_TTC_TRIG_TIME_TRIG (CAN_TRG_CFG_TTYPE_0) /*!< Time trigger for receive triggers. */
|
||
|
#define CAN_TTC_TRIG_SSHOT_TRANS_TRIG (CAN_TRG_CFG_TTYPE_1) /*!< Single shot transmit trigger for exclusive time windows. */
|
||
|
#define CAN_TTC_TRIG_TRANS_START_TRIG (CAN_TRG_CFG_TTYPE_1 | \
|
||
|
CAN_TRG_CFG_TTYPE_0) /*!< Transmit start trigger for merged arbitrating time windows. */
|
||
|
#define CAN_TTC_TRIG_TRANS_STOP_TRIG (CAN_TRG_CFG_TTYPE_2) /*!< Transmit stop trigger for merged arbitrating time windows. */
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Global variable definitions ('extern')
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
Global function prototypes (definition in C source)
|
||
|
******************************************************************************/
|
||
|
/**
|
||
|
* @addtogroup CAN_Global_Functions
|
||
|
* @{
|
||
|
*/
|
||
|
en_result_t CAN_Init(M4_CAN_TypeDef *CANx, const stc_can_init_t *pstcInit);
|
||
|
en_result_t CAN_StructInit(stc_can_init_t *pstcInit);
|
||
|
void CAN_DeInit(M4_CAN_TypeDef *CANx);
|
||
|
|
||
|
void CAN_SWReset(M4_CAN_TypeDef *CANx);
|
||
|
void CAN_EnterNormalComm(M4_CAN_TypeDef *CANx);
|
||
|
|
||
|
void CAN_SetWorkMode(M4_CAN_TypeDef *CANx, uint8_t u8WorkMode);
|
||
|
void CAN_SetTransMode(M4_CAN_TypeDef *CANx, uint8_t u8TransMode);
|
||
|
void CAN_SetSTBPrioMode(M4_CAN_TypeDef *CANx, uint8_t u8STBPrioMode);
|
||
|
void CAN_SetRBStoreSel(M4_CAN_TypeDef *CANx, uint8_t u8RBStoreSel);
|
||
|
void CAN_SetRBOvfOp(M4_CAN_TypeDef *CANx, uint8_t u8RBOvfOperation);
|
||
|
|
||
|
void CAN_IntCmd(M4_CAN_TypeDef *CANx, uint32_t u32IntType, en_functional_state_t enNewState);
|
||
|
en_result_t CAN_SBTConfig(M4_CAN_TypeDef *CANx, const stc_can_bt_cfg_t *pstcCfg);
|
||
|
uint8_t CAN_GetArbLostPos(const M4_CAN_TypeDef *CANx);
|
||
|
uint8_t CAN_GetErrType(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_SetRBSWarnLimit(M4_CAN_TypeDef *CANx, uint8_t u8RBSWarnLimit);
|
||
|
void CAN_SetErrWarnLimit(M4_CAN_TypeDef *CANx, uint8_t u8ErrWarnLimit);
|
||
|
uint8_t CAN_GetREC(const M4_CAN_TypeDef *CANx);
|
||
|
uint8_t CAN_GetTEC(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_ClrErrCount(M4_CAN_TypeDef *CANx);
|
||
|
en_result_t CAN_AFConfig(M4_CAN_TypeDef *CANx, uint16_t u16AFSel, const stc_can_af_cfg_t pstcAFCfg[]);
|
||
|
void CAN_AFCmd(M4_CAN_TypeDef *CANx, uint16_t u16AFSel, en_functional_state_t enNewState);
|
||
|
|
||
|
uint8_t CAN_GetTBType(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_AbortTrans(M4_CAN_TypeDef *CANx, uint8_t u8TBType);
|
||
|
|
||
|
en_flag_status_t CAN_GetStatus(const M4_CAN_TypeDef *CANx, uint32_t u32Flag);
|
||
|
void CAN_ClrStatus(M4_CAN_TypeDef *CANx, uint32_t u32Flag);
|
||
|
uint32_t CAN_GetStatusVal(const M4_CAN_TypeDef *CANx);
|
||
|
uint8_t CAN_GetTBFullStatus(const M4_CAN_TypeDef *CANx);
|
||
|
uint8_t CAN_GetRBFullStatus(const M4_CAN_TypeDef *CANx);
|
||
|
|
||
|
en_result_t CAN_FD_Config(M4_CAN_TypeDef *CANx, const stc_can_fd_cfg_t *pstcCfg);
|
||
|
en_result_t CAN_FD_StructInit(stc_can_fd_cfg_t *pstcCfg);
|
||
|
void CAN_FD_Cmd(const M4_CAN_TypeDef *CANx, en_functional_state_t enNewState);
|
||
|
|
||
|
en_result_t CAN_TTC_StructInit(stc_can_ttc_cfg_t *pstcCfg);
|
||
|
en_result_t CAN_TTC_Config(M4_CAN_TypeDef *CANx, const stc_can_ttc_cfg_t *pstcCfg);
|
||
|
void CAN_TTC_Cmd(M4_CAN_TypeDef *CANx, en_functional_state_t enNewState);
|
||
|
|
||
|
void CAN_TTC_SetTBSToBeFilled(M4_CAN_TypeDef *CANx, uint8_t u8SlotPtr);
|
||
|
void CAN_TTC_SetTBSFilled(M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetNTUPrescaler(M4_CAN_TypeDef *CANx, uint8_t u8NTUPrescaler);
|
||
|
void CAN_TTC_IntCmd(M4_CAN_TypeDef *CANx, uint8_t u8IntType, en_functional_state_t enNewState);
|
||
|
en_flag_status_t CAN_TTC_GetStatus(const M4_CAN_TypeDef *CANx, uint8_t u8Flag);
|
||
|
void CAN_TTC_ClrStatus(M4_CAN_TypeDef *CANx, uint8_t u8Flag);
|
||
|
uint8_t CAN_TTC_GetStatusVal(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetRefMsgID(M4_CAN_TypeDef *CANx, uint32_t u32ID);
|
||
|
void CAN_TTC_SetRefMsgIDE(M4_CAN_TypeDef *CANx, uint32_t u32IDE);
|
||
|
uint32_t CAN_TTC_GetRefMsgID(const M4_CAN_TypeDef *CANx);
|
||
|
uint32_t CAN_TTC_GetRefMsgIDE(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetTxTrigTBS(M4_CAN_TypeDef *CANx, uint8_t u8TBSlotPtr);
|
||
|
uint8_t CAN_TTC_GetTxTrigTBS(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetTrigType(M4_CAN_TypeDef *CANx, uint16_t u16TrigType);
|
||
|
uint16_t CAN_TTC_GetTrigType(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetTxEnableWindow(M4_CAN_TypeDef *CANx, uint16_t u16TxEnableWindow);
|
||
|
uint16_t CAN_TTC_GetTxEnableWindow(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetTxTrigTime(M4_CAN_TypeDef *CANx, uint16_t u16TxTrigTime);
|
||
|
uint16_t CAN_TTC_GetTxTrigTime(const M4_CAN_TypeDef *CANx);
|
||
|
void CAN_TTC_SetWatchTrigTime(M4_CAN_TypeDef *CANx, uint16_t u16WatchTrigTime);
|
||
|
uint16_t CAN_TTC_GetWatchTrigTime(const M4_CAN_TypeDef *CANx);
|
||
|
|
||
|
en_result_t CAN_TransData(M4_CAN_TypeDef *CANx, const stc_can_tx_t *pstcTx,
|
||
|
uint8_t u8TxBufType, uint8_t u8STBTxCtrl, uint32_t u32Timeout);
|
||
|
en_result_t CAN_TTC_TransData(M4_CAN_TypeDef *CANx, const stc_can_tx_t *pstcTx, uint8_t u8TBSlot);
|
||
|
|
||
|
en_result_t CAN_ReceiveData(M4_CAN_TypeDef *CANx, stc_can_rx_t *pstcRx, uint8_t *pu8RxFrameCnt, uint8_t u8RxFrameBufLength);
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
#endif /* DDL_CAN_ENABLE */
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __HC32F4A0_CAN_H__ */
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* EOF (not truncated)
|
||
|
******************************************************************************/
|