/***********************************************************************
 * Copyright (c)  2017 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : can.h
 * Description : can driver header file
 * Author(s)   : Mason
 * version     : V1.0
 * Modify date : 2022-08-04
 ***********************************************************************/
#ifndef __CAN_H__
#define __CAN_H__

#include  "um321xF.h"

#define CAN_IRQ_ENABLE  	1
#define CAN_IRQ_DISABLE  	0

//#define CAN_RX_INT_MODE  			// RX采用中断方式
//#define CAN_TX_INT_MODE			// TX采用中断模式


#define CAN_RX_ADDR			0x7C0	//接收缓存基地址设置为

#define CAN_FILTER_ENABLE	1		//过滤器使能
#define CAN_FILTER_DISABLE	0		//过滤器关闭

#define CAN_SINGLE_FILTER	1		//单过滤器
#define CAN_DOUBLE_FILTER	0		//双过滤器

#define CAN0_FORMAT     	1
#define CAN0_STD_FORMAT     0		//标准模式
#define CAN0_EXT_FORMAT     1 		//扩展模式

#define CAN_IDE				0		//IDE设置
#define CAN_IDE_STD_FORMAT	0		//标准模式设置0;
#define CAN_IDE_EXT_FORMAT	1		//扩展模式设置1;

#define CAN_RTR				0		//RTR设置
#define CAN_RTR_DATA		0		//数据帧设置为0
#define CAN_RTR_REMOTE		1		//遥控帧设置为1

#define CAN_IMR_ALIM		(1<<6)	//仲裁丢失中断使能位
#define CAN_IMR_EWIM		(1<<5)	//错误警告中断使能位
#define CAN_IMR_EPIM		(1<<4)	//错误被动中断使能位
#define CAN_IMR_RIM			(1<<3)	//接收中断使能位
#define CAN_IMR_TIM			(1<<2)	//发送中断使能位
#define CAN_IMR_BEIM		(1<<1)	//总线错误中断使能位
#define CAN_IMR_DOIM		(1<<0)	//接收数据溢出中断使能位

#define CAN_RATE_1M       	0
#define CAN_RATE_500K     	1
#define CAN_RATE_250K     	2
#define CAN_RATE_125K     	3

/************************************************************************
 * Function     : can_init
 * Description  : can init
 * Input        : baudrate 速率可以选择为1M/500k/250k/125k bps
 *                APB时钟=PCLK=48Mhz,
 *                CAN波特率 BitRate = Fpclk/2*((BRP+1)*(TS1+TS2+3)), 有个约定:TS1>=TS2
 *
 *                设波特率为1M的参数：
 *                设置BRP=2(6分频), BitRate = 1M = 48M/2((2+1)*(TS1+TS2+3)),所以可以设置TS1=3,TS2=2
 *                
 *                设波特率为500K的参数：
 *                设置BRP=5(12分频), BitRate = 0.5M = 48M/2((5+1)*(TS1+TS2+3)),所以可以设置TS1=3,TS2=2
 *                
 *                设波特率为250K的参数：
 *                设置BRP=11(24分频), BitRate = 0.25M = 48M/2((11+1)*(TS1+TS2+3)),所以可以设置TS1=3,TS2=2
 *                
 *                设波特率为125K的参数：
 *                设置BRP=23(48分频), BitRate = 0.125M = 48M/2((23+1)*(TS1+TS2+3)),所以可以设置TS1=3,TS2=2
 * Return       : none
 ************************************************************************/
void can_init(uint8_t baudrate);

/************************************************************************
 * Function     : can_filter_config
 * Description  : can filter config
 * Input        : uint32_t filter_value：filter value 
 *                uint8_t filter_mode：single filter or double filter
 *                uint8_t data_mode: standard frame or extended frame
 *                uint8_t filter_en ：enable/disable
 * Return       : none
 ************************************************************************/
void can_filter_config(uint32_t filter_value, uint8_t filter_mode, uint8_t data_mode, uint8_t filter_en);

/************************************************************************
 * Function     : can_irq_init
 * Description  : can irq init
 * Input        : uint8_t irq_enable: interrupt enable/disable
 *                void (*can_int)(): interrupt callback function 
 * Return       : none
 ************************************************************************/
void can_irq_init(uint8_t irq_enable, void (*can_int)());

/************************************************************************
 * Function     : can_send_data
 * Description  : can send data
 * Input        : uint32_t *data： can_tx_msg
 * Return       : none
 ************************************************************************/
void can_send_data(uint32_t *data);

/************************************************************************
 * Function     : can_read_data
 * Description  : can read data；获取can数据
 * Input        : uint32_t *buff： data buff 
 *                uint8_t *ide：standard frame or extended frame 
 *                uint8_t *rtr：data frame or remote frame
 *                uint8_t *len：data length
 * Return       : none
 ************************************************************************/
void can_read_data(uint32_t *buff, uint8_t *ide, uint8_t *rtr, uint8_t *len);

/************************************************************************
 * Function     : can_get_sr_reg
 * Description  : can get sr reg
 * Input        : none
 * Return       : sr register value
 ************************************************************************/
uint32_t can_get_sr_reg(void);

/************************************************************************
 * Function     : can_get_rmc_reg
 * Description  : can get rmc reg, can rx fifo data 
 * Input        : none
 * Return       : rmc register value
 ************************************************************************/
uint8_t can_get_rmc_reg(void);

#endif
