?? can.c
字號(hào):
#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 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); //讀中斷狀態(tài)寄存器
}
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) //發(fā)送中斷
{
/*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)//;//發(fā)送緩沖區(qū)空?
{
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); //對(duì)方站號(hào)(優(yōu)先級(jí))
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釋放接收緩沖區(qū)
}
}
else if(CanIntrStus[canid]&DOI_Bit) //溢出中斷
{
;
}
else
{
;//outportb(Can1PortBase,CanCmdReg);
//outportb(Can1PortBase+1,RRB_Bit);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -