/*** * CANTP header * CAN Transport Protocol ISO-15765-2 */ #ifndef CANTP_H #define CANTP_H #include 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