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

📄 can.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
//#include <conio.h>
#include "can.h"
//#include "rs232.h"
//extern PORT *com2;

#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif

#define BUFFSIZE			80

#define CANComIntr			0x000d		//CAN板串口Interrupt Number
#define CANCanIntr			0x000c		//CAN板CAN口Interrupt Number
#define CANComEoi			0x000d
#define CANCanEoi			0x000c

#define IntEoiReg			0xFF22		//end of interrupt register
#define IntMaskReg			0xFF28		//interrupt mask register

#define Int0Enable			0xFFDF		//IRQ4 for COMM
#define Int1Enable			0xFFEF		//IRQ5 for CAN
#define Int0Disable			0x0020		//IRQ4 for COMM
#define Int1Disable			0x0010		//IRQ5 for CAN
#define Int0CtrlReg			0xFF3a		//IRQ4 for COMM
#define Int1CtrlReg			0xFF38		//IRQ5 for CAN
#define Int0NumEoi			0x000D		//IRQ4 for COMM
#define Int1NumEoi			0x000C		//IRQ5 for CAN
#define Int0PriInit			0x0004		//IRQ4 for COMM
#define Int1PriInit			0x0003		//IRQ5 for CAN

#define AMDTimer0CntReg		0xFF50		//AMDTimer0 Count Register
#define AMDTimer2CntReg		0xFF60		//AMDTimer2 Count Register
#define AMDTimer0CmpRegA	0xFF52		//Timer0 Compare Register A
#define AMDTimer2CmpRegA	0xFF62		//Timer2 Compare Register A

#define ComBBase			0x200
#define ComABase			0x208
#define Can1PortBase		0x300
#define Can2PortBase		0x302
#define Can3PortBase		0x304

#define CanModeCtrlReg		0x00
#define RM_Bit				0x01
#define LOM_Bit				0x02
#define STM_Bit				0x04
#define AFM_Bit				0x08
#define SM_Bit				0x10

#define CanCmdReg			0x01
#define TR_Bit				0x01
#define AT_Bit				0x02
#define RRB_Bit				0x04
#define CDO_Bit				0x08
#define SRR_Bit				0x10

#define CanStusReg			0x02
#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 CanIntrReg			0x03
#define RI_Bit				0x01
#define TI_Bit				0x02
#define EI_Bit				0x04
#define DOI_Bit				0x08
#define WUI_Bit				0x10
#define EPI_Bit				0x20
#define ALI_Bit				0x40
#define BEI_Bit				0x80

#define CanIntrEnbReg		0x04
#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

#define CanBusTime0Reg		0x06
#define SJW_KB_16			0xc0	//SJW
#define Presc_KB_16			0x00	//baudrate prescaler:1  8MHz
#define CanBusTime1Reg		0x07
#define TSEG1_KB_16			0x0a	//TSEG1 :11
#define TSEG2_KB_16			0x30	//TESG2 :4    8/(11+4+1)=500kbit/s

#define CanOutCtrlReg		0x08
#define BiPhaseMode			0x00
#define NormalMode			0x02
#define ClkOutMode			0x03
#define OCPOL1_Bit			0x20
#define Tx1Float			0x00
#define Tx1PullDn			0x40
#define Tx1PullUp			0x80
#define Tx1PshPull			0xc0
#define OCPOL0_Bit			0x04
#define Tx0Float			0x00
#define Tx0PullDn			0x08
#define Tx0PullUp			0x10
#define Tx0PshPull			0x18

#define CanArbLostCapReg	0x0b
#define CanErrCodeCapReg	0x0c
#define CanErrLimtReg		0x0d
#define CanRxErrCountReg	0x0e
#define CanTxErrCountReg	0x0f

#define CanAcceptCode0		0x10
#define CanAcceptCode1		0x11
#define CanAcceptCode2		0x12
#define CanAcceptCode3		0x13
#define CanAcceptMask0		0x14
#define CanAcceptMask1		0x15
#define CanAcceptMask2		0x16
#define CanAcceptMask3		0x17

#define CanClkDivReg		0x1f
#define DivBy1				0x07
#define DivBy2				0x00
#define ClkOff_Bit			0x08
#define RXINTEN_Bit			0x20
#define CBP_Bit				0x40
#define CANMode_Bit			0x80

extern unsigned int timer;
extern int GetPass(unsigned int early,unsigned int late);
extern void DebugData(int cmd,int id,int len,unsigned char *data);
extern void G2000_ShowJob(int cmd);

CAN_TYPE *can[2]={NULL,NULL};
static void interrupt Can_int(__CPPARGS)
{
	int i;
	//unsigned char c;
	unsigned char zhenhao;
	unsigned char canid;
	unsigned char status,dlc;
	unsigned char Rx_id2,Rx_id1;
	unsigned char CanIntrStus[2];
	unsigned int inttimer,fstimer;
	for(i=0;i<2;i++)
	{
		if(NULL==can[i])
			continue;
		outportb(can[i]->can_base,CanIntrReg);
		CanIntrStus[i]=inportb(can[i]->can_base+1);	//读中断状态寄存器
	}
	inttimer=timer;
	while(CanIntrStus[0] || CanIntrStus[1])
	{
		if(GetPass(inttimer,timer)>15)
			break;
		for(canid=0;canid<2;canid++)
		{
			if(NULL==can[canid])
				continue;
			if(CanIntrStus[canid])
			{
				
				if(CanIntrStus[canid] & TI_Bit)	//发送中断
				{
					/*if((can[canid]->out.read_index+1)<can[canid]->out.write_index)
					{
						//printf("ddd");
						outportb(can[canid]->can_base,CanStusReg);
						fstimer=timer;
						while((inportb(can[canid]->can_base+1) & TBS_Bit) != TBS_Bit)//;//发送缓冲区空?
						{
							outportb(can[canid]->can_base,CanStusReg);
							if(GetPass(fstimer,timer)>10)
								continue;
						}
						outportb(can[canid]->can_base,16);
						outportb(can[canid]->can_base+1,0x08);
						outportb(can[canid]->can_base,17);
						i=can[canid]->out.pri[can[canid]->out.read_index/8];
						outportb(can[canid]->can_base+1,i&0xff);	//对方站号(优先级)
						outportb(can[canid]->can_base,18);
						i=can[canid]->out.zhenhao[can[canid]->out.read_index/8];
						outportb(can[canid]->can_base+1,(i<<5)&0xe0);
						for(i=0;i<8;i++)
						{
							outportb(can[canid]->can_base,19+i);
							outportb(can[canid]->can_base+1,can[canid]->out.buffer[can[canid]->out.read_index++]);
						}
						outportb(can[canid]->can_base,CanStusReg);//,0x02
						fstimer=timer;
						while((inportb(can[canid]->can_base+1) & TS_Bit) != 0)//;//&0x20 !=0x00
						{
							if(GetPass(fstimer,timer)>10)
								continue;
							outportb(can[canid]->can_base,CanStusReg);
						}
						outportb(can[canid]->can_base,CanCmdReg);//,0x01
						outportb(can[canid]->can_base+1,TR_Bit);//,0x01
						can[canid]->can_snd_timer=timer;
					}
					else*/
					{
						//can[canid]->out.read_index=0;
						//can[canid]->out.write_index=0;
						outportb(can[canid]->can_base,CanIntrEnbReg);
						outportb(can[canid]->can_base+1,RIE_Bit);
					}
				}
				else if(CanIntrStus[canid] & RI_Bit)	//接收中断
				{
					outportb(can[canid]->can_base,CanStusReg);
					status=inportb(can[canid]->can_base+1);
					if((status & RBS_Bit) == RBS_Bit)
					{
						can[canid]->can_rcv_timer=timer;
						outportb(can[canid]->can_base,16);
						dlc=0x0f&inportb(can[canid]->can_base+1);
						outportb(can[canid]->can_base,17);
						Rx_id1=inportb(can[canid]->can_base+1);
						outportb(can[canid]->can_base,18);
						Rx_id2=inportb(can[canid]->can_base+1);
						zhenhao=(Rx_id2>>5)&0x07;
						if(dlc>8)
							dlc=8;
						if(Rx_id1!=0x63 && Rx_id1!=0x64 && Rx_id1!=0x20)
						{
							for(i=0;i<dlc;i++)
							{
								outportb(can[canid]->can_base,19+i);
								inportb(can[canid]->can_base+1);
							}
						}
						else
						{
							i=can[canid]->in.write_index/8;
							if(i>7)
								i=7;
							can[canid]->in.zhenhao[i]=zhenhao;
							can[canid]->in.pri[i]=Rx_id1;
							//printf("%d ",dlc);
							for(i=0;i<8;i++)
							{
								if(i<dlc)
								{
									outportb(can[canid]->can_base,19+i);
									can[canid]->in.buffer[can[canid]->in.write_index++]=inportb(can[canid]->can_base+1);
								}
								else
								{
									can[canid]->in.buffer[can[canid]->in.write_index++]=0;
								}
								if(can[canid]->in.write_index>=BUFFSIZE)
								{
									can[canid]->in.write_index=0;
								}
							}
						}
						/*for(i=0;i<8;i++)
						{
							if(i<dlc)
								can[canid]->in.buffer[can[canid]->in.write_index]=inportb(can[canid]->can_base+19+i);
							else
								can[canid]->in.buffer[can[canid]->in.write_index]=0;
							can[canid]->in.write_index++;
							if(can[canid]->in.write_index>=BUFFSIZE)
							{
								can[canid]->in.write_index=0;
							}
						}*/
						//if(can[canid]->in.buffer[0]==2 && can[0]->in.zhenhao[0]==3 && 0==canid)
						//	G2000_ShowJob(2);
						//can1_zhenhao++;
						outportb(can[canid]->can_base,CanCmdReg);
						outportb(can[canid]->can_base+1,RRB_Bit);//0x04释放接收缓冲区
					}
				}
				else if(CanIntrStus[canid]&DOI_Bit)	//溢出中断
				{
					;
				}
				else
				{
					;//outportb(Can1PortBase,CanCmdReg);
					//outportb(Can1PortBase+1,RRB_Bit);

⌨️ 快捷键说明

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