231 lines
7.5 KiB
C
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__ */
|
|
|
|
|
|
|
|
|
|
|
|
|