⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcp2510.h

📁 ce下S3C2410的SPI口转CAN的驱动
💻 H
字号:
#ifndef __MCP2510_H__
#define __MCP2510_H__

#ifdef __cplusplus
extern "C" {
#endif

#define USEVIRTUAL 1
#define DEBUGMODE  1

#define U32   unsigned int
#define U16   unsigned short
#define WORD  unsigned short
#define S16   short int
#define U8    unsigned char
#define BYTE  unsigned char
#define	S8    char

#ifndef MIN
    #define MIN(x,y)		((x) < (y) ? (x) : (y))
#endif

#include <s2410.h>

#define PUBLIC		
#define PRIVATE		static

PRIVATE volatile IOPreg   * v_pIOPregs;
PRIVATE volatile SSPreg   * v_pSPI0regs;
PRIVATE volatile INTreg   * v_pINTregs;
PRIVATE volatile PWMreg   * v_pPWMregs;

#define DisEnINT(value)    (v_pINTregs->rINTMSK |= (value))
#define EnINT(value)       (v_pINTregs->rINTMSK &= ~(value))
#define ClearINTPnd(value) (v_pINTregs->rSRCPND  = (value))
                            
/***********************************************************************/
/*********************mcp2510 register define***************************/
/***********************************************************************/
//mcp2510's SPI command
#define CMD_WRITE    0x02
#define CMD_READ     0x03
#define CMD_BIT      0x05
#define CMD_TXB2     0x84
#define CMD_TXB1     0x82
#define CMD_TXB0     0x81
#define CMD_TXBT     0x87
#define CMD_STATE    0xa0
#define CMD_RESET    0xc0

//mcp2510's work mode
#define CONFIG_MODE  0x80
#define LISTEN_MODE  0x60
#define BACK_MODE    0x40
#define DOZE_MODE    0x20
#define NORMAL_MODE  0x00 

//  MACROS
#define CAN_CS_L()       (v_pIOPregs->rGPGDAT &= ~(0x0001<<2)) //cs signal is low
#define CAN_CS_H()       (v_pIOPregs->rGPGDAT |= (0x0001<<2))  //cs signal is high
#define CAN_CMD(cmd)     (v_pSPI0regs->rSPTDAT0 = cmd)     //write command 
#define CAN_ADDR(addr)   (v_pSPI0regs->rSPTDAT0 = addr)    //write address 
#define CAN_DATA_W(val)  (v_pSPI0regs->rSPTDAT0 = val)     //write value
#define CAN_DATA_R()     ( v_pSPI0regs->rSPRDAT0 )         //read value
#define CAN_WAITRB()     {while( !(v_pSPI0regs->rSPSTA0 & 0x01) );}//Is completed

//mcp2510 registers
//RXF0
#define RXF0SIDH  0x00
#define RXF0SIDL  0x01
#define RXF0EID8  0x02
#define RXF0EID0  0x03
//RXF1
#define RXF1SIDH  0x04
#define RXF1SIDL  0x05
#define RXF1EID8  0x06
#define RXF1EID0  0x07
//RXF2
#define RXF2SIDH  0x08
#define RXF2SIDL  0x09
#define RXF2EID8  0x0a
#define RXF2EID0  0x0b
//RXF3
#define RXF3SIDH  0x10
#define RXF3SIDL  0x11
#define RXF3EID8  0x12
#define RXF3EID0  0x13
//RXF4
#define RXF4SIDH  0x14
#define RXF4SIDL  0x15
#define RXF4EID8  0x16
#define RXF4EID0  0x17
//RXF5
#define RXF5SIDH  0x18
#define RXF5SIDL  0x19
#define RXF5EID8  0x1a
#define RXF5EID0  0x1b
//RXM0
#define RXM0SIDH  0x20
#define RXM0SIDL  0x21
#define RXM0EID8  0x22
#define RXM0EID0  0x23
//RXM1
#define RXM1SIDH  0x24
#define RXM1SIDL  0x25
#define RXM1EID8  0x26
#define RXM1EID0  0x27

#define BFPCTRL   0x0c
#define TXRTSCTRL 0x0d
#define CANSTAT   0x0e
#define CANCTRL   0x0f
#define TEC       0x1c
#define REC       0x1d

#define CNF3      0x28
#define CNF2      0x29
#define CNF1      0x2a
#define CANINTE   0x2b
#define CANINTF   0x2c
#define EFLG      0x2d

//TXB0
#define TXB0CTRL  0x30
#define TXB0SIDH  0x31
#define TXB0SIDL  0x32
#define TXB0EID8  0x33
#define TXB0EID0  0x34
#define TXB0DLC   0x35
#define TXB0D0    0x36
#define TXB0D1    0x37
#define TXB0D2    0x38
#define TXB0D3    0x39
#define TXB0D4    0x3a
#define TXB0D5    0x3b
#define TXB0D6    0x3c
#define TXB0D7    0x3d

//TXB1
#define TXB1CTRL  0x40
#define TXB1SIDH  0x41
#define TXB1SIDL  0x42
#define TXB1EID8  0x43
#define TXB1EID0  0x44
#define TXB1DLC   0x45
#define TXB1D0    0x46
#define TXB1D1    0x47
#define TXB1D2    0x48
#define TXB1D3    0x49
#define TXB1D4    0x4a
#define TXB1D5    0x4b
#define TXB1D6    0x4c
#define TXB1D7    0x4d

//TXB2
#define TXB2CTRL  0x50
#define TXB2SIDH  0x51
#define TXB2SIDL  0x52
#define TXB2EID8  0x53
#define TXB2EID0  0x54
#define TXB2DLC   0x55
#define TXB2D0    0x56
#define TXB2D1    0x57
#define TXB2D2    0x58
#define TXB2D3    0x59
#define TXB2D4    0x5a
#define TXB2D5    0x5b
#define TXB2D6    0x5c
#define TXB2D7    0x5d

//RXB0
#define RXB0CTRL  0x60
#define RXB0SIDH  0x61
#define RXB0SIDL  0x62
#define RXB0EID8  0x63
#define RXB0EID0  0x64
#define RXB0DLC   0x65
#define RXB0D0    0x66
#define RXB0D1    0x67
#define RXB0D2    0x68
#define RXB0D3    0x69
#define RXB0D4    0x6a
#define RXB0D5    0x6b
#define RXB0D6    0x6c
#define RXB0D7    0x6d

//RXB1
#define RXB1CTRL  0x70
#define RXB1SIDH  0x71
#define RXB1SIDL  0x72
#define RXB1EID8  0x73
#define RXB1EID0  0x74
#define RXB1DLC   0x75
#define RXB1D0    0x76
#define RXB1D1    0x77
#define RXB1D2    0x78
#define RXB1D3    0x79
#define RXB1D4    0x7a
#define RXB1D5    0x7b
#define RXB1D6    0x7c
#define RXB1D7    0x7d

//CANINTE register
#define  MERRE  0x80
#define  WAKIE  0x40
#define  ERRIE  0x20
#define  TX2IE  0x10 
#define  TX1IE  0x08
#define  TX0IE  0x04
#define  RX1IE  0x02
#define  RX0IE  0x01
//CANINTF register
#define  MERRF  0x80
#define  WAKIF  0x40
#define  ERRIF  0x20
#define  TX2IF  0x10 
#define  TX1IF  0x08
#define  TX0IF  0x04
#define  RX1IF  0x02
#define  RX0IF  0x01

//EFLG register
#define  RX1OVR 0x80
#define  RX0OVR 0x40
#define  TXB0   0x20
#define  TXEP   0x10
#define  RXEP   0x08
#define  TXWAR  0x04
#define  RXWAR  0x02
#define  EWARN  0x01

//
#define  TXREQ0  0x04
#define  TXREQ1  0x10
#define  TXREQ2  0x40

typedef enum 
{
    INTR_NONE	=  0,
    INTR_RX0IF  =  RX0IF,
	INTR_RX1IF  =  RX1IF,
	INTR_TX0IF  =  TX0IF,
	INTR_TX1IF  =  TX1IF,
	INTR_TX2IF  =  TX2IF,
	INTR_ERRIF  =  ERRIF,
	INTR_WAKIF  =  WAKIF,
	INTR_MERRF  =  MERRF,

} INTERRUPT_TYPE;

typedef enum 
{
    ERRIF_NONE	 =  0,
    ERRIF_EWARN  =  EWARN,
	ERRIF_RXWAR  =  RXWAR,
	ERRIF_TXWAR  =  TXWAR,
	ERRIF_RXEP   =  RXEP,
	ERRIF_TXEP   =  TXEP,
	ERRIF_TXB0   =  TXB0,
	ERRIF_RX0OVR =  RX0OVR,
	ERRIF_RX1OVR =  RX1OVR,

} ERRIF_TYPE;

#ifdef __cplusplus
}	
#endif

void t_cmd(U8 cmd);
void bit_cmd(U8 add, U8 mask, U8 data);
void w_cmd0(U8 add, U8 data);
void w_cmd(U8 add, U8* data, U8 d_long);
void r_cmd(U8 add, U8* data, U8 d_long);

void CAN_SetBaudRate(U8 cnf1, U8 cnf2, U8 cnf3);
void CAN_SetWordMode(U8 workmode);
void CAN_State(U8* data);
void CAN_Init(void);
void CAN_Reset(void);
U32  CAN_Send(U8* data, U32 datalength);
//U32  CAN_Rece(U8 index);

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -