Communication_Over_CAN_1.h 5.96 KB
Newer Older
崔立宝's avatar
崔立宝 committed
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
/******************************************************************************
文 件 名: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