696 lines
25 KiB
C
696 lines
25 KiB
C
/* Copyright Statement:
|
|
*
|
|
* This software/firmware and related documentation ("AutoChips Software") are
|
|
* protected under relevant copyright laws. The information contained herein is
|
|
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
|
|
* the prior written permission of AutoChips inc. and/or its licensors, any
|
|
* reproduction, modification, use or disclosure of AutoChips Software, and
|
|
* information contained herein, in whole or in part, shall be strictly
|
|
* prohibited.
|
|
*
|
|
* AutoChips Inc. (C) 2021. All rights reserved.
|
|
*
|
|
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
|
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
|
|
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
|
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
|
|
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
|
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
|
|
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
|
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
|
|
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
|
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
|
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
|
|
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
|
|
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
|
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
|
|
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
|
|
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
|
|
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
|
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
|
|
*/
|
|
|
|
/*!
|
|
* @file can_drv.h
|
|
*
|
|
* @brief This file provides CAN driver definition and declaration.
|
|
*
|
|
*/
|
|
|
|
/* PRQA S 3630 EOF */ /* struct/union type will be used by user app. */
|
|
|
|
#ifndef CAN_DRV_H
|
|
#define CAN_DRV_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/* =========================================== Includes =========================================== */
|
|
#include "device_register.h"
|
|
#include "ckgen_drv.h"
|
|
#include "dma_drv.h"
|
|
#include "osif.h"
|
|
|
|
/*=====================================SOURCE FILE VERSION INFORMATION==============================*/
|
|
#define CAN_HAL_MODULE_ID (641U)
|
|
#define CAN_HAL_SW_MAJOR_VERSION (1U)
|
|
#define CAN_HAL_SW_MINOR_VERSION (1U)
|
|
#define CAN_HAL_SW_PATCH_VERSION (0U)
|
|
|
|
/* ============================================ Define ============================================ */
|
|
#define CAN_MAX_RBUF_LENGTH (76UL) /*!< The number of max receive buffer bytes */
|
|
#define CAN_MAX_TBUF_LENGTH (72UL) /*!< The number of max transmit buffer bytes */
|
|
|
|
/*!< Enable all interrupt mask except ECC */
|
|
#define CAN_IRQ_ALL_ENABLE_MSK (CAN_CTRL1_EIE_Msk | CAN_CTRL1_TSIE_Msk | CAN_CTRL1_TPIE_Msk |\
|
|
CAN_CTRL1_RAFIE_Msk | CAN_CTRL1_RFIE_Msk | CAN_CTRL1_ROIE_Msk |\
|
|
CAN_CTRL1_RIE_Msk | CAN_CTRL1_EPIE_Msk | CAN_CTRL1_ALIE_Msk | CAN_CTRL1_BEIE_Msk)
|
|
|
|
/* =========================================== Typedef ============================================ */
|
|
/*!< CAN callback function define */
|
|
typedef void (*can_callback_t)(uint8_t instance, uint32_t event, uint32_t koer);
|
|
|
|
/*!
|
|
* @brief CAN message frame type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_MSG_DATA_FRAME = 0U, /*!< Data frame */
|
|
CAN_MSG_REMOTE_FRAME /*!< Remote frame */
|
|
} can_msg_frame_type_t;
|
|
|
|
/*!
|
|
* @brief CAN message ID type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_MSG_ID_STD = 0U, /*!< Standard ID */
|
|
CAN_MSG_ID_EXT, /*!< Extended ID */
|
|
CAN_MSG_ID_BOTH /*!< Both */
|
|
} can_msg_id_type_t;
|
|
|
|
/*!
|
|
* @brief CAN message DLC define.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_MSG_DLC_12_BYTES = 9U, /*!< Message DLC 12 bytes */
|
|
CAN_MSG_DLC_16_BYTES, /*!< Message DLC 16 bytes */
|
|
CAN_MSG_DLC_20_BYTES, /*!< Message DLC 20 bytes */
|
|
CAN_MSG_DLC_24_BYTES, /*!< Message DLC 24 bytes */
|
|
CAN_MSG_DLC_32_BYTES, /*!< Message DLC 32 bytes */
|
|
CAN_MSG_DLC_48_BYTES, /*!< Message DLC 48 bytes */
|
|
CAN_MSG_DLC_64_BYTES /*!< Message DLC 64 bytes */
|
|
} can_msg_dlc_t;
|
|
|
|
/*!
|
|
* @brief CAN work mode.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_NORMAL_MODE = 0U, /*!< Normal mode */
|
|
CAN_LISTEN_ONLY_MODE, /*!< Listen only mode */
|
|
CAN_LOOPBACK_INT_MODE, /*!< Loopback internal mode */
|
|
CAN_LOOPBACK_EXT_MODE /*!< Loopback external mode */
|
|
} can_work_mode_t;
|
|
|
|
/*!
|
|
* @brief CAN transmit buffer type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TRANSMIT_PRIMARY = 0U, /*!< Transmit primary buffer */
|
|
CAN_TRANSMIT_SECONDARY /*!< Transmit secondary buffer */
|
|
} can_transmit_buff_t;
|
|
|
|
/*!
|
|
* @brief CAN transmit secondary amount.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TRANSMIT_SEC_ALL = 0U, /*!< Transmit secondary all messages */
|
|
CAN_TRANSMIT_SEC_ONE /*!< Transmit secondary one message */
|
|
} can_transmit_sec_amount_t;
|
|
|
|
/*!
|
|
* @brief CAN transmit secondary operation mode.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TSMODE_FIFO = 0U, /*!< Transmit secondary fifo mode */
|
|
CAN_TSMODE_PRIORITY /*!< Transmit secondary priority mode */
|
|
} can_transmit_sec_mode_t;
|
|
|
|
/*!
|
|
* @brief CAN transmit secondary buffer status.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TSSTAT_EMPTY = 0U, /*!< STB is empty */
|
|
CAN_TSSTAT_LESS_HALF, /*!< STB is less than or equal to half full */
|
|
CAN_TSSTAT_MORE_HALF, /*!< STB is more than half full */
|
|
CAN_TSSTAT_FULL /*!< STB is full */
|
|
} can_tsbuf_status_t;
|
|
|
|
/*!
|
|
* @brief CAN receive buffer status.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_RSTAT_EMPTY = 0U, /*!< RB is empty */
|
|
CAN_RSTAT_LESS_ALMOST, /*!< > empty and < almost full */
|
|
CAN_RSTAT_ALMOST_FULL, /*!< >= almost full but not full */
|
|
CAN_RSTAT_FULL /*!< RB is full */
|
|
} can_rbuf_status_t;
|
|
|
|
/*!
|
|
* @brief CAN receive overflow mode.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_ROM_OVER_WRITE = 0U, /*!< Oldest message will be overwrite */
|
|
CAN_ROM_DISCARD /*!< New message will not be store */
|
|
} can_rbuf_overflow_mode_t;
|
|
|
|
/*!
|
|
* @brief CAN time stamp clock source.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TIME_STAMP_CLK_SRC_EXT = 0U, /*!< Time stamp external clock */
|
|
CAN_TIME_STAMP_CLK_SRC_BIT /*!< Time stamp bit time clock */
|
|
} can_time_stamp_clk_src_t;
|
|
|
|
/*!
|
|
* @brief CAN time stamp postion.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_TIME_STAMP_SOF = 0U, /*!< Time stamp position SOF */
|
|
CAN_TIME_STAMP_EOF /*!< Time stamp position EOF */
|
|
} can_time_stamp_pos_t;
|
|
|
|
/*!
|
|
* @brief CAN interrupt event.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_EVENT_ABORT = (1UL << CAN_CTRL1_AIF_Pos), /*!< Abort interrupt flag */
|
|
CAN_EVENT_ERROR = (1UL << CAN_CTRL1_EIF_Pos), /*!< Error interrupt flag */
|
|
CAN_EVENT_TRANS_SEC_DONE = (1UL << CAN_CTRL1_TSIF_Pos), /*!< Transmit secondary interrupt flag */
|
|
CAN_EVENT_TRANS_PRI_DONE = (1UL << CAN_CTRL1_TPIF_Pos), /*!< Transmit primary interrupt flag */
|
|
CAN_EVENT_RBUF_ALMOST_FULL = (1UL << CAN_CTRL1_RAFIF_Pos), /*!< Rbuf almost full interrupt flag */
|
|
CAN_EVENT_RBUF_FULL = (1UL << CAN_CTRL1_RFIF_Pos), /*!< Rbuf full interrupt flag */
|
|
CAN_EVENT_RBUF_OVERRUN = (1UL << CAN_CTRL1_ROIF_Pos), /*!< Rbuf overrun interrupt flag */
|
|
CAN_EVENT_RECEIVE_DONE = (1UL << CAN_CTRL1_RIF_Pos), /*!< Receive interrupt flag */
|
|
CAN_EVENT_BUS_ERROR = (1UL << CAN_CTRL1_BEIF_Pos), /*!< Bus error interrupt flag */
|
|
CAN_EVENT_ARBIT_LOST = (1UL << CAN_CTRL1_ALIF_Pos), /*!< Arbitration lost interrupt flag */
|
|
CAN_EVENT_ERROR_PASSIVE = (1UL << CAN_CTRL1_EPIF_Pos), /*!< Error passive interrupt flag */
|
|
CAN_EVENT_ECC_WARNING = (1UL << (CAN_VERMEM_MDWIF_Pos + 8U)), /*!< Memory ECC warning interrupt flag */
|
|
CAN_EVENT_ECC_ERROR = (1UL << (CAN_VERMEM_MDEIF_Pos + 8U)), /*!< Memory ECC error interrupt flag */
|
|
CAN_EVENT_WAKEUP = 0x40000000UL /*!< Wakeup interrupt flag */
|
|
} can_event_type_t;
|
|
|
|
/*!
|
|
* @brief CAN kind of bus error.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_KOER_NO_ERROR = 0U, /*!< No error */
|
|
CAN_KOER_BIT_ERROR, /*!< Bit error */
|
|
CAN_KOER_FORM_ERROR, /*!< Form error */
|
|
CAN_KOER_STUFF_ERROR, /*!< Stuff error */
|
|
CAN_KOER_ACK_ERROR, /*!< Acknowledgement error */
|
|
CAN_KOER_CRC_ERROR, /*!< CRC error */
|
|
CAN_KOER_OTHER_ERROR, /*!< Other error */
|
|
CAN_KOER_RESERVE /*!< Reserved */
|
|
} can_bus_error_type_t;
|
|
|
|
/*!
|
|
* @brief CAN normal bitrate define or user define.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_BITRATE_1M = 0U,
|
|
CAN_BITRATE_800K,
|
|
CAN_BITRATE_500K,
|
|
CAN_BITRATE_250K,
|
|
CAN_BITRATE_125K,
|
|
CAN_BITRATE_100K,
|
|
CAN_BITRATE_50K,
|
|
CAN_BITRATE_NUM
|
|
} can_bitrate_t; /*!< CAN normal bitrate */
|
|
|
|
/*!
|
|
* @brief CAN FD data bitrate define or user define.
|
|
*/
|
|
typedef enum
|
|
{
|
|
CAN_FD_BITRATE_50K = 0U,
|
|
CAN_FD_BITRATE_100K,
|
|
CAN_FD_BITRATE_1M,
|
|
CAN_FD_BITRATE_2M,
|
|
CAN_FD_BITRATE_4M,
|
|
CAN_FD_BITRATE_6M,
|
|
CAN_FD_BITRATE_8M,
|
|
CAN_FD_BITRATE_NUM
|
|
} can_fd_bitrate_t; /*!< CAN FD data bitrate */
|
|
|
|
/*!
|
|
* @brief CAN message information.
|
|
*/
|
|
typedef struct can_msg_info_s
|
|
{
|
|
uint32_t ID; /*!< CAN identifier */
|
|
uint32_t RTS; /*!< Receive time stamp */
|
|
uint8_t ESI; /*!< Error state indicator */
|
|
uint8_t DLC; /*!< Data length code */
|
|
uint8_t BRS; /*!< Bit rate switch */
|
|
uint8_t FDF; /*!< FD format indicator */
|
|
uint8_t RTR; /*!< Remote transmission request */
|
|
uint8_t IDE; /*!< Identifier extension */
|
|
uint8_t *DATA; /*!< Data */
|
|
} can_msg_info_t;
|
|
|
|
/*!
|
|
* @brief CAN bitrate time segment struct.
|
|
* Bitrate = CAN_CLOCK / ((PRESC + 1) * (1 + (SEG_1 + 1) + (SEG_2 + 1)))
|
|
* Sample point = (1 + (SEG_1 + 1)) / (1 + (SEG_1 + 1) + (SEG_2 + 1))
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint8_t SEG_1; /*!< Bit timing segment 1 */
|
|
uint8_t SEG_2; /*!< Bit timing segment 2 */
|
|
uint8_t SJW; /*!< Synchronization jump width */
|
|
uint8_t PRESC; /*!< Prescaler */
|
|
} can_time_segment_t;
|
|
|
|
/*!
|
|
* @brief CAN filter configuration struct.
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t code; /*!< Code data 29bit */
|
|
uint32_t mask; /*!< Mask data 29bit */
|
|
can_msg_id_type_t idType; /*!< Mask id type */
|
|
} can_filter_config_t;
|
|
|
|
/*!
|
|
* @brief CAN configuration struct.
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint8_t filterNum; /*!< Set filter number */
|
|
can_work_mode_t canMode; /*!< CAN mode */
|
|
bool interruptEn; /*!< Interrupt enable */
|
|
can_transmit_sec_mode_t tsMode; /*!< Transmit secondary operation mode */
|
|
can_transmit_sec_amount_t tsAmount; /*!< Transmit secondary amount */
|
|
bool tpss; /*!< Transmission primary single shot mode for PTB */
|
|
bool tsss; /*!< Transmission secondary single shot mode for STB */
|
|
can_rbuf_overflow_mode_t rom; /*!< Receive buffer overflow mode */
|
|
bool selfAckEn; /*!< Self-acknowledge enable for LBME */
|
|
uint8_t errorWarningLimit; /*!< Error warning limit */
|
|
bool fdModeEn; /*!< FD mode enable */
|
|
bool fdIsoEn; /*!< FD ISO mode enable */
|
|
bool tdcEn; /*!< TDC enable (when fd bitrate >= 1Mbps) */
|
|
uint8_t sspOffset; /*!< SSP offset */
|
|
bool timeStampEn; /*!< Time stamp enable */
|
|
can_time_stamp_clk_src_t timeStampClkSrc; /*!< Time stamp clock source */
|
|
can_time_stamp_clk_div_t timeStampClkDiv; /*!< Time stamp external clock divider */
|
|
can_time_stamp_pos_t timeStampPos; /*!< Time stamp position */
|
|
bool dmaRecvEn; /*!< DMA receive enable */
|
|
bool memEccEn; /*!< CAN memory ECC enable */
|
|
bool wakeupIntEn; /*!< Wakeup interrupt enable */
|
|
bool lowPassFilterEn; /*!< Low pass filter enable */
|
|
bool busOffRecDisable; /*!< Auto bus off recovery disable */
|
|
uint32_t interruptMask; /*!< Interrupt enable mask */
|
|
uint32_t memEccIntMask; /*!< CAN memory ECC interrupt enable mask */
|
|
can_time_segment_t bitrate; /*!< Normal bitrate setting */
|
|
can_time_segment_t fdBitrate; /*!< FD data bitrate setting */
|
|
can_filter_config_t *filterList; /*!< Filter controller list */
|
|
can_callback_t callback; /*!< CAN callback function pointer */
|
|
can_callback_t wakeupCallback; /*!< CAN wakeup callback function pointer */
|
|
} can_user_config_t;
|
|
|
|
/* ========================================== Variables =========================================== */
|
|
|
|
/* ==================================== Functions declaration ===================================== */
|
|
/*!
|
|
* @brief Get CAN module base address.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @return CAN module base address
|
|
*/
|
|
CAN_Type* CAN_DRV_GetBase(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Set the CAN bitrate.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] bitrate: point to bitrate configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetBitrate(uint8_t instance, const can_time_segment_t *bitrate);
|
|
|
|
/*!
|
|
* @brief Get the CAN bitrate.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[out] bitrate: point to bitrate configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_GetBitrate(uint8_t instance, can_time_segment_t *bitrate);
|
|
|
|
/*!
|
|
* @brief Set the CAN FD data bitrate.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] bitrate: point to bitrate configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetBitrateFD(uint8_t instance, const can_time_segment_t *bitrate);
|
|
|
|
/*!
|
|
* @brief Get the CAN FD data bitrate.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[out] bitrate: point to bitrate configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_GetBitrateFD(uint8_t instance, can_time_segment_t *bitrate);
|
|
|
|
/*!
|
|
* @brief Set the CAN FD TDC and SSP offset.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] enable: TDC enable
|
|
* @param[in] offset: SSP offset
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetTDCOffset(uint8_t instance, bool enable, uint8_t offset);
|
|
|
|
/*!
|
|
* @brief Set the CAN filters (including code and mask).
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] index: CAN filter index (0-59)
|
|
* @param[in] enable: filter enable state
|
|
* @param[in] config: point to filter configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetFilter(uint8_t instance, uint8_t index, bool enable, const can_filter_config_t *config);
|
|
|
|
/*!
|
|
* @brief Install event callback function.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] callback: call back function pointer
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_InstallEventCallback(uint8_t instance, const can_callback_t callback);
|
|
|
|
/*!
|
|
* @brief Install wakeup callback function.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] callback: wakeup call back function pointer
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_InstallWakeupCallback(uint8_t instance, const can_callback_t callback);
|
|
|
|
/*!
|
|
* @brief Set software reset state.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] enable: reset state
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetReset(uint8_t instance, bool enable);
|
|
|
|
/*!
|
|
* @brief Initialize the CAN driver (including clock, bitrate, filter and interrupt settings).
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] config: point to CAN configuration
|
|
* @return initialize status
|
|
* - STATUS_SUCCESS: initialize successfully
|
|
* - STATUS_ERROR: initialize error
|
|
*/
|
|
status_t CAN_DRV_Init(uint8_t instance, const can_user_config_t *config);
|
|
|
|
/*!
|
|
* @brief Deinitialize the CAN module.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @return deinitialize status
|
|
* - STATUS_SUCCESS: deinitialize successfully
|
|
* - STATUS_ERROR: deinitialize error
|
|
*/
|
|
status_t CAN_DRV_Deinit(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Initialize CAN DMA receive.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] dmaChannel: DMA Channel instance
|
|
* @param[in] destAddr: destination address
|
|
* @param[in] size: total number of bytes (4-byte times)
|
|
* @param[in] callback: pointer to DMA callback function
|
|
* @return initialize DMA status
|
|
* - STATUS_SUCCESS: initialize DMA successfully
|
|
* - STATUS_ERROR: initialize DMA error
|
|
*/
|
|
status_t CAN_DRV_InitDMARecv(uint8_t instance, uint8_t dmaChannel,
|
|
uint32_t destAddr, uint8_t size, dma_callback_t callback);
|
|
|
|
/*!
|
|
* @brief Start next DMA receive.
|
|
*
|
|
* @param[in] dmaChannel: DMA Channel instance
|
|
* @param[in] destAddr: destination address
|
|
* @param[in] size: total number of bytes (4-byte times)
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_StartNextDMA(uint8_t dmaChannel, uint32_t destAddr, uint8_t size);
|
|
|
|
/*!
|
|
* @brief Get CAN default configuration.
|
|
*
|
|
* @param[out] config: point to CAN configuration
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_GetDefaultConfig(can_user_config_t *config);
|
|
|
|
/*!
|
|
* @brief Set TBUF directly.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] txBuf: pointer to transmission sram buffer
|
|
* @param[in] length: number of buffer bytes
|
|
* @param[in] type: transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetTbuf(uint8_t instance, const uint8_t *txBuf, uint8_t length, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Set a message information to TBUF.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] info: message information pointer
|
|
* @param[in] type: transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetMsgToTbuf(uint8_t instance, const can_msg_info_t *info, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Set amount for transmit secondary buffer.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] amount: transmit secondary buffer amount
|
|
* - CAN_TRANSMIT_SEC_ALL
|
|
* - CAN_TRANSMIT_SEC_ONE
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_SetTransSecAmount(uint8_t instance, can_transmit_sec_amount_t amount);
|
|
|
|
/*!
|
|
* @brief Get transmit secondary buffer status.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @return transmit secondary buffer status
|
|
*/
|
|
can_tsbuf_status_t CAN_DRV_GetTsbufStatus(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Check transmit is busy.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] type: CAN transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return transmit busy flag
|
|
* - false: not busy or STB is not full
|
|
* - true: is busy or STB is full
|
|
*/
|
|
bool CAN_DRV_IsTransmitBusy(uint8_t instance, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Check whether is transmitting.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] type: CAN transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return transmitting status
|
|
* - false: not transmitting
|
|
* - true: is transmitting
|
|
*/
|
|
bool CAN_DRV_IsTransmitting(uint8_t instance, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Send a CAN frame using the transmit buffer type.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] info: pointer to message information
|
|
* @param[in] type: transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return send status
|
|
* - STATUS_SUCCESS: send successfully
|
|
* - STATUS_ERROR: send error
|
|
* - STATUS_BUSY: send busy
|
|
*/
|
|
status_t CAN_DRV_Send(uint8_t instance, const can_msg_info_t *info, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Send a CAN frame using the transmit buffer type in a blocking way.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] info: pointer to message information
|
|
* @param[in] type: transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @param[in] timeout: timeout value
|
|
* @return send status
|
|
* - STATUS_SUCCESS: send successfully
|
|
* - STATUS_ERROR: send error
|
|
* - STATUS_BUSY: send busy
|
|
* - STATUS_TIMEOUT: send timeout
|
|
*/
|
|
status_t CAN_DRV_SendBlocking(uint8_t instance, const can_msg_info_t *info, can_transmit_buff_t type, uint32_t timeout);
|
|
|
|
/*!
|
|
* @brief Get receive buffer status.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @return receive buffer status
|
|
*/
|
|
can_rbuf_status_t CAN_DRV_GetRbufStatus(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Get RBUF directly.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[out] rxBuf: pointer to receive sram buffer
|
|
* @param[in] length: number of buffer bytes
|
|
* @return get receive buffer status
|
|
* - STATUS_SUCCESS: get receive buffer successfully
|
|
* - STATUS_ERROR: get receive buffer error
|
|
*/
|
|
status_t CAN_DRV_GetRbuf(uint8_t instance, uint8_t *rxBuf, uint8_t length);
|
|
|
|
/*!
|
|
* @brief Get the CAN message information from buffer.
|
|
*
|
|
* @param[out] info: pointer to message information
|
|
* @param[in] buf: pointer to receive buffer
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_GetMsgFromRbuf(can_msg_info_t *info, const CAN_BufType *buf);
|
|
|
|
/*!
|
|
* @brief Receive a CAN frame.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[out] info: pointer to message information
|
|
* @return receive status
|
|
* - STATUS_SUCCESS: receive successfully
|
|
* - STATUS_ERROR: receive error
|
|
*/
|
|
status_t CAN_DRV_Receive(uint8_t instance, can_msg_info_t *info);
|
|
|
|
/*!
|
|
* @brief Receive a CAN frame in a blocking way.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[out] info: message information pointer
|
|
* @param[in] timeout: timout value
|
|
* @return receive status
|
|
* - STATUS_SUCCESS: receive successfully
|
|
* - STATUS_ERROR: receive error
|
|
* - STATUS_TIMEOUT: receive timeout
|
|
*/
|
|
status_t CAN_DRV_ReceiveBlocking(uint8_t instance, can_msg_info_t *info, uint32_t timeout);
|
|
|
|
/*!
|
|
* @brief Abort a CAN transmission frame which has been requested.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] type: transmit buffer type
|
|
* - CAN_TRANSMIT_PRIMARY
|
|
* - CAN_TRANSMIT_SECONDARY
|
|
* @return abort status
|
|
* - STATUS_SUCCESS: abort successfully
|
|
* - STATUS_ERROR: abort error
|
|
*/
|
|
status_t CAN_DRV_AbortTransfer(uint8_t instance, can_transmit_buff_t type);
|
|
|
|
/*!
|
|
* @brief Enter or exit transceiver standby mode.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @param[in] enable: standby enable state
|
|
* @return set standby status
|
|
* - STATUS_SUCCESS: set standby successfully
|
|
* - STATUS_ERROR: set standby error
|
|
*/
|
|
status_t CAN_DRV_SetStandby(uint8_t instance, bool enable);
|
|
|
|
/*!
|
|
* @brief Get interrupt flags.
|
|
*
|
|
* @param[in] instance: CAN module instance
|
|
* @return interrupt flag
|
|
*/
|
|
uint32_t CAN_DRV_GetInterruptFlag(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Clear interrupt flags.
|
|
*
|
|
* @param[in] instance: CAN moduleinstance
|
|
* @return none
|
|
*/
|
|
void CAN_DRV_ClearInterruptFlag(uint8_t instance);
|
|
|
|
/*!
|
|
* @brief Get module version information.
|
|
*
|
|
* @param[out] versionInfo: Module version information address.
|
|
* @return void
|
|
*/
|
|
void CAN_DRV_GetVersionInfo(Drv_VersionInfo_Type *versionInfo);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* CAN_DRV_H */
|
|
|
|
/* ============================================= EOF ============================================== */
|