2022-06-24 22:28:36 +08:00

607 lines
24 KiB
C

/*
* Copyright 2021 MindMotion Microelectronics Co., Ltd.
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __HAL_FLEXCAN_H__
#define __HAL_FLEXCAN_H__
#include "hal_common.h"
/*!
* @addtogroup FLEXCAN
* @{
*/
/*!
* @brief FLEXCAN driver version number.
*/
#define FLEXCAN_DRIVER_VERSION 0u /*!< FLEXCAN_0. */
/*!
* @addtogroup FLEXCAN_GLOBAL_INT
* @{
*/
#define FLEXCAN_INT_RWRN FLEXCAN_CTRL1_RWRNMSK_MASK /*!< Tx warning interrupt switchers. */
#define FLEXCAN_INT_TWRN FLEXCAN_CTRL1_TWRNMSK_MASK /*!< Rx warning interrupt switchers. */
#define FLEXCAN_INT_ERR FLEXCAN_CTRL1_ERRMSK_MASK /*!< Error interrupt switchers. */
#define FLEXCAN_INT_BOFF FLEXCAN_CTRL1_BOFFMSK_MASK /*!< Bus off interrupt switchers. */
/*!
* @}
*/
/*!
* @addtogroup FLEXCAN_STATUS
* @{
*/
#define FLEXCAN_STATUS_WAK (1 << 0u) /*!< Wake up interrupt flag. */
#define FLEXCAN_STATUS_ERR (1 << 1u) /*!< Error interrupt flag. */
#define FLEXCAN_STATUS_BOFF (1 << 2u) /*!< Bus off interrupt flag. */
#define FLEXCAN_STATUS_RX (1 << 3u) /*!< Reception state flag. */
#define FLEXCAN_STATUS_FLTCONF (0 << 4u) /*!< Fault confinement state flag. */
#define FLEXCAN_STATUS_TX (1 << 6u) /*!< Transmission state flag. */
#define FLEXCAN_STATUS_IDLE (1 << 7u) /*!< Idele state flag. */
#define FLEXCAN_STATUS_RXWRN (1 << 8u) /*!< Rx error warning flag. */
#define FLEXCAN_STATUS_TXWRN (1 << 9u) /*!< Tx error warning flag. */
#define FLEXCAN_STATUS_STFERR (1 << 10u) /*!< Stuffing error flag. */
#define FLEXCAN_STATUS_FMRERR (1 << 11u) /*!< Form error flag. */
#define FLEXCAN_STATUS_CRCERR (1 << 12u) /*!< CRC error flag. */
#define FLEXCAN_STATUS_ACKERR (1 << 13u) /*!< ACK error flag. */
#define FLEXCAN_STATUS_BIT0ERR (1 << 14u) /*!< Bit 0 error flag. */
#define FLEXCAN_STATUS_BIT1ERR (1 << 15u) /*!< Bit 1 error flag. */
#define FLEXCAN_STATUS_RWRN (1 << 16u) /*!< Rx warning interrupt flag. */
#define FLEXCAN_STATUS_TWRN (1 << 17u) /*!< Tx warning interrupt flag. */
#define FLEXCAN_STATUS_SYNCH (1 << 18u) /*!< Synchronization status flag. */
#define FLEXCAN_STATUS_BOFFDONE (1 << 19u) /*!< Bus off done interrupt flag. */
#define FLEXCAN_STATUS_ERROVR (1 << 21u) /*!< Error Overrun interrupt flag. */
/*!
* @}
*/
/*!
* @addtogroup FLEXCAN_CHANNEL_SELECTION
* @{
*/
#define FLEXCAN_CHN_NUM (16u) /*!< The total number of FLEXCAN channel. */
#define FLEXCAN_CHN_0 (0u) /*!< The selection of FLEXCAN MB Channel 0. */
#define FLEXCAN_CHN_1 (1u) /*!< The selection of FLEXCAN MB Channel 1. */
#define FLEXCAN_CHN_2 (2u) /*!< The selection of FLEXCAN MB Channel 2. */
#define FLEXCAN_CHN_3 (3u) /*!< The selection of FLEXCAN MB Channel 3. */
#define FLEXCAN_CHN_4 (4u) /*!< The selection of FLEXCAN MB Channel 4. */
#define FLEXCAN_CHN_5 (5u) /*!< The selection of FLEXCAN MB Channel 5. */
#define FLEXCAN_CHN_6 (6u) /*!< The selection of FLEXCAN MB Channel 6. */
#define FLEXCAN_CHN_7 (7u) /*!< The selection of FLEXCAN MB Channel 7. */
#define FLEXCAN_CHN_8 (8u) /*!< The selection of FLEXCAN MB Channel 8. */
#define FLEXCAN_CHN_9 (9u) /*!< The selection of FLEXCAN MB Channel 9. */
#define FLEXCAN_CHN_10 (10u) /*!< The selection of FLEXCAN MB Channel 10. */
#define FLEXCAN_CHN_11 (11u) /*!< The selection of FLEXCAN MB Channel 11. */
#define FLEXCAN_CHN_12 (12u) /*!< The selection of FLEXCAN MB Channel 12. */
#define FLEXCAN_CHN_13 (13u) /*!< The selection of FLEXCAN MB Channel 13. */
#define FLEXCAN_CHN_14 (14u) /*!< The selection of FLEXCAN MB Channel 14. */
#define FLEXCAN_CHN_15 (15u) /*!< The selection of FLEXCAN MB Channel 15. */
/*!
*@}
*/
/*!
* @addtogroup FLEXCAN_MB_INT
* @{
*/
#define FLEXCAN_INT_MB_0 (1u << 0u) /*!< Individual Mb 0 interrupt and clear fifo switcher. */
#define FLEXCAN_INT_MB_1 (1u << 1u) /*!< Individual Mb 1 interrupt switcher. */
#define FLEXCAN_INT_MB_2 (1u << 2u) /*!< Individual Mb 2 interrupt switcher. */
#define FLEXCAN_INT_MB_3 (1u << 3u) /*!< Individual Mb 3 interrupt switcher. */
#define FLEXCAN_INT_MB_4 (1u << 4u) /*!< Individual Mb 4 interrupt switcher. */
#define FLEXCAN_INT_MB_5 (1u << 5u) /*!< Individual Mb 5 interrupt and Rx fifo frame available switcher. */
#define FLEXCAN_INT_MB_6 (1u << 6u) /*!< Individual Mb 6 interrupt and Rx fifo warning interrupt switcher. */
#define FLEXCAN_INT_MB_7 (1u << 7u) /*!< Individual Mb 7 interrupt and Rx fifo overflow interrupt switcher. */
#define FLEXCAN_INT_MB_8 (1u << 8u) /*!< Individual Mb 8 interrupt switcher. */
#define FLEXCAN_INT_MB_9 (1u << 9u) /*!< Individual Mb 9 interrupt switcher. */
#define FLEXCAN_INT_MB_10 (1u << 10u) /*!< Individual Mb 10 interrupt switcher. */
#define FLEXCAN_INT_MB_11 (1u << 11u) /*!< Individual Mb 11 interrupt switcher. */
#define FLEXCAN_INT_MB_12 (1u << 12u) /*!< Individual Mb 12 interrupt switcher. */
#define FLEXCAN_INT_MB_13 (1u << 13u) /*!< Individual Mb 13 interrupt switcher. */
#define FLEXCAN_INT_MB_14 (1u << 14u) /*!< Individual Mb 14 interrupt switcher. */
#define FLEXCAN_INT_MB_15 (1u << 15u) /*!< Individual Mb 15 interrupt switcher. */
/*!
* @}
*/
/*!
* @addtogroup FLEXCAN_MB_STATUS
* @{
*/
#define FLEXCAN_STATUS_MB_0 (1u << 0u) /*!< Individual Mb 0 interrupt and clear fifo switcher. */
#define FLEXCAN_STATUS_MB_1 (1u << 1u) /*!< Individual Mb 1 interrupt switcher. */
#define FLEXCAN_STATUS_MB_2 (1u << 2u) /*!< Individual Mb 2 interrupt switcher. */
#define FLEXCAN_STATUS_MB_3 (1u << 3u) /*!< Individual Mb 3 interrupt switcher. */
#define FLEXCAN_STATUS_MB_4 (1u << 4u) /*!< Individual Mb 4 interrupt switcher. */
#define FLEXCAN_STATUS_MB_5 (1u << 5u) /*!< Individual Mb 5 interrupt and Rx fifo frame available switcher. */
#define FLEXCAN_STATUS_MB_6 (1u << 6u) /*!< Individual Mb 6 interrupt and Rx fifo warning interrupt switcher. */
#define FLEXCAN_STATUS_MB_7 (1u << 7u) /*!< Individual Mb 7 interrupt and Rx fifo overflow interrupt switcher. */
#define FLEXCAN_STATUS_MB_8 (1u << 8u) /*!< Individual Mb 8 interrupt switcher. */
#define FLEXCAN_STATUS_MB_9 (1u << 9u) /*!< Individual Mb 9 interrupt switcher. */
#define FLEXCAN_STATUS_MB_10 (1u << 10u) /*!< Individual Mb 10 interrupt switcher. */
#define FLEXCAN_STATUS_MB_11 (1u << 11u) /*!< Individual Mb 11 interrupt switcher. */
#define FLEXCAN_STATUS_MB_12 (1u << 12u) /*!< Individual Mb 12 interrupt switcher. */
#define FLEXCAN_STATUS_MB_13 (1u << 13u) /*!< Individual Mb 13 interrupt switcher. */
#define FLEXCAN_STATUS_MB_14 (1u << 14u) /*!< Individual Mb 14 interrupt switcher. */
#define FLEXCAN_STATUS_MB_15 (1u << 15u) /*!< Individual Mb 15 interrupt switcher. */
/*!
* @}
*/
/*!
* @brief FLEXCAN clock source type.
*/
typedef enum
{
FLEXCAN_ClockSource_Osc = 0u, /*!< CAN Protocol Engine will use the Oscillator clock. */
FLEXCAN_ClockSource_Periph = 1u, /*!< CAN Protocol Engine will use the Peripheral clock.*/
} FLEXCAN_ClockSource_Type;
/*!
* @brief FLEXCAN self wake up from bus off source.
*/
typedef enum
{
FLEXCAN_SelfWakeUp_Disabled = 0u, /*!< Disable self wake up, FLEXCAN can only back from Stop mode when its request is cleared. */
FLEXCAN_SelfWakeUp_BypassFilter = 1u, /*!< FLEXCAN can use the unfiltered Rx input to detect events on CAN bus then back from Stop mode. */
FLEXCAN_SelfWakeUp_WithFilter = 2u, /*!< FLEXCAN can use the filtered Rx input to detect events on CAN bus then back from Stop mode. */
} FLEXCAN_SelfWakeUp_Type;
/*!
* @brief FLEXCAN function mode.
*/
typedef enum
{
FLEXCAN_WorkMode_Normal = 0u, /*!< Normal work mode. */
FLEXCAN_WorkMode_LoopBack = 1u, /*!< Loop-back working mode, transfer and receive its own frame. */
FLEXCAN_WorkMode_ListenOnly = 2u, /*!< Listen-only mode, no transfer. */
} FLEXCAN_WorkMode_Type;
/*!
* @brief FLEXCAN Rx message buffer filter type.
*/
typedef enum
{
FLEXCAN_Mask_Global = 0u, /*!< Use global mask to filter all the received frame. */
FLEXCAN_Mask_Individual = 1u, /*!< Use individual mask to filter the received frame. */
} FLEXCAN_Mask_Type;
/*!
* @brief FLEXCAN Xfer Mb frame type switcher.
*/
typedef enum
{
FLEXCAN_MbType_Data = 0u, /*!< Data frames can be accepted and remote frames are rejected. */
FLEXCAN_MbType_Remote = 1u, /*!< Data frames can be rejected and remote frames are accepted. */
} FLEXCAN_MbType_Type;
/*!
* @brief FLEXCAN Xfer Mb frame format switcher.
*/
typedef enum
{
FLEXCAN_MbFormat_Standard = 0u, /*!< Only Standard format frames can be accepted. */
FLEXCAN_MbFormat_Extended = 1u, /*!< Only Extended format frames can be accepted. */
} FLEXCAN_MbFormat_Type;
/*!
* @brief FLEXCAN Rx fifo ID filter type.
*/
typedef enum
{
FLEXCAN_FifoIdFilterFormat_A = 0u, /*!< Format A: One full ID (standard and extended) per ID Filter Table element. */
FLEXCAN_FifoIdFilterFormat_B = 1u, /*!< Format B: Two full standard IDs or two partial 14-bit (standard and extended) IDs per ID Filter Table element.*/
FLEXCAN_FifoIdFilterFormat_C = 2u, /*!< Format C: Four partial 8-bit Standard IDs per ID Filter Table element. */
FLEXCAN_FifoIdFilterFormat_D = 3u, /*!< Format D: All frames rejected. */
} FLEXCAN_FifoIdFilterFormat_Type;
/*!
* @brief FLEXCAN fifo priority type.
*/
typedef enum
{
FLEXCAN_FifoPriority_MbFirst = 0u, /*!< Mactching process start with message buffer. */
FLEXCAN_FifoPriority_FifoFirst = 1u, /*!< Mactching process start with fifo. */
}FLEXCAN_FifoPriority_Type;
/*!
* @brief FLEXCAN Xfer MB frame code switcher.
*/
typedef enum
{
FLEXCAN_MbCode_RxInactive = 0u, /*!< Code for MB being not active. */
FLEXCAN_MbCode_RxFull = 2u, /*!< Code for MB being full. */
FLEXCAN_MbCode_RxEmpty = 4u, /*!< Code for MB being active and empty. */
FLEXCAN_MbCode_RxOverrun = 6u, /*!< Code for MB being over written without accessing the received frame. */
FLEXCAN_MbCode_TxInactive = 8u, /*!< Code for data response for Tx inactive. */
FLEXCAN_MbCode_TxAbort = 9u, /*!< Code for Tx abort after transmission. */
FLEXCAN_MbCode_RxRanswer = 10u, /*!< Code for Rx waiting for remote frame. */
FLEXCAN_MbCode_TxDataOrRemote = 12u, /*!< Code for data frame or remote frame transmission. */
FLEXCAN_MbCode_TxTanswer = 14u, /*!< Code for data response for remote frame. */
FLEXCAN_MbCode_RxBusy = 15u, /*!< Code for Rx updating MB. */
} FLEXCAN_MbCode_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_SetTimingConf() to initialize the time configuration.
*/
typedef struct
{
bool EnableExtendedTime; /*!< If enable, the setting time range can be broader. */
uint32_t PhaSegLen1; /*!< Phase segment 1. Compensate for edge phase errors and may be lengthened during resynchronization.*/
uint32_t PhaSegLen2; /*!< Phase segment 2. Compensate for edge phase errors and may be lengthened during resynchronization.*/
uint32_t PropSegLen; /*!< Propagation segment. Compensate for signal delays across the network.*/
uint32_t JumpWidth; /*!< Resynchronize jump width. */
uint32_t PreDiv; /*!< The divider for FLEXCAN clock source. */
} FLEXCAN_TimConf_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_Init() to initialize the general setting of FLEXCAN.
*/
typedef struct
{
uint8_t MaxXferNum; /*!< Max number of message buffer to be used. */
uint32_t BaudRate; /*!< Data bit per second when using FLEXCAN for transmision and reception. */
uint32_t ClockFreqHz; /*!< Clock source frequency. */
FLEXCAN_ClockSource_Type ClockSource; /*!< Clock source selection. */
FLEXCAN_SelfWakeUp_Type SelfWakeUp; /*!< Stop mode self wake up source. */
FLEXCAN_WorkMode_Type WorkMode; /*!< FLEXCAN function mode. */
FLEXCAN_Mask_Type Mask; /*!< Filter work range for filtering the received frames. */
FLEXCAN_TimConf_Type * TimConf; /*!< FLEXCAN timer and time synchronization setup. */
bool EnableSelfReception; /*!< Whether to receive frames sent by FLEXCAN itself. */
bool EnableTimerSync; /*!< Refresh the timer every frame reception. */
} FLEXCAN_Init_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_SetGlobalMbMaskConf() to set the mask for buffer.
*/
typedef struct
{
FLEXCAN_MbType_Type MbType; /*!< Data frame or Remote frame switcher. */
FLEXCAN_MbFormat_Type MbFormat; /*!< Extended or standard id switcher. */
uint32_t IdMask; /*!< Id mask. */
} FLEXCAN_RxMbMaskConf_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_SetRxFifoGlobalMaskConf() to set the conf for fifo mask filter.
*/
typedef struct
{
FLEXCAN_MbType_Type MbType; /*!< Data frame or Remote frame switcher. */
FLEXCAN_MbFormat_Type MbFormat; /*!< Extended or standard id switcher. */
FLEXCAN_FifoIdFilterFormat_Type FilterFormat; /*!< fifo filter format. */
union
{
uint32_t RxIdA; /*!< The fifo Id setting for filter format A. */
uint16_t RxIdB[2]; /*!< The fifo Id setting for filter format B. */
uint8_t RxIdC[4]; /*!< The fifo Id setting for filter format C. */
};
} FLEXCAN_RxFifoMaskConf_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_SetRxMb() to set the mask for buffer.
*/
typedef struct
{
FLEXCAN_MbType_Type MbType; /*!< Data frame or Remote frame switcher. */
FLEXCAN_MbFormat_Type MbFormat; /*!< Extended or standard id switcher. */
uint32_t Id; /*!< Id value. */
} FLEXCAN_RxMbConf_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_EnableRxFifo() to initialize the fifo setting.
*/
typedef struct
{
FLEXCAN_FifoIdFilterFormat_Type FilterFormat; /*!< fifo filter format which will decide how to filter the fifo reception. */
uint32_t IdFilterNum; /*!< The fifo filter element num. */
uint32_t * IdFilterTable; /*!< Filter array to be set for Rx fifo. */
FLEXCAN_FifoPriority_Type priority; /*!< Enable matching process start with fifo. */
} FLEXCAN_RxFifoConf_Type;
/*!
* @brief This type of structure instance is used to keep the settings when calling the @ref FLEXCAN_WriteTxMb() to set the mask for buffer.
*/
typedef struct
{
struct
{
uint32_t TIMESTAMP : 16; /*!< Free-running counter time stamp. */
uint32_t LENGTH : 4; /*!< Length of Data in Bytes. */
uint32_t TYPE : 1; /*!< Frame data type or remote type. */
uint32_t FORMAT : 1; /*!< Frame extended format or standard format. */
uint32_t RESERVED_0 : 1; /*!< Reservation. */
uint32_t IDHIT : 9; /*!< Id filter number hit by fifo. */
};
struct
{
uint32_t ID :29; /*!< Frame Identifier. */
uint32_t PRIORITY: 3; /*!< Local priority. */
};
union
{
struct
{
uint32_t WORD0; /*!< CAN Frame payload word0. */
uint32_t WORD1; /*!< CAN Frame payload word1. */
};
struct
{
/* The sequence refers to the little-endian-storage and big-endian transfer. */
uint8_t BYTE3; /*!< CAN Frame payload byte3. */
uint8_t BYTE2; /*!< CAN Frame payload byte2. */
uint8_t BYTE1; /*!< CAN Frame payload byte1. */
uint8_t BYTE0; /*!< CAN Frame payload byte0. */
uint8_t BYTE7; /*!< CAN Frame payload byte7. */
uint8_t BYTE6; /*!< CAN Frame payload byte6. */
uint8_t BYTE5; /*!< CAN Frame payload byte5. */
uint8_t BYTE4; /*!< CAN Frame payload byte4. */
};
};
} FLEXCAN_Mb_Type;
/*!
* @brief Enable the FLEXCAN module.
*
* @param FLEXCANx FLEXCAN instance.
* @param enable 'true' to enable the module, 'false' to disable the module.
* @return None.
*/
void FLEXCAN_Enable(FLEXCAN_Type * FLEXCANx, bool enable);
/*!
* @brief Enable soft reset of FLEXCAN registers.
*
* This will reset most part of the FLEXCAN registers.
*
* @param FLEXCANx FLEXCAN instance.
* @return None.
*/
void FLEXCAN_DoSoftReset(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Set up the FLEXCAN module with the indicated setting.
*
* @param FLEXCANx FLEXCAN instance.
* @param init Pointer to the initialization structure. See to @ref FLEXCAN_Init_Type.
* @return 'true' to setup the FLEXCAN module successfully, false to fail to set the baudrate wrongly.
*/
bool FLEXCAN_Init(FLEXCAN_Type * FLEXCANx, FLEXCAN_Init_Type * init);
/*!
* @brief Set up the FLEXCAN timing module with the indicated setting.
*
* This would work when people want to change the boadrate after setting up the module.
*
* @param FLEXCANx FLEXCAN instance.
* @param conf Pointer to the initialization structure. See to @ref FLEXCAN_TimConf_Type.
* @return None.
*/
void FLEXCAN_SetTimingConf(FLEXCAN_Type * FLEXCANx, FLEXCAN_TimConf_Type * conf);
/*!
* @brief Enter freeze mode for configuration.
*
* @param FLEXCANx FLEXCAN instance.
* @param enable 'true' to enable the module, 'false' to disable the module.
* @return None.
*/
void FLEXCAN_EnableFreezeMode(FLEXCAN_Type * FLEXCANx, bool enable);
/*!
* @brief Set the Rx message buffer mask globally.
*
* Setting should be done after entering Freeze Mode.
*
* @param FLEXCANx FLEXCAN instance.
* @param conf Indicated mask and Mb frame type and format to be set for 16 message buffer globally. See to @ref FLEXCAN_RxMbMaskConf_Type.
* @return None.
*/
void FLEXCAN_SetGlobalMbMaskConf(FLEXCAN_Type * FLEXCANx, FLEXCAN_RxMbMaskConf_Type * conf);
/*!
* @brief Set the Rx fifo mask globally.
*
* Setting should be done after entering Freeze Mode.
*
* @param FLEXCANx FLEXCAN instance.
* @param mask Indicated mask to be set for 16 message buffer globally. See to @ref FLEXCAN_RxFifoMaskConf_Type.
* @return None.
*/
void FLEXCAN_SetRxFifoGlobalMaskConf(FLEXCAN_Type * FLEXCANx, FLEXCAN_RxFifoMaskConf_Type * mask);
/*!
* @brief Set Rx message buffer mask individually.
*
* Setting should be done after entering Freeze Mode.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The Mb channel to be masked indicatedly. See to @ref FLEXCAN_CHANNEL_SELECTION.
* @param mask Indicated mask to be set for 16 message buffer globally. See to @ref FLEXCAN_RxMbMaskConf_Type.
* @return None.
*/
void FLEXCAN_SetRxMbIndividualMaskConf(FLEXCAN_Type * FLEXCANx, uint32_t channel, FLEXCAN_RxMbMaskConf_Type * mask);
/*!
* @brief Clear the indicated MB.
*
* Clear the previous information in the buffer.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The Mb channel to be masked indicatedly. See to @ref FLEXCAN_CHANNEL_SELECTION.
* @return None.
*/
void FLEXCAN_ResetMb(FLEXCAN_Type * FLEXCANx, uint32_t channel);
/*!
* @brief Clear message buffer with value 0.
*
* Clear the previous information in the buffer.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The Mb channel to be masked indicatedly. See to @ref FLEXCAN_CHANNEL_SELECTION.
* @param code The code to be set in Mb channel. See to @ref FLEXCAN_MbCode_Type.
* @return None.
*/
void FLEXCAN_SetMbCode(FLEXCAN_Type * FLEXCANx, uint32_t channel, FLEXCAN_MbCode_Type code);
/*!
* @brief Set Rx message buffer before reception.
*
* Prepare the type, format and id for Rx receiving.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The Mb channel to be masked indicatedly. See to @ref FLEXCAN_CHANNEL_SELECTION.
* @param conf Configuration for Rx Mb receiving. See to @ref FLEXCAN_RxMbConf_Type.
* @return None.
*/
void FLEXCAN_SetRxMb(FLEXCAN_Type * FLEXCANx, uint32_t channel, FLEXCAN_RxMbConf_Type * conf);
/*!
* @brief Setup the Rx fifo setting.
*
* Need to be done under freeze mode.
*
* @param FLEXCANx FLEXCAN instance.
* @param conf Pointer to the configuration structure. See to @ref FLEXCAN_RxFifoConf_Type.
* @return 'true' to enbale the Rx fifo successfully, 'false' to fail for setting the filter number wrongly.
*/
bool FLEXCAN_EnableRxFifo(FLEXCAN_Type * FLEXCANx, FLEXCAN_RxFifoConf_Type * conf);
/*!
* @brief Enable global FLEXCAN interrupts.
*
* @param FLEXCANx FLEXCAN instance.
* @param interrupts Global interrupts to be set simultaneously. See to @ref FLEXCAN_GLOBAL_INT.
* @param enable 'true' to enable the interrupts, 'false' to disable the interrupts.
* @return None.
*/
void FLEXCAN_EnableInterrupts(FLEXCAN_Type * FLEXCANx, uint32_t interrupts, bool enable);
/*!
* @brief Get the error status and global status of FLEXCAN.
*
* @param FLEXCANx FLEXCAN instance.
* @return FLEXCAN status. See to @ref FLEXCAN_STATUS.
*/
uint32_t FLEXCAN_GetStatus(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Get the error status and global status of FLEXCAN.
*
* @param FLEXCANx FLEXCAN instance.
* @param flags Flags to be cleared. See to @ref FLEXCAN_STATUS.
* @return None.
*/
void FLEXCAN_ClearStatus(FLEXCAN_Type * FLEXCANx, uint32_t flags);
/*!
* @brief Enable FLEXCAN individual message buffer interrupts.
*
* @param FLEXCANx FLEXCAN instance.
* @param interrupts Global interrupts to be set simultaneously. See to @ref FLEXCAN_MB_INT.
* @param enable 'true' to enable the interrupts, 'false' to disable the interrupts.
* @return None.
*/
void FLEXCAN_EnableMbInterrupts(FLEXCAN_Type * FLEXCANx, uint32_t interrupts, bool enable);
/*!
* @brief Get the buffer status or fifo status of FLEXCAN.
*
* @param FLEXCANx FLEXCAN instance.
* @return FLEXCAN buffer status. See to @ref FLEXCAN_MB_STATUS.
*/
uint32_t FLEXCAN_GetMbStatus(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Get the buffer status or fifo status of FLEXCAN.
*
* @param FLEXCANx FLEXCAN instance.
* @param mbs FLEXCAN buffer status to be cleared. See to @ref FLEXCAN_MB_STATUS.
* @return None.
*/
void FLEXCAN_ClearMbStatus(FLEXCAN_Type * FLEXCANx, uint32_t mbs);
/*!
* @brief Enable Fifo DMA of FLEXCAN fifo.
*
* Should be done under freeze mode.
*
* @param FLEXCANx FLEXCAN instance.
* @param enable 'true' to enable the DMA, 'false' to disable the DMA.
* @return None.
*/
void FLEXCAN_EnableFifoDMA(FLEXCAN_Type * FLEXCANx, bool enable);
/*!
* @brief Get the Tx error counter value.
*
* @param FLEXCANx FLEXCAN instance.
* @return Tx error counter value.
*/
uint32_t FLEXCAN_GetTxError(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Get the Rx error counter value.
*
* @param FLEXCANx FLEXCAN instance.
* @return Rx error counter value.
*/
uint32_t FLEXCAN_GetRxError(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Get the fifo address.
*
* @param FLEXCANx FLEXCAN instance.
* @return fifo address of the FLEXCAN.
*/
uint32_t FLEXCAN_GetFifoAddr(FLEXCAN_Type * FLEXCANx);
/*!
* @brief Write the Mb frame into the indicated Mb channel.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The indicated FLEXCAN Mb channel.
* @param mb The prepared Mb for Tx. See to @ref FLEXCAN_Mb_Type.
* @return 'true' to put the Mb frame successfully, 'false' to fail.
*/
bool FLEXCAN_WriteTxMb(FLEXCAN_Type * FLEXCANx, uint32_t channel, FLEXCAN_Mb_Type * mb);
/*!
* @brief Read the Mb frame from the indicated Mb channel.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel The indicated FLEXCAN Mb channel.
* @param mb The Mb for Rx. See to @ref FLEXCAN_Mb_Type.
* @return 'true' to get the Mb frame successfully, 'false' to fail.
*/
bool FLEXCAN_ReadRxMb(FLEXCAN_Type * FLEXCANx, uint32_t channel, FLEXCAN_Mb_Type * mb);
/*!
* @brief Read the fifo Mb frame from fifo.
*
* @param FLEXCANx FLEXCAN instance.
* @param mb Pointer to the Mb structure. See to @ref FLEXCAN_Mb_Type.
* @return 'true' to get the Mb frame successfully, 'false' to fail.
*/
bool FLEXCAN_ReadRxFifo(FLEXCAN_Type * FLEXCANx, FLEXCAN_Mb_Type * mb);
/*!
* @brief Get the number of buffer corresponding to the latest transmitted crc.
*
* @param FLEXCANx FLEXCAN instance.
* @param channel Channel match the latest transmission crc value.
* @return Latest transmission crc value.
*/
uint32_t FLEXCAN_GetMatchCrcValue(FLEXCAN_Type * FLEXCANx, uint32_t * channel);
/*!
*@}
*/
#endif /* __HAL_FLEXCAN_H__ */