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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/******************************************************************************
文 件 名:DoCAN_ISO15765.h
功能描述:ISO 15765 规范规定的诊断服务函数头文件
作 者:张暄
版 本:V1.0
日 期:2016.7.18
******************************************************************************/
/******************************************************************************
诊断服务的OSI模型映射
===============================================================================
* NO. OSI Layer Diagnostics services
-------------------------------------------------------------------------------
7 Application ISO 14229-1 ISO 14229-3
6 Presentation -
5 Session ISO 14229-2
* 4 Transport ISO 15765-2
* 3 Network ISO 15765-2
2 Data Link ISO 11898
1 Physical ISO 11898
===============================================================================
******************************************************************************/
#ifndef _DOCAN_ISO15765_H_
#define _DOCAN_ISO15765_H_
#include "stdint.h"
#include "UDS_ISO14229_Server.h"
#include "DoCAN_ISO15765_Config.h"
/*-----------------------------------------------------------------------------
Transfer_Status
-----------------------------------------------------------------------------*/
#ifndef COMPLETE
#define COMPLETE 0x00
#endif
#ifndef NOT_COMPLETE
#define NOT_COMPLETE (! COMPLETE)
#endif
/*-----------------------------------------------------------------------------
N_PDU 名称
-----------------------------------------------------------------------------*/
#define SINGLE_FRAME 0x00
#define FIRST_FRAME 0x01
#define CONSECUTIVE_FRAME 0x02
#define FLOW_CONTROL 0x03
/*-----------------------------------------------------------------------------
流控帧类型
-----------------------------------------------------------------------------*/
#define FC_FS_CTS 0x00
#define FC_FS_WAIT 0x01
#define FC_FS_OVFL 0x02
/*-----------------------------------------------------------------------------
时序参数名称
-----------------------------------------------------------------------------*/
#define TIMING_PARA_NONE 0X00
#define TIMING_PARA_N_As 0X01
#define TIMING_PARA_N_Ar 0X02
#define TIMING_PARA_N_Bs 0X03
#define TIMING_PARA_N_Br 0X04
#define TIMING_PARA_N_Cs 0X05
#define TIMING_PARA_N_Cr 0X06
/*-----------------------------------------------------------------------------
STmin计时状态
-----------------------------------------------------------------------------*/
#define STmin_TIMER_IDLE 0X00 // STmin定时器空闲
#define STmin_TIME_UP 0X01 // STmin定时时间到
#define STmin_TIMING 0X02 // STmin定时器计时中
/*-----------------------------------------------------------------------------
传输层收发控制
-----------------------------------------------------------------------------*/
#define TP_DIR_MASK 0x80 // 收发标志位
#define TP_RX 0x00 // 传输层接收状态
#define TP_TX 0x80 // 传输层发送状态
#define TP_IDLE 0x00 // Rx:空闲状态
// Tx:空闲状态
#define TP_ERR 0x01 // Rx:接收系统错误
// Tx:发送系统错误
#define TP_RX_INIT 0x10 // Rx:已接收到首帧,初始化多帧接收
#define TP_TX_INIT 0x90 // Tx:发送初始化完成,正在发送首帧或单帧(注意单帧也使用此标志)
#define TP_RX_CTS 0x11 // Rx:接收机允许发送机发送连续帧(Clear To Send)
#define TP_TX_CTS 0x91 // Tx:发送机被许可发送连续帧(Clear To Send)
#define TP_RX_RTS 0x20 // Rx:请求继续发送多帧(Request To Send)
#define TP_TX_RTS 0xA0 // Tx:等待接收机许可多帧发送(Request To Send)
#define TP_RX_WAIT 0x21 // Rx:请求发送机暂停发送
#define TP_TX_WAIT 0xA1 // Tx:接收机请求等待
#define TP_RX_OVFL 0x22 // Rx:接收机接收溢出
#define TP_TX_OVFL 0xA2 // Tx:接收机接收溢出
/******************************************************************************
结构体声明
******************************************************************************/
/*** 链路层数据帧结构 ***/
typedef struct
{
uint16_t Identifier; // 帧ID
uint8_t Data [ 8 ]; // 帧数据
uint8_t DLC; // 帧长度
} LinkDataStruct;
/*** 链路层接收FIFO结构 ***/
typedef struct
{
LinkDataStruct LinkData [ LINK_RX_FIFO_MAX_DEPTH ];
uint8_t Depth; // FIFO深度
uint8_t IPtr; // 输入指针
uint8_t OPtr; // 输出指针
} LinkRxFIFOStruct;
/*** 链路层发送控制结构 ***/
typedef struct
{
uint16_t Identifier; // 帧ID
uint8_t Data [ 8 ]; // 帧数据
uint8_t Busy; // 发送器忙标志
} LinkTxCtrlStruct;
/*---------------------------------------------------------------------------*/
/*** 传输层数据帧结构 ***/
typedef struct
{
uint16_t Identifier;
uint8_t Data [ 8 ];
uint8_t DLC;
uint8_t New;
} TP_Data_Struct;
/*** 通用N_PCI解析结构 ***/
typedef struct
{
uint8_t Rsvd : 4;
uint8_t Type : 4;
} TP_N_PCI_Struct;
/*** 通用N_PDU解析结构 ***/
typedef struct
{
uint16_t N_TAtype;
TP_N_PCI_Struct N_PCI;
uint8_t N_Data [ 7 ];
uint8_t DLC;
uint8_t New;
} TP_N_PDU_Struct;
/*** 单帧N_PCI解析结构 ***/
typedef struct
{
uint8_t SF_DL : 4;
uint8_t Type : 4;
} TP_SF_N_PCI_Struct;
/*** 单帧N_PDU解析结构 ***/
typedef struct
{
uint16_t N_TAtype;
TP_SF_N_PCI_Struct N_PCI;
uint8_t N_Data [ 7 ];
uint8_t DLC;
uint8_t New;
} TP_N_PDU_SF_Struct;
/*** 首帧N_PCI解析结构 ***/
typedef struct
{
uint8_t FF_DL_H : 4;
uint8_t Type : 4;
uint16_t FF_DL_L : 8;
} TP_FF_N_PCI_Struct;
/*** 首帧N_PDU解析结构 ***/
typedef struct
{
uint16_t N_TAtype;
TP_FF_N_PCI_Struct N_PCI;
uint8_t N_Data [ 6 ];
uint8_t DLC;
uint8_t New;
} TP_N_PDU_FF_Struct;
/*** 连续帧N_PCI解析结构 ***/
typedef struct
{
uint8_t SN : 4;
uint8_t Type : 4;
} TP_CF_N_PCI_Struct;
/*** 连续帧N_PDU解析结构 ***/
typedef struct
{
uint16_t N_TAtype;
TP_CF_N_PCI_Struct N_PCI;
uint8_t N_Data [ 7 ];
uint8_t DLC;
uint8_t New;
} TP_N_PDU_CF_Struct;
/*** 流控帧N_PCI解析结构 ***/
typedef struct
{
uint8_t FS : 4;
uint8_t Type : 4;
uint8_t BS : 8;
uint8_t STmin : 8;
} TP_FC_N_PCI_Struct;
/*** 流控帧N_PDU解析结构 ***/
typedef struct
{
uint16_t N_TAtype;
TP_FC_N_PCI_Struct N_PCI;
uint8_t N_Data [ 5 ];
uint8_t DLC;
uint8_t New;
} TP_N_PDU_FC_Struct;
/*** 传输层数据解析联合体 ***/
typedef union
{
TP_Data_Struct Frame;
TP_N_PDU_Struct N_PDU;
TP_N_PDU_SF_Struct N_PDU_SF;
TP_N_PDU_FF_Struct N_PDU_FF;
TP_N_PDU_CF_Struct N_PDU_CF;
TP_N_PDU_FC_Struct N_PDU_FC;
} TransportDataUnion;
/*** 传输层收发控制结构 ***/
typedef struct
{
uint8_t Process; // 当前收发进程
uint8_t NonStopMode; // 不间断收发模式(不再理会后续的FC帧)
uint16_t Len; // 已接收到或已发送出的数据长度
uint16_t TotalLen; // 数据总长
uint16_t BlockSize; // Block总数
uint16_t BlockCnt; // 已接收到或已发送出的Block数
uint8_t BSMax; // 当前接收机剩余的最大Block数
uint8_t WFTCnt; //[仅接收用]等待次数计数
uint8_t STmin; //[仅发送用]当前接收机要求的最小间隔时间
} TransportControlStruct;
/*** 时序控制结构 ***/
typedef struct
{
uint16_t Cnt; // 滚动计数器
uint16_t LastCnt; // 上次更新时的滚动计数器
uint32_t NTimer; // 时序定时器,单位:us
uint32_t STimer; // 最小间隔时间(STmin)定时器,单位:us
uint8_t Type; // 当前定时器计时参数名称
uint8_t STminStatus; // STmin计时状态
} TransportTimingControlStruct;
/*---------------------------------------------------------------------------*/
/*** 数据收发结果N_Result枚举 ***/
typedef enum
{
N_OK = 0,
N_TIMEOUT_A,
N_TIMEOUT_Bs,
N_TIMEOUT_Cr,
N_WRONG_SN,
N_INVALID_FS,
N_UNEXP_PDU,
N_WFT_OVRN,
N_BUFFER_OVFLW,
N_ERROR,
} N_ResultEnum;
/*** 接收用N_USData数据结构 ***/
typedef struct
{
uint16_t N_TAtype;
uint16_t Length;
uint8_t MsgData [ N_USDATA_RX_BUFFER_SIZE ];
} N_USDataRxStruct;
/*** 发送用N_USData数据结构 ***/
typedef struct
{
uint16_t N_TAtype;
uint16_t Length;
uint8_t MsgData [ N_USDATA_TX_BUFFER_SIZE ];
} N_USDataTxStruct;
/******************************************************************************
函数声明
******************************************************************************/
/*-- 外部接口函数 -----------------------------------------------------------*/
/*** 后台服务函数 ***/
extern void DoCAN_Communication_Service(void);
extern void DoCAN_Timer_Update(uint16_t Interval);
/*** 网络层上层接口函数 ***/
void DoCAN_N_USData_Request(uint16_t N_TAtype, uint8_t *MessageData, uint16_t Length);
void DoCAN_N_USData_Confirm(uint16_t N_TAtype, N_ResultEnum N_Result);
void DoCAN_N_USData_FF_Indication(uint16_t N_TAtype, uint16_t Length);
void DoCAN_N_USData_Indication(uint16_t N_TAtype, uint8_t *MessageData, uint16_t Length, N_ResultEnum N_Result);
/*** 链路层下层接口函数 ***/
void DoCAN_L_Data_Request(uint16_t Identifier, uint8_t dlc, uint8_t *Data);
void DoCAN_L_Data_Confirm(uint16_t Identifier, uint8_t TransferStatus);
extern void DoCAN_L_Data_Indication(uint16_t Identifier, uint32_t dlc, uint8_t *pData);
extern void CAN_LLC_Ch5_Data_Request(uint32_t Identifier, uint16_t idx, uint8_t DLC, uint8_t *Data);
/*-- 内部函数 ---------------------------------------------------------------*/
/*** 传输层协议解析 ***/
void DoCAN_Receive_And_Assemble_N_USData(void); // 接收主函数
void DoCAN_Get_N_PDU(void);
void DoCAN_Receive_Single_Frame_N_Data(void);
void DoCAN_Receive_First_Frame_N_Data(void);
void DoCAN_Receive_Consecutive_Frame_N_Data(void);
void DoCAN_Receive_Flow_Control(void);
void DoCAN_Transmit_Flow_Control(void);
void DoCAN_Handle_Unknown_N_PDU(void);
void DoCAN_Disassemble_And_Transmit_N_USData(void); // 发送主函数
/*** 时序管理 ***/
void DoCAN_Update_Timer(void);
void DoCAN_Handle_Time_Out(void);
void DoCAN_Start_Timer(uint8_t TimingParameter);
void DoCAN_Stop_Timer(void);
void DoCAN_Start_STmin_Timer(uint8_t STminTime);
uint8_t DoCAN_Get_STmin_Timer_Status(void);
#endif