|
// ========CAN通信程序=======
#i nclude <pic.h> #i nclude <pic16f87x.h> #i nclude <mcp2510.h> // =========常数和变量定义========= #define READ 0x03 #define WRITE 0x02 #define RESET 0xC0 #define RTS 0x80 #define STA2510 0xA0 #define BITMOD 0x05 int a[12]; int b[8]; int c[8]; int i; int count; int count1=0; int RecID_H=0; int RecID_L=0; int DLC=8; void SPIINT(); void TMR1INT(); void CCP1INT(); void SPIEXCHANGE(int count); void WAIT_SPI(); void RESET2510(); int RD2510(int adress,int n); void WR2510(int adress,int n); void RTS2510(int RTSn); int GETS2510(); void BM2510(int adress,int mask,int data); void SETNORMAL(); void TXCOMPLETE(int adress); void TXMSG(int DLC); int RXMSG(); void INIT2510(); void INIT877(); void INITSPI(); void ACK(); void wait(); // ========主程序======= main(void) { int l,detect=0; SSPIE=1; TMR1IE=1; CCP1IE=1; CCP2IE=1; PEIE=1; ei(); INIT877(); INITSPI(); INIT2510(); flag1=0; flag2=0; CCP1CON=0x05; CCP2CON=0x04; while(1) { RXMSG(); TXMSG(8); } } // ========中断服务程序======= void SPIINT() { SSPIF=0; a[i++]=SSPBUF; count-=1; if(count>0) SSPBUF=a[i]; else RE2=1; return; } void TMR1INT() { TMR1IF=0; T1CON=0; if(!flag1){ TMR1H=0xfe; TMR1L=0x00; T1CON=0x01; PORTD=0xff; flag1=1; } else { flag1=0; PORTD=0; T1CON=0; } return; } void CCP1INT() { CCP1IF=0; T1CON=0x01; return; } void CCP2INT() { CCP2IF=0; T1CON=0x01; return; } void interrupt INTS() { di(); if(TMR1IF) TMR1INT(); else if(CCP1IF) CCP1INT(); else if(CCP2IF) CCP2INT(); else if(SSPIF) SPIINT(); ei(); } // ========子程序======= void SPIEXCHANGE(count) int count; { if(count>0) { i=0; RE2=0; SSPBUF=a[i]; } else ; return; } void WAIT_SPI() { do{ ; }while(count>0); return; } void RESET2510() { a[0]=RESET; count=1; SPIEXCHANGE(count); WAIT_SPI(); return; } int RD2510(adress,n) int adress; int n; { int j; a[0]=READ; a[1]=adress; for(j=0;j<n;j++) a[j+2]=0; count=n+2; SPIEXCHANGE(count); WAIT_SPI(); for(j=0;j<n;j++) b[j]=a[j+2]; return; } void WR2510(adress,n) int adress; int n; { int j; a[0]=WRITE; a[1]=adress; for(j=0;j<n;j++) a[j+2]=b[j]; count=n+2; SPIEXCHANGE(count); WAIT_SPI(); return; } void RTS2510(RTSn) int RTSn; { a[0]=RTS^RTSn; count=1; SPIEXCHANGE(count); WAIT_SPI(); return; } int GETS2510() { a[0]=STA2510; a[1]=0; count=2; SPIEXCHANGE(count); WAIT_SPI(); b[0]=a[1]; return; } void BM2510(adress,mask,data) int adress; int mask; int data; { a[0]=BITMOD; a[1]=adress; a[2]=mask; a[3]=data; count=4; SPIEXCHANGE(count); WAIT_SPI(); return; } void SETNORMAL() { int k=1; BM2510(CANCTRL,0xe0,0x00); do { RD2510(CANSTAT,1); k=b[0]&0xe0; }while(k); return; } void INIT2510() { RESET2510(); b[0]=0x02; b[1]=0x90; b[2]=0x07; WR2510(CNF3,3); b[0]=0x00; b[1]=0x00; WR2510(RXM0SIDH,2); b[0]=0x00; b[1]=0x00; WR2510(RXF0SIDH,2); b[0]=0x00; WR2510(CANINTE,1); SETNORMAL(); return; } void TXCOMPLETE(adress) int adress; { int k=1; do { RD2510(adress,1); k=b[0]&0x08; }while(k); return; } void INIT877() { PORTA=0; PORTB=0; PORTC=0; PORTD=0; PORTE=0; TRISA=0xff; TRISB=0xfd; TRISC=0xd7; TRISD=0; TRISE=0x03; PORTA=0xff; PORTB=0x03; PORTC=0; PORTD=0xff; PORTE=0x04; return; } void INITSPI() { SSPCON=0x11; SSPEN=1; SSPSTAT=0; return; } void TXMSG(int DLC) { for(i=0;i<DLC;i++) b[i]=c[i]; WR2510(TXB0D0,DLC); b[0]=DLC; WR2510(TXB0DLC,1); b[0]=0x03; b[1]=RecID_H; b[2]=RecID_L; WR2510(TXB0CTRL,3); RTS2510(0x01); TXCOMPLETE(TXB0CTRL); return; } int RXMSG() { int k; RD2510(CANINTF,1); k=b[0]&0x01; if(k==1) { BM2510(CANINTF,0x01,0x00); RD2510(RXB0SIDH,2); RecID_H=b[0]; RecID_L=b[1]&0xe0; RD2510(RXB0DLC,1); DLC=b[0]&0x0f; RD2510(RXB0D0,DLC); for(i=0;i<DLC;i++) c[i]=b[i]; return 1; } return 0; } |