2025-04-26 16:03:23 +08:00

231 lines
7.5 KiB
C

/** ##########################################################################
** Filename :
** Project :
** Module :
** Processor :
** Version :
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note :
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
#ifndef CAN_H__
#define CAN_H__
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "common_types.h"
#include "can_cfg.h"
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*#define CAN_ID_NULL 0xffu*/
/*PCLINT_ERROS*/ /*lint --e(961)*/ /* 961 不要過份依賴運算優重出級 */
#define IS_CAN_ALL_ID(ID) ( (ID) < CAN_ID_TOTAL)
//CAN邏輯通道
#define CAN_LOGIC_ID_0 0
#define CAN_LOGIC_ID_1 1
#define CAN_LOGIC_ID_2 2
//标准帧
#define CAN_MSG_ID_STD 0
#define CAN_MSG_ID_EXT 1
//远程帧
#define CAN_MSG_RTR_DATA 0
#define CAN_MSG_RTR_REMOTE 1
//FD
#define CAN_MSG_TYPE_NORMAL 0
#define CAN_MSG_TYPE_FD 1
//BRS
#define CAN_MSG_BRS_NORMAL_LOW 0
#define CAN_MSG_BRS_FAST 1
#define CAN_TypeDef CAN_Type
#define CAN_FilterInitTypeDef FL_CAN_FilterInitTypeDef
/** @defgroup CAN_identifier_type
* @{
*/
#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */
#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */
#define IS_CAN_IDTYPE(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || \
((IDTYPE) == CAN_Id_Extended))
/** @defgroup CAN_remote_transmission_request
* @{
*/
#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame */
#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */
#define IS_CAN_RTR(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote))
#define CAN_ID_STD CAN_Id_Standard
#define CAN_ID_EXT CAN_Id_Extended
#define CAN_RTR_DATA CAN_RTR_Data
#define CAN_RTR_REMOTE CAN_RTR_Remote
/**
* @}
*/
/** @defgroup CAN_synchronisation_jump_width
* @{
*/
#define CAN_SJW_1tq FL_CAN_SJW_1Tq /*!< 1 time quantum */
#define CAN_SJW_2tq FL_CAN_SJW_2Tq /*!< 2 time quantum */
#define CAN_SJW_3tq FL_CAN_SJW_3Tq /*!< 3 time quantum */
#define CAN_SJW_4tq FL_CAN_SJW_4Tq /*!< 4 time quantum */
#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| \
((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq))
/**
* @}
*/
/** @defgroup CAN_time_quantum_in_bit_segment_1
* @{
*/
#define CAN_BS1_1tq FL_CAN_TS1_1Tq /*!< 1 time quantum */
#define CAN_BS1_2tq FL_CAN_TS1_2Tq /*!< 2 time quantum */
#define CAN_BS1_3tq FL_CAN_TS1_31Tq /*!< 3 time quantum */
#define CAN_BS1_4tq FL_CAN_TS1_4Tq /*!< 4 time quantum */
#define CAN_BS1_5tq FL_CAN_TS1_5Tq /*!< 5 time quantum */
#define CAN_BS1_6tq FL_CAN_TS1_6Tq /*!< 6 time quantum */
#define CAN_BS1_7tq FL_CAN_TS1_7Tq /*!< 7 time quantum */
#define CAN_BS1_8tq FL_CAN_TS1_8Tq /*!< 8 time quantum */
#define CAN_BS1_9tq FL_CAN_TS1_9Tq /*!< 9 time quantum */
#define CAN_BS1_10tq FL_CAN_TS1_10Tq /*!< 10 time quantum */
#define CAN_BS1_11tq FL_CAN_TS1_11Tq /*!< 11 time quantum */
#define CAN_BS1_12tq FL_CAN_TS1_12Tq /*!< 12 time quantum */
#define CAN_BS1_13tq FL_CAN_TS1_13Tq /*!< 13 time quantum */
#define CAN_BS1_14tq FL_CAN_TS1_14Tq /*!< 14 time quantum */
#define CAN_BS1_15tq FL_CAN_TS1_15Tq /*!< 15 time quantum */
#define CAN_BS1_16tq FL_CAN_TS1_16Tq /*!< 16 time quantum */
#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq)
/**
* @}
*/
/** @defgroup CAN_time_quantum_in_bit_segment_2
* @{
*/
#define CAN_BS2_1tq FL_CAN_TS2_1Tq /*!< 1 time quantum */
#define CAN_BS2_2tq FL_CAN_TS2_2Tq /*!< 2 time quantum */
#define CAN_BS2_3tq FL_CAN_TS2_3Tq /*!< 3 time quantum */
#define CAN_BS2_4tq FL_CAN_TS2_4Tq /*!< 4 time quantum */
#define CAN_BS2_5tq FL_CAN_TS2_5Tq /*!< 5 time quantum */
#define CAN_BS2_6tq FL_CAN_TS2_6Tq /*!< 6 time quantum */
#define CAN_BS2_7tq FL_CAN_TS2_7Tq /*!< 7 time quantum */
#define CAN_BS2_8tq FL_CAN_TS2_8Tq /*!< 8 time quantum */
#define IS_CAN_BS2(BS2) ((BS2) <= CAN_BS2_8tq)
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*can 序號--物理通道*/
typedef enum
{
CAN_ID_0 = 0u ,
CAN_ID_1 = 1u ,
CAN_ID_2 = 2u ,
CAN_ID_NULL = 0xffu
}can_id_e;
/*按鍵命令*/
typedef struct
{
flexcan_msgbuff_id_type_t type;
u8 phy_id; //instance 物理CAN通道
u8 mailbox_id; //郵箱id
u32 msg_id; //CAN ID -- 和 msg中的复用
u8 len; //len -- 和 msg中的复用
u8 fd_enable; // 和 msg中的复用
u8 fd_padding; /*!< Set a value for padding. It will be used when the data length code (DLC)
specifies a bigger payload size than data_length to fill the MB */
u8 enable_brs; /*!< Enable bit rate switch inside a CAN FD format frame*/
u8 is_remote; /*!< Specifies if the frame is standard or remote */
CAN_MsgInfoType msg;
u8 buf[CAN_FRAME_MAX_DLC];
}can_queue_elem_s;
typedef struct
{
u8 phy_id;
CAN_MsgInfoType tx;
CAN_MsgInfoType rx;
u8 tx_buf[CAN_FRAME_MAX_DLC]; //最大64字节
u8 rx_buf[CAN_FRAME_MAX_DLC];
u8 result;
u8 count;
u8 state_tx; //状态
u8 mailbox_id; //發送的郵箱id
#ifdef CAN_LOGIC_DEBUG
u8 test[16];
u32 canid;
#if 0
u8 normal_int_event;
u8 normal_int_bufid;
u8 normal_int_count[32][3];
u8 normal_queue_count[32][3];
u8 error_int_event;
u8 error_int_count;
u16 count1[2];
#endif
#endif
}can_s;
/*---------------------------------------------------------------------------
- G L O B A L V A R I A B L E S
- only configuration table allowed here,variables are not allowed!
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
void can_init(void);
void can_de_init(void);
void can_task(void);
void can_tx_start(const can_queue_elem_s *p_tx);
void can_op_tx_task(void);
void can_phy_drive_init(can_id_e phy_id);
void can0_de_init(void);
void can0_init(void);
#endif /* __CAN_H__ */