#ifndef CAN_LIB_H_
#define CAN_LIB_H_
/*
#define Platform_16Bit
#define Platform_32Bit
*/
#ifdef Platform_16Bit
#define canlib_uint8_t unsigned char
#define canlib_uint16_t unsigned int
#define canlib_uint32_t unsigned long
#else
#define canlib_uint8_t unsigned char
#define canlib_uint16_t unsigned short
#define canlib_uint32_t unsigned int
#define canlib_uint64_t unsigned long long
#endif
#define CAN_RX_MSG_Block (( canlib_uint8_t )(24U / 4u))
#define CAN_TX_MSG_Block (( canlib_uint8_t )(32U / 4u))
typedef void (*MSG_CKB_ON_RECEIVE)(canlib_uint8_t CopyData []);
typedef void (*MSG_CKB_ON_PROCESS)(canlib_uint8_t CopyData []);
typedef void (*MSG_CKB_ON_LOST)(canlib_uint8_t CopyData []);
typedef void (*pfnMsgBufferSet)(canlib_uint8_t CopyData []);
typedef void (*pfnMsgSuccess)(void);
/**@enum CAN_FUNC_ERR_t
* @brief 定义驱动上报应用消息类型 \n
*/
typedef enum
{
CAN_ERR_OK, /**< 模块初始化返回值,参数正常 */
CAN_ERR_ParaInit, /**< 模块初始化返回值,初始化错误 */
CAN_ERR_OUTRANGE, /**< 模块初始化返回值,参数传入超限制 */
} CAN_FUNC_ERR_t;
/**@enum CAN_TX_Status_t
* @brief 定义CAN模块发送状态 \n
*/
typedef enum
{
CAN_N_TX_Disable = 0x00U, /**< CAN模块禁止发送 */
CAN_N_TX_Enable = 0x55U, /**< CAN模块允许发送 */
} CAN_TX_Status_t;
/**@enum CAN_RX_Status_t
* @brief 定义CAN模块接收状态 \n
*/
typedef enum
{
CAN_N_RX_Enable = 0x00U, /**< CAN模块禁止接收 */
CAN_N_RX_Disable = 0x55U, /**< CAN模块允许接收 */
} CAN_RX_Status_t;
/**@struct st_CANMsgAttribute
* @brief 报文接收属性结构体 \n
* 定义报接收文属性
*/
typedef struct
{
canlib_uint8_t Init_Aarry [ 8u ]; /**< 报文初始化值.默认加载,未收到报文时,buffer内为该值 */
canlib_uint8_t TimeOut_Array [ 8u ]; /**< 报文掉线值.掉线后加载 */
canlib_uint8_t Mask_Array [ 8u ]; /**< 报文掉线掩码.哪一位要是用掉线值就置位 */
canlib_uint32_t MSG_TimeOut_Val; /**< 报文掉线时间,单位ms */
canlib_uint32_t MSG_Identifier; /**< 报文ID值 */
MSG_CKB_ON_RECEIVE Msg_ReceiveCBK; /**< 报文中断接收回调函数,默认NULL,该回调函数处于接收中断内. */
MSG_CKB_ON_PROCESS Msg_ProcessCBK; /**< 报文逻辑接收回调函数,默认NULL,该回调函数处逻辑函数内 */
MSG_CKB_ON_LOST Msg_LostCBK; /**< 报文逻辑掉线回调函数,默认NULL,该回调函掉线后会被执行一次 */
} st_CANMsgAttribute;
/**@struct st_CAN_SendAttribute
* @brief 报文发送属性结构体 \n
* 定义发送报文属性
*/
typedef struct
{
canlib_uint32_t u32MsgID; /**< 报文发送ID */
canlib_uint32_t u32MsgCycle; /**< 报文发送周期,单位是us */
canlib_uint32_t u32MsgCycleOffset; /**< 报文发送周期偏移量,定时器计时初值 */
canlib_uint32_t u32InitSendCnt; /**< 报文发送初始次数 */
canlib_uint8_t u8MsgSTD_EXT; /**< 报文类型是标准帧还是扩展帧 标准帧0 扩展帧1 */
canlib_uint8_t u8MsgPro; /**< 报文发送优先级,使用哪个buffer发送 */
canlib_uint8_t u8MsgDLC; /**< 报文发送的长度,默认8 */
canlib_uint8_t u8TXMsgType; /**< 报文发送的类型,周期帧,事件帧,周期事件帧 */
pfnMsgBufferSet MsgBufferSet; /**< 报文发送buffer填充函数,报文发送前会调用此函数从外部加载发送值 */
pfnMsgSuccess MsgSuccess; /**< 报文发送成功回调函数 */
} st_CAN_SendAttribute;
/**@struct st_CAN_Msg
* @brief 报文发送结构体 \n
* 定义报文发送结构的信息
*/
typedef struct
{
canlib_uint32_t MsgID; /**< 报文发送ID */
canlib_uint8_t MsgStd; /**< 报文发送标准帧/扩展帧 */
canlib_uint8_t MsgRTR; /**< 报文发送数据帧/远程帧 默认0 */
canlib_uint8_t MsgDLC; /**< 报文发送长度 */
canlib_uint8_t MsgPro; /**< 报文发送优先级,对应使用buffer */
canlib_uint8_t Msg [ 8 ]; /**< 报文发送数据buffer */
} st_CAN_Msg;
typedef canlib_uint8_t (*HAL_CAN_Send)(st_CAN_Msg *Msg);
/**@struct st_CANMsgStruct
* @brief 内部使用 \n
* 内容不明
*/
typedef struct
{
canlib_uint8_t AnalyzeMsg [ 8u ];
canlib_uint8_t ReceiveBuf [ 8u ];
volatile canlib_uint8_t CAN_Busy;
volatile canlib_uint8_t CAN_Received;
canlib_uint8_t CAN_Status;
canlib_uint8_t CAN_Reverse;
canlib_uint32_t CAN_Lost;
} st_CANMsgStruct;
/**@struct st_CanMsgOp
* @brief 内部使用,不做讲解 \n
* 内部使用,不做讲解
*/
typedef struct
{
st_CANMsgStruct *CAN_MSG_Analysis;
const st_CANMsgAttribute *pAttrubute;
canlib_uint16_t Total_Msg;
canlib_uint8_t u8CAN_RX_ENABLE;
} st_CanMsgOp;
/**@struct st_CAN_SendOperation
* @brief 内部使用,不做讲解 \n
* 内部使用,不做讲解
*/
typedef struct
{
canlib_uint32_t u32MsgID;
canlib_uint32_t u32Timer;
canlib_uint32_t u32MsgCycle;
canlib_uint32_t u32SendCnt;
canlib_uint8_t u8MsgSTD_EXT;
canlib_uint8_t u8MsgPro;
canlib_uint8_t u8TXMsgType;
canlib_uint8_t u8MsgRet;
canlib_uint8_t u8MsgBuff [ 8u ];
canlib_uint16_t u16MsgDLC;
canlib_uint16_t u16TXMsgDIMcounter;
} st_CAN_SendOperation;
/**@struct st_CanMsgTxOp
* @brief 内部使用,不做讲解 \n
* 内部使用,不做讲解
*/
typedef struct
{
const st_CAN_SendAttribute *pCAN_SendAttribute;
st_CAN_SendOperation *CanMsg;
canlib_uint16_t Total_Msg;
HAL_CAN_Send Can_Write;
canlib_uint8_t u8CAN_TX_ENABLE;
} st_CanMsgTxOp;
extern void CAN_RX_SetEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable);
extern CAN_RX_Status_t CAN_RX_ReadEnableSts(st_CanMsgOp *CanRXMsgOp);
extern void CAN_TX_SetEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable);
extern CAN_TX_Status_t CAN_TX_ReadEnableSts(st_CanMsgTxOp *CanMsgTxOp);
extern void Can_Write_Fun(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32CbkCycle);
extern CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint16_t u16TxMSgDIMcounter, canlib_uint32_t u32TxMsgCycle);
extern CAN_FUNC_ERR_t Can_TX_BuffInit(st_CanMsgTxOp *CanMsgTxOp, const st_CAN_SendAttribute *Array, canlib_uint16_t length, HAL_CAN_Send pfunc);
extern void Can_Msg_TX_SUCCESS(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx);
extern CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint32_t CurTimerCnt);
extern void Can_RX_BuffInit(st_CanMsgOp *CanRXMsgOp, const st_CANMsgAttribute *array, canlib_uint16_t length);
extern void CanMSg_XMS_Analysis(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t CbkCycle);
extern void Co_Can_Buff_Set(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID, canlib_uint8_t m_DLC, canlib_uint8_t Msg []);
extern canlib_uint8_t CAN_MSG_Status(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID);
extern canlib_uint8_t CAN_MSG_Read(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx);
extern void Can_RX_ResetAllTimer(st_CanMsgOp *CanRXMsgOp);
extern void Can_RX_ResetTimer(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t idx);
extern canlib_uint32_t CAN_RX_Get_TimeStamp(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx);
extern canlib_uint8_t CAN_MSG_ChangeStatusDefault(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID);
extern canlib_uint32_t Read_CAN_RX_Version(void);
extern canlib_uint32_t Read_CAN_TX_Version(void);
extern void CAN_TX_DiagCtrlEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable);
extern void CAN_TX_DiagCtrlRelease(st_CanMsgTxOp *CanMsgTxOp);
extern void CAN_RX_DiagCtrlEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable);
extern void CAN_RX_DiagCtrlRelease(st_CanMsgOp *CanRXMsgOp);
#endif