1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#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