tao_z
2022-08-07 f453cfb645516628a6d1fa36e2ca633e1da6d708
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
/***
 * CANTP header
 * CAN Transport Protocol ISO-15765-2
 */
#ifndef CANTP_H
#define CANTP_H
 
#include <stdbool.h>
 
typedef unsigned short TP_uint16_t;
typedef unsigned char TP_uint8_t;
typedef unsigned int TP_uint32_t;
typedef char char_t;
typedef bool TP_bool_t;
typedef unsigned long long int uint64_t;
 
typedef struct CANTP_Buffer
{
    TP_uint8_t *data_u8;  // ptr to buffer
    TP_uint16_t size_u16; // size of buffer
} CanTP_Buffer_t;
/**
 * @brief ¶¨ÒåÁ÷¿ØÖƽṹ
 *
 */
typedef struct CANTP_FC
{
    TP_uint32_t last_tx_us_u32;         // Time since last data tx -- tx: loop
    TP_uint32_t separation_time_us_u32; // minimum time between data tx
    TP_uint16_t msg_length_u16;         // length of message -- tx: CANTP_TxMessage()
    TP_uint16_t position_u16;           // position of last data sent/received -- tx: txSendDataFrame()
    TP_uint16_t frame_id_u16;           // id of last frame sent -- tx: txSendDataFrame()
    TP_uint16_t blocks_u16;             // how many blocks before sync -- tx: loop
} CanTP_FC_t;
/**
 * @brief CAN´«Êä²ã½ÓÊÕ״̬
 *
 */
typedef enum
{
    CANTP_RX_STATE_IDLE = 0,
    CANTP_RX_STATE_RX_ACTIVE,
    CANTP_RX_STATE_READY_TO_READ,
    CANTP_RX_STATE_MAX
} CanTP_RxState_t;
 
typedef struct CANTP_Rx
{
    TP_uint32_t id;
    CanTP_Buffer_t buffer;
    CanTP_FC_t fc;
    CanTP_RxState_t state;
} CanTP_Rx_t;
 
typedef enum
{
    CANTP_TX_STATE_IDLE = 0,
    CANTP_TX_STATE_WAIT_FOR_FC_FRAME,
    CANTP_TX_STATE_WAIT_FOR_FC_TIMER,
    CANTP_TX_STATE_WAIT_FOR_LAST_FRAME_SEND,
    CANTP_TX_STATE_MAX
} CanTP_TxState_t;
 
typedef struct CANTP_Tx
{
    TP_uint32_t id;
    CanTP_Buffer_t buffer;
    CanTP_FC_t fc;
    CanTP_TxState_t state;
    TP_bool_t msgWasAborted;
} CanTP_Tx_t;
 
typedef struct CANTP_Stack
{
    TP_uint32_t can_channel;
    TP_uint32_t fnid;
    CanTP_Rx_t rx;
    CanTP_Tx_t tx;
} CANTP_Stack_t;
/**
 * @brief ´«Êä²ãPDU½á¹¹¶¨Òå
 *
 */
typedef struct CAN_Message
{
    TP_uint32_t arbId;    // standar ID;
    TP_uint32_t RTR;      // 0:Data Frame  1:Remote Frame.
    TP_uint32_t extended; // 0: standard ID ;1: Extende ID
    TP_uint32_t dlc;
    TP_uint8_t frame[8];
} TP_PDU_t;
/**
 * @brief
 *
 * @param stack CAN ´«Êä²ãÕ»
 * @param rx_buffer Ö¸ÕëÖ¸Ïò½ÓÊÕ»º³åÇø
 * @param rx_length ½ÓÊÕ»º³åÇø´óС
 * @param tx_buffer Ö¸Ïò·¢ËÍ»º³åÇø
 * @param tx_length ·¢ËÍ»º³åÇø´óС
 */
void CANTP_Init(struct CANTP_Stack *stack, TP_uint8_t *rx_buffer, TP_uint16_t rx_length, TP_uint8_t *tx_buffer, TP_uint16_t tx_length);
/**
 * @brief ³õʼ»¯CAN ´«Êä²ãʹÓõÄCAN ID
 *
 * @param stack
 * @param can_channel ¾ßÌåоƬCANͨµÀ¡£
 * @param rxid  ÎïÀíѰַ ½ÓÊÕID
 * @param txid  ÏìÓ¦ID
 * @param fnid  ¹¦ÄÜѰַID
 */
void CANTP_InitIds(struct CANTP_Stack *stack, TP_uint32_t can_channel, TP_uint32_t rxid, TP_uint32_t txid, TP_uint32_t fnid);
/**
 * @brief CAN ´«Êä²ã½ÓÊÕÀ´ÖÁÎïÀí²ãµÄPDU
 *
 * @param stack Ö¸¶¨´«Êä²ãÕ»
 * @param frame PDU
 * @return TP_bool_t
 */
TP_bool_t CANTP_RxFrame(struct CANTP_Stack *stack, TP_PDU_t *frame);
 
/**
 * @brief ÅжÏÊÇ·ñ½ÓÊÕÍê±ÏÍêÕûµÄÒ»Ö¡ÐźÅ
 *
 * @param stack Ö¸¶¨´«Êä²ãÕ»
 * @param tp_message Ö¸Õë·µ»Ø½ÓÊÕµ½µÄÊý¾Ý
 * @param length Ö¸Õë·µ»Ø½ÓÊÕµ½µÄÊý¾Ý³¤¶È
 * @return TP_bool_t true:½ÓÊÕÍê±Ï£¬·ñÔòδÍê±Ï
 */
TP_bool_t CANTP_IsRxComplete(struct CANTP_Stack *stack, TP_uint8_t **tp_message, TP_uint16_t *length);
 
/**
 * @brief ¹©¸øUDSµ÷Ó÷¢ËÍ·þÎñÖ¡
 *
 * @param stack Ö¸¶¨´«Êä²ãÕ»
 * @param tp_message Ö¸ÏòÐèÒª·¢Ë͵ÄÊý¾ÝµØÖ·
 * @param length ·¢ËÍÊý¾Ý³¤¶È
 * @return TP_bool_t
 */
TP_bool_t CANTP_TxMessage(struct CANTP_Stack *stack, TP_uint8_t *tp_message, TP_uint16_t length);
 
/**
 * @brief ÅжÏÊÇ·ñµ±Ç°Ò»Ö¡Êý¾ÝÒÑ·¢ËÍÍê±Ï
 *
 * @param stack
 * @return TP_bool_t True:·¢ËÍÍê±Ï£¬·ñÔòδÍê³É
 */
TP_bool_t CANTP_IsTxComplete(struct CANTP_Stack *stack);
/**
 * @brief ÅжÏÊÇ·ñ·¢ËÍÖÐÖ¹
 *
 * @param stack Ö¸¶¨CAN´«Êä³öÕ»
 * @return TP_bool_t ture:ÖÕÖ¹£¬·ñÔòδÖÕÖ¹
 */
TP_bool_t CANTP_IsTxAborted(struct CANTP_Stack *stack);
/**
 * @brief CAN´«Êä²ã·¢ËÍÊý¾ÝÈÎÎñ£¬1msÖÜÆÚ¡£ÓÃÓÚ·¢ËÍÁ¬ÐøÖ¡»òÁ÷¿ØÖÆÖ¡
 *
 * @param stack Ö¸¶¨CAN tp Õ»
 */
void CANTP_Task_1ms(struct CANTP_Stack *stack);
/**
 * @brief CAN´«Êä²ã·¢ËÍPDUº¯Êý£¬Ò»°ãΪÐèÒªµ÷ÓÃоƬµ×²ãÇý¶¯£¬Òò´ËÐèÒªÔÚ¿âÍâ±ß¸ù¾ÝоƬȥʵÏÖ¡£
 *
 * @param msg ÐèÒª·¢Ë͵ÄPDUÊý¾ÝÖ¸Õë
 * @param channel CAN Í¨µÀ
 */
extern void CANTP_drive_Tx(TP_PDU_t *msg, TP_uint32_t channel);
#endif