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

📄 can20b.h

📁 vxworks 下 扩展模式的can驱动以及测试代码
💻 H
字号:
#ifndef _L_INCLUDE_CANDEF_H
#define _L_INCLUDE_CANDEF_H


#include "vxworks.h"
#include "intLib.h"
#include "arch/i86/ivI86.h"
#include "msgQLib.h"

#define PeliCANMode	1

/* CAN driver work mode, 0:polling, 1:interrup */
#define IRQ_POLLING   0
#define IRQ_INTERRUPT 1

/* CAN channel define */
#define CAN0 0
#define CAN1 1

#define BASE_ADDR 0xda00  /* base dpram address */

#define CAN0_INT_NUMBER   7
#define CAN1_INT_NUMBER   15

#define DIST_CAN	0x200		/*CAN控制器的寄存器地址间隔*/

/* 数据帧最大长度*/
#define MAX_MSG_LENGTH 13

/* 消息队列深度 */
#define MAX_MSGS 100

typedef unsigned char BYTE;
typedef unsigned long U32;
typedef unsigned short U16;

typedef struct {
	int sff;	/*帧格式:1,标准帧;0,扩展帧*/
	BYTE id[4];	/*标识符*/
	int rtr;	/*远程传输请求:1,远程帧;0,数据帧*/
	int dlen;	/*数据长度,不能超过8*/
	BYTE data[8];	/*数据*/
}CANMSG;/*消息结构*/

typedef union {
	U32 id;
	BYTE idc[4];
}ZV_ID;

typedef struct {
	int filter_num;	/*屏蔽接收码数:0,无屏蔽;1,一个;2,双屏蔽*/
	BYTE acc_code[4];/*接收码*/
	BYTE acc_mask[4];/*屏蔽码*/
	BYTE bt0;	/*位时序定义字节0*/
	BYTE bt1;	/*位时序定义字节1*/
	BYTE irq;	/* 中断号 */
	BYTE mode;	/* 工作模式, 0:查询,1:中断 */
}CANCFG;/*配置结构*/

/*模式和控制寄存器的地址和位定义*/
#define ModeControlReg 0
#define RM_RR_Bit 0x01 /*复位模式请求位*/
#ifdef  PeliCANMode
#define LOM_Bit 0x02 /*仅听模式位*/
#define STM_Bit 0x04 /*自我测试模式位*/
#define AFM_Bit 0x08 /*验收滤波器模式位*/
#define SM_Bit 0x10 /*进入休眠模式位*/
#endif
/*中断使能和控制寄存器的地址和位定义*/
#ifdef PeliCANMode
#define InterruptEnReg 4 /* PeliCAN 模式*/
#define RIE_Bit 0x01 /*接收中断使能位*/
#define TIE_Bit 0x02 /*发送中断使能位*/
#define EIE_Bit 0x04 /*错误警告中断使能位*/
#define DOIE_Bit 0x08 /*数据超载中断使能位*/
#define WUIE_Bit 0x10 /*唤醒中断使能位*/
#define EPIE_Bit 0x20 /*错误隐性中断使能位*/
#define ALIE_Bit 0x40 /*仲裁丢失中断使能位*/
#define BEIE_Bit 0x80 /*总线错误中断使能位*/
#else /*BasicCAN 模式*/
#define InterruptEnReg 0 /* 控制寄存器*/
#define RIE_Bit 0x02 /*接收中断使能位*/
#define TIE_Bit 0x04 /*发送中断使能位*/
#define EIE_Bit 0x08 /*错误中断使能位*/
#define DOIE_Bit 0x10 /*超载中断使能位*/
#endif
/*命令寄存器的地址和位定义*/
#define CommandReg 1
#define TR_Bit 0x01 /*发送请求位*/
#define AT_Bit 0x02 /*中止发送位*/
#define RRB_Bit 0x04 /*释放接收缓冲器位*/
#define CDO_Bit 0x08 /*清除数据超载位*/
#if defined (PeliCANMode)
#define SRR_Bit 0x10 /*自身接收请求位*/
#else /*BasicCAN 模式*/
#define GTS_Bit 0x10 /*进入睡眠模式位*/
#endif
/*状态寄存器的地址和位定义*/
#define StatusReg 2 
#define RBS_Bit 0x01 /*接收缓冲器状态位*/
#define DOS_Bit 0x02 /*数据超载状态位*/
#define TBS_Bit 0x04 /*发送缓冲器状态位*/
#define TCS_Bit 0x08 /*发送完成状态位*/
#define RS_Bit 0x10 /*接收状态位*/
#define TS_Bit 0x20 /*发送状态位*/
#define ES_Bit 0x40 /*错误状态位*/
#define BS_Bit 0x80 /*总线状态位*/
/*中断寄存器的地址和位定义*/
#define InterruptReg 3
#define RI_Bit 0x01 /*接收中断位*/
#define TI_Bit 0x02 /*发送中断位*/
#define EI_Bit 0x04 /*错误警告中断位*/
#define DOI_Bit 0x08 /*数据超载中断位*/
#define WUI_Bit 0x10 /*唤醒中断位*/
#if defined (PeliCANMode)
#define EPI_Bit 0x20 /*错误被动中断位*/
#define ALI_Bit 0x40 /*仲裁丢失中断位*/
#define BEI_Bit 0x80 /*总线错误中断位*/
#endif
/*总线定时寄存器的地址和位定义*/
#define BusTiming0Reg 6
#define BusTiming1Reg 7
#define SAM_Bit 0x80 
/*采样模式位
1 总线被采样三次
0 总线被采样一次*/
/*输出控制寄存器的地址和位定义*/
#define OutControlReg 8
/*OCMODE1 OCMODE0 */
#define BiPhaseMode 0x00 /*双相输出模式*/
#define NormalMode 0x02 /*正常输出模式*/
#define ClkOutMode 0x03 /*时钟输出模式*/
/*TX1 的输出管脚配置*/
#define OCPOL1_Bit 0x20 /*输出极性控制位*/
#define Tx1Float 0x00 /*配置为悬空*/
#define Tx1PullDn 0x40 /*配置为下拉*/
#define Tx1PullUp 0x80 /*配置为上拉*/
#define Tx1PshPull 0Xc0 /*配置为推挽*/
/*TX0 的输出管脚配置*/
#define OCPOL0_Bit 0x04 /*输出极性控制位*/
#define Tx0Float 0x00 /*配置为悬空*/
#define Tx0PullDn 0x08 /*配置为下拉*/
#define Tx0PullUp 0x10 /*配置为上拉*/
#define Tx0PshPull 0X18 /*配置为推挽*/
/*验收代码和屏蔽寄存器的地址定义*/
#ifdef  PeliCANMode
#define AcceptCode0Reg 16
#define AcceptCode1Reg 17
#define AcceptCode2Reg 18
#define AcceptCode3Reg 19
#define AcceptMask0Reg 20
#define AcceptMask1Reg 21
#define AcceptMask2Reg 22
#define AcceptMask3Reg 23
#else /*BasicCAN 模式*/
#define AcceptCodeReg 4
#define AcceptMaskReg 5
#endif
/*Rx-缓冲器的地址定义*/
#ifdef PeliCANMode
#define RxFrameInfo 16
#define RxBuffer1 17
#define RxBuffer2 18
#define RxBuffer3 19
#define RxBuffer4 20
#define RxBuffer5 21
#define RxBuffer6 22
#define RxBuffer7 23
#define RxBuffer8 24
#define RxBuffer9 25
#define RxBuffer10 26
#define RxBuffer11 27
#define RxBuffer12 28
#else /*BasicCAN 模式*/
#define RxBuffer1 20
#define RxBuffer2 21
#define RxBuffer3 22
#define RxBuffer4 23
#define RxBuffer5 24
#define RxBuffer6 25
#define RxBuffer7 26
#define RxBuffer8 27
#define RxBuffer9 28
#define RxBuffer10 29
#endif
/*Tx 缓冲器的地址定义*/
#ifdef PeliCANMode
/*仅写地址*/
#define TxFrameInfo 16
#define TxBuffer1 17
#define TxBuffer2 18
#define TxBuffer3 19
#define TxBuffer4 20
#define TxBuffer5 21
#define TxBuffer6 22
#define TxBuffer7 23
#define TxBuffer8 24
#define TxBuffer9 25
#define TxBuffer10 26
#define TxBuffer11 27
#define TxBuffer12 28
/*仅读地址*/
#define TxFramInFoRd 96
#define TxBufferRd1 97
#define TxBufferRd2 98
#define TxBufferRd3 99
#define TxBufferRd4 100
#define TxBufferRd5 101
#define TxBufferRd6 102
#define TxBufferRd7 103
#define TxBufferRd8 104
#define TxBufferRd9 105
#define TxBufferRd10 106
#define TxBufferRd11 107
#define TxBufferRd12 108
#else /*BasicCAN 模式*/
#define TxBuffer1 10
#define TxBuffer2 11
#define TxBuffer3 12
#define TxBuffer4 13
#define TxBuffer5 14
#define TxBuffer6 15
#define TxBuffer7 16
#define TxBuffer8 17
#define TxBuffer9 18
#define TxBuffer10 19
#endif
/*其他寄存器的地址定义*/
#if defined (PeliCANMode)
#define ArbLostCapReg 11
#define ErrCodeCapReg 12
#define ErrWarnLimitReg 13
#define RxErrCountReg 14
#define TxErrCountReg 15
#define RxMsgCountReg 29
#define RxBufstartAdr 30

#define FRAME_EFF	0x80
#define FRAME_RTR	0x40
#define FRAME_DLEN	0x0F

#endif
/*时钟分频寄存器的地址和位定义*/
#define ClockDivideReg 31
#define DivBy1 0x07 /*CLKOUT=振荡器频率*/
#define DivBy2 0x00 /*CLKOUT=1/2 振荡器频率*/
#define CLKOff_Bit 0x08 /*时钟关闭位时钟输出管脚控制位*/
#define RXINTEN_Bit 0x20 /*用于接收中断的管脚TX1 */
#define CBP_Bit 0x40 /*CAN 比较器旁路控制位*/
#define CANMode_Bit 0x80 /*CAN 模式控制位*/

#define PrescExample 	0x02 	
#define SJWExample 		0xC0 	
#define TSEG1Example 	0x0A 	
#define TSEG2Example 	0x30 	

#define Presc_MB_24 	0x00 	
#define SJW_MB_24 		0x00 	
#define TSEG1_MB_24 	0x08 	
#define TSEG2_MB_24 	0x10 	

#define Presc_kB_24 	0x07 	
#define SJW_kB_24 		0xC0 	
#define TSEG1_kB_24 	0x09 	
#define TSEG2_kB_24 	0x30 	

#define Presc_MB_16 	0x00 	
#define SJW_MB_16 		0x00 	
#define TSEG1_MB_16 	0x04 	
#define TSEG2_MB_16 	0x10 	

#define Presc_kB_16 	0x04 	
#define SJW_kB_16 		0xC0 	
#define TSEG1_kB_16 	0x0A 	
#define TSEG2_kB_16 	0x30 	

#define SJW_500k_16		0x00
#define Presc_500k_16	0x01
#define TSEG1_500k_16 	0x04 	
#define TSEG2_500k_16 	0x10 
/* 使用的常量定义------------------------------------------------------------
------------------------------------- */
#define YES 1
#define NO 0
#define ENABLE 1
#define DISABLE 0
#define ENABLE_N 0
#define DISABLE_N 1
#define INTLEVELACT 0
#define INTEDGEACT 1
#define PRIORITY_LOW 0
#define PRIORITY_HIGH 1
/*寄存器内容默认复位值清除寄存器*/
#define ClrByte 0x00
/*常量清除中断使能寄存器*/
#if defined (PeliCANMode)
#define ClrIntEnSJA ClrByte
#else
#define ClrIntEnSJA ClrByte RM_RR_Bit /*保留复位请求*/
#endif
/*验收代码和屏蔽寄存器的定义*/
#define DontCare 0xFF

/* 函数返回值定义*/
#define SUCCESS 1
#define FAILURE 0
/*ioctl cmd_code*/
#define CAN_INIT 0x02

/*从指定的CAN控制器接收消息包
	port:CAN控制器--0,控制器0;1,控制器1
	msg_ptr:指向消息结构变量,返回消息
返回值:1,成功;0,无消息
*/


/*由指定的CAN控制器发送消息包
	port:CAN控制器--0,控制器0;1,控制器1
	msg:要发送的消息
返回值:1,成功;0,失败
*/


/*启动CAN的正常运行
	port:CAN控制器--0,控制器0;1,控制器1
*/


/*设置控制器的屏蔽接收码和传输速率
	port:CAN控制器--0,控制器0;1,控制器1
	cfg:配置结构
返回值:1,成功;0,失败
*/


/*对板子的运行进行系统配置
	seg:板子的寄存器段设置
	irq0:控制器0的irq号
	irq1:控制器1的irq号
返回值:1,成功;0,失败
*/


/*停止控制器的运行
返回值:1,成功;0,失败
*/


/*查询控制器的发送状态
	port:CAN控制器--0,控制器0;1,控制器1
返回值:1,发送空闲;0,发送正忙,即有未发送的消息
*/


/*设置发送方式
	mode:发送方式--0,正常方式(缺省),自动重传;1,无重传方式
*/


/*错误状态:
	0: no error
	0x10: seg_addr set error
	0x12: irq_no set error
	0x20: port 1 bus off
	0x21: port 2 bus off
	0x22: port 1 bus error 
	0x23: port 2 bus error
	0x30: port 1 receiving buffer full 
	0x31: port 2 receiving buffer full 
*/
/* canReset ,CAN 总线复位
	输入:port,CAN控制器--0,控制器0;1,控制器1
	返回值:无
*/



#endif  /* #ifdef _L_INCLUDE_CANDEF_H  */

⌨️ 快捷键说明

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