//该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式//发送采用查询方式#includep18f458.hintCAN_FLAG;//定义标志寄存器//**************初始化子程序***************voidinitcan(){TRISB=(TRISB|0X08)&0XFB;//设置CANRX/RB3为输入,CANTX/RB2为输出//设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h//则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。//NOMINALBITRATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog_Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQCANCON=0X80;//请求进入CAN配置模式REQOP=100while(CANSTAT&0X80==0){;}//等待进入CAN配置模式OPMODE=100BRGCON1=0X01;//设置SJW和BRP,SJW=1TQ,BRP=01HBRGCON2=0X90;//设置Phase_Seg1=3TQ和Prog_Seg=1TQBRGCON3=0X42;//设置Phase_Seg2=3TQ//设置发送邮箱0标识符号和发送的数据TXB0CON=0X03;//发送优先级为最高优先级,TXPRI=11TXB0SIDH=0XFF;//设置发送缓冲器0的标准标识符,本程序采用标准识符TXB0SIDL=0XE0;TXB0DLC=0X08;//设置数据长度为8个字节TXB0D0=0X00;//写发送缓冲器数据区的数据TXB0D1=0X01;TXB0D2=0X02;TXB0D3=0X03;TXB0D4=0X04;TXB0D5=0X05;TXB0D6=0X06;TXB0D7=0X07;//设置接收邮箱0的标识符和初始化数据RXB0SIDH=0XFF;//设置接收缓冲器0的标识符RXB0SIDL=0XE0;RXB0CON=0X20;//仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0RXB0DLC=0X08;//设置接收缓冲器0的数据区长度RXB0D0=0X00;//初始化接收缓冲器0的数据区数据RXB0D1=0X00;RXB0D2=0X00;RXB0D3=0X00;RXB0D4=0X00;RXB0D5=0X00;RXB0D6=0X00;RXB0D7=0X00;//初始化接收滤波器0和接收屏蔽,RXF0SIDH=0XFF;RXF0SIDL=0XE0;RXM0SIDH=0X00;RXM0SIDL=0X00;//初始化CAN模块的I/O控制寄存器//CIOCON=0X00;//使CAN进入某种工作模式模式CANCON=0X00;//=0X40,进入自测试模式;=0x00,正常操作模式while(CANSTAT&0XE0!=0){;}//while(CANSTAT&0X40==0){;}//初始化CAN的中断PIR3=0X00;//清所有中断标志PIE3=0X01;//使能接收缓冲器0的接收中断IPR3=0X01;//接收缓冲器0的接收中断为最高优先级}//*********接收缓冲器0接收中断服务程序***********#pragmainterruptcan_isr#pragmacodelow_ISR=0x18voidlow_ISR(){_asmgotocan_isr_endasm}#pragmacodevoidcan_isr(){if(PIR3bits.RXB0IF==1)CAN_FLAG=1;PIR3bits.RXB0IF=0;//清接收中断标志RXB0CONbits.RXFUL=0;//打开接收缓冲器来接收新信息}//****************主程序******************main(){INTCON=0x00;//禁止所有中断initcan();WDTCON=0;//=1,看门狗使能;=0,禁止看门狗INTCON=0xc0;//使能中断while(1){TXB0CONbits.TXREQ=1;//请求发送,TXREQ=1while(PIR3bits.TXB0IF!=1){;}//等待发送完成while(CAN_FLAG==0){;}//等待接收数据CAN_FLAG=0;//清接收到标志TXB0CONbits.TXREQ=0;//禁止发送TXB0D0=RXB0D0+1;//用接收数据加1来更新发送数据TXB0D1=RXB0D1+1;TXB0D2=RXB0D2+1;TXB0D3=RXB0D3+1;TXB0D4=RXB0D4+1;TXB0D5=RXB0D5+1;TXB0D6=RXB0D6+1;TXB0D7=RXB0D7+1;}}