/***
|
* 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
|