/****************************************************************************** 文 件 名:Communication_Over_CAN.h 功能描述:基于CAN总线的信号收发函数库头文件 作 者:张暄 版 本:V1.3 日 期:2017.5.31 ******************************************************************************/ #ifndef _COMMUNICATION_OVER_CAN_ #define _COMMUNICATION_OVER_CAN_ #include "API.h" #ifdef _CAN_J1939_ //----hyq--20180717 增加J1939CAN #include "MSCAN0_J1939.h" #include "DoCAN_J1939.h" #else #include "MSCAN0.h" #include "DoCAN_ISO15765.h" #endif //#include "MSCAN0.h" #include "CAN_Communication_Matrix.h" /****************************************************************************** CAN通信参数配置 ******************************************************************************/ #define CoCAN_RX_MSG_FIFO_MAX_DEPTH 16 //接收FIFO深度 #define CoCAN_MSG_NUM_CHECK 0 //报文数量检查(Debug用) #define CoCAN_TOTAL_MSG_NUM (sizeof(CANMsgAttrTable) / sizeof(CANMsgAttrStruct)) /****************************************************************************** CAN通信收发使能状态 ******************************************************************************/ #define CoCAN_DISABLE 0 #define COCAN_PSEUDO_DISABLE 1 #define CoCAN_ENABLE 2 /****************************************************************************** CAN报文发送请求状态 ******************************************************************************/ #define CoCAN_TX_IDLE 0 #define CoCAN_TX_REQ 1 #define CoCAN_TX_ON 2 /****************************************************************************** CAN报文发送请求状态 ******************************************************************************/ #define CoCAN_MODE_NORMAL 0 #define CoCAN_MODE_INIT 1 /****************************************************************************** CAN报文发送FIFO结构 ******************************************************************************/ typedef struct { uint8_t Index[CAN_TX_MSG_NUM]; uint8_t Iptr; uint8_t Optr; uint8_t Depth; } CoCANTxMsgFIFOStruct; /****************************************************************************** CAN报文接收FIFO结构 ******************************************************************************/ typedef struct { uint16_t Identifier; uint8_t Data[8]; uint8_t DLC; } CoCANMsgStruct; typedef struct { CoCANMsgStruct Msg[CoCAN_RX_MSG_FIFO_MAX_DEPTH]; uint8_t Iptr; uint8_t Optr; uint8_t Depth; } CoCANRxMsgFIFOStruct; /****************************************************************************** CAN报文快速查找表结构 ******************************************************************************/ /*** 发送报文查找表结构 ***/ typedef struct { uint16_t Identifier; //报文ID uint16_t Offset; //报文发送时间偏移 uint16_t Cycle; //报文发送周期 uint8_t Rsvd; //保留 uint8_t Index; //发送报文对应在周期性报文表中的序号,0xFF表示非周期性报文 uint8_t TxReq; //发送请求 uint8_t DLC; //报文长度 volatile uint8_t *pMsg; //报文寄存器 const uint8_t *pInit; //报文初始化值 volatile uint8_t *pStatus; //状态寄存器 } CoCANTxMsgIDLookupStruct; /*** 接收报文查找表结构 ***/ typedef struct { uint16_t Identifier; //报文ID uint16_t Cycle; //报文超时周期,用于掉线判断 uint8_t Rsvd; //保留 uint8_t Index; //接收报文对应在周期性报文表中的序号,0xFF表示非周期性报文 uint8_t DLCMax; //报文最大长度 uint8_t DLCMin; //报文最小长度 volatile uint8_t *pMsg; //报文寄存器 const uint8_t *pInit; //报文初始化值 const uint8_t *pTimeOut; //报文掉线值 const uint8_t *pMask; //报文屏蔽位(决定某一位在掉线时是否更新为掉线值) volatile uint8_t *pStatus; //状态寄存器 } CoCANRxMsgIDLookupStruct; /****************************************************************************** CAN周期性报文管理结构 ******************************************************************************/ typedef struct { uint8_t TxNum; //周期性发送报文数量 uint8_t TxIndex[CAN_TX_MSG_NUM]; //报文对应在发送报文查找表中的序号 uint16_t TxTimer[CAN_TX_MSG_NUM]; //发送报文定时器 uint8_t RxNum; //周期性发送报文数量 uint8_t RxIndex[CAN_RX_MSG_NUM]; //报文对应在发送报文查找表中的序号 uint16_t RxTimer[CAN_RX_MSG_NUM]; //接收报文定时器,用于掉线判断 } CoCANCycleMsgStruct; /****************************************************************************** CAN通信控制结构 ******************************************************************************/ typedef struct { uint8_t Mode; uint8_t TxEnable; uint8_t RxEnable; uint8_t Prescaler; uint16_t Timer; } CoCANCtrlStruct; /****************************************************************************** 函数声明 ******************************************************************************/ void CoCAN_L_Data_Indication(uint16_t Identifier, uint8_t DLC, uint8_t *Data); //必须由下一层函数引用 void CoCAN_L_Data_Request(uint16_t Identifier, uint8_t DLC, uint8_t *Data); void CoCAN_L_Data_Confirm(uint16_t Identifier, uint8_t TransferStatus); //必须由下一层函数引用 void CoCAN_Init(void); void CoCAN_Reset(void); void CoCAN_Set_Mode(uint8_t Mode); void CoCAN_Rx_Enable(uint8_t En); void CoCAN_Tx_Enable(uint8_t En); uint8_t CoCAN_Search_Tx_Msg(uint16_t Identifier); uint8_t CoCAN_Search_Rx_Msg(uint16_t Identifier); void CoCAN_Signal_Update_Service(void); //必须每1ms被调用一次 void CoCAN_Transmit_Message(uint16_t Identifier); void CoCAN_Modify_Tx_Msg_Cycle(uint16_t Identifier, uint16_t Cycle); void CoCAN_Init_Mode_Tx_ISR(void); #endif