
#ifndef __F_CAN_DRIVE_H__
#define __F_CAN_DRIVE_H__	  

#include "f_System.h"
#include "stm32f4xx_can.h"


#define USE_CAN1
// #define USE_CAN2

// CAN1选择
#ifdef  USE_CAN1
  #define E_CAN                     CAN1
  
  #define CAN_CLK                   RCC_APB1Periph_CAN1
  #define CAN_RX_PIN                GPIO_Pin_0
  #define CAN_TX_PIN                GPIO_Pin_1
  #define CAN_GPIO_PORT             GPIOD
  #define CAN_GPIO_CLK              RCC_AHB1Periph_GPIOD
  #define CAN_AF_PORT               GPIO_AF_CAN1
  #define CAN_RX_SOURCE             GPIO_PinSource0
  #define CAN_TX_SOURCE             GPIO_PinSource1

  #define CAN_RX0_IRQ_CHANNEL       CAN1_RX0_IRQn
  #define CAN_RX1_IRQ_CHANNEL       CAN1_RX1_IRQn
  #define CAN_TX_IRQ_CHANNEL        CAN1_TX_IRQn
  
// CAN2选择  
#else
  #define E_CAN                     CAN2
  
  #define CAN_CLK                   RCC_APB1Periph_CAN2
  #define CAN_RX_PIN                GPIO_Pin_5
  #define CAN_TX_PIN                GPIO_Pin_6
  #define CAN_GPIO_PORT             GPIOB
  #define CAN_GPIO_CLK              RCC_AHB1Periph_GPIOB
  #define CAN_AF_PORT               GPIO_AF_CAN2
  #define CAN_RX_SOURCE             GPIO_PinSource5
  #define CAN_TX_SOURCE             GPIO_PinSource6

  #define CAN_RX0_IRQ_CHANNEL       CAN2_RX0_IRQn
  #define CAN_RX1_IRQ_CHANNEL       CAN2_RX1_IRQn
  #define CAN_TX_IRQ_CHANNEL        CAN2_TX_IRQn  
#endif 

// 中断优先级定义
#define CAN_RX0_IRQ_Priority   		0
#define CAN_RX0_IRQ_SubPriority  	1

#define CAN_RX1_IRQ_Priority    	0
#define CAN_RX1_IRQ_SubPriority  	0

#define CAN_TX_IRQ_Priority      	0
#define CAN_TX_IRQ_SubPriority   	3

// CAN波特率宏定义
#define		CAN_BAUD_SUM			7		// CAN波特率总数

#define		CAN_INIT_TIME			1		// 初始化进行中
#define		CAN_INIT_SUCC			2		// 初始化成功
#define		CAN_INIT_TIMEOUT		3		// 初始化超时，失败
#define		CAN_INIT_BAUD_ERR		4		// 波特率选择出错

// 收发状态标志
#define		CAN_MBOX_TRAN_SUCC		0		// CAN邮箱操作成功，不表示发送成功
#define		CAN_MBOX_NUM_ERROR		1		// CAN邮箱号出错
#define		CAN_MBOX_BUSY			2		// CAN邮箱忙
#define		CAN_MBOX_EMPTY			3		// CAN接收邮箱空，
#define		CAN_MBOX_REC_SUCC		4		// CAN邮箱接收数据成功
#define		CAN_MBOX_REC_OVER		5		// CAN邮箱接收有数据溢出(读取不及时被覆盖)

#define		IINIT_CAN_TIME			4

#define		REC_ERR_INDEX			0
#define		TEC_ERR_INDEX			1


// 邮箱数定义
#define 	MAX_TX_MSG_COUNT   		8 
#define 	MAX_RX_MSG_COUNT 		10

#define     CANBUF_OVER    		0xcccc

typedef struct 
{
	Uint16	PRE;
	Uint16	BS1;
	Uint16 	BS2;
}CAN_BAUD_ST;


// DSP  CAN帧完整 数据结构
typedef struct
{
	Uint32  msgid;                                          // ID 29位  11位使用低11位
	Uint16  rtr;
	Uint16  len;                                            // 缓存数据长度	
	Uint8   data[8];                                        // CAN帧数据
}DspCanDataStru;

// CAN中断发送
typedef struct
{
    Uint8 		read;										// 读长度
	Uint8 		write;										// 写长度
	Uint8 		len;                                 		// 实际长度
    CanTxMsg 	TxMessage[MAX_TX_MSG_COUNT];				// 接收缓存
}CAN_TX_DATA;


// CAN中断发送
typedef struct
{
    Uint8 		    read;								    // 读长度
	Uint8 		    write;								    // 写长度
	Uint8 		    len;                                    // 实际长度
    DspCanDataStru  RxMessage[MAX_RX_MSG_COUNT];		    // 接收缓存
    Uint16          bufOver; 
}CAN_RX_DATA;


extern Uint16 InitCanDrive(Uint16 baud);
extern Uint16 eCanDataTran(DspCanDataStru *pdata);
extern Uint16 CANIntHook(DspCanDataStru *pdata);

#endif // __F_CAN_DRIVE_H__



