📄 18f_can.c
字号:
//*******************************************************************
//CAN通讯子程序,2006-9-23调试
//2007-3-13改:作为接收板
//*******************************************************************
#include "p18f6585.h"
void can_isr(void);
void initcan(void);
int CAN_FLAG,cnt;
void initcan(void)
{
TRISB=(TRISB|0X08)&0XFB;//设置RB3为输入,RB2为输出
//*******************************************************************
//进入配置模式配置各寄存器
ECANCON=0;
CANCON =0x80; //请求进入CAN配置模式
while(CANSTAT&0X80==0){;}//等待进入CAN模式
BRGCON1 =0x01;
BRGCON2 =0x90;
BRGCON3 =0x42;
TXB0CON =0x03; //发送优先级为最高
TXB0SIDH=0XFF; //配置为11位标识码
TXB0SIDL=0xE0;
TXB0DLC =0x02; //数据长度为8字节
//等待发送的8个字节数据
TXB0D0 =0x84;
TXB0D1 =0x03;
RXB0CON =0x20; //只接收有效的标准标识符信息
RXB0SIDH=0XFF; //设置接收缓存器0的标识符
RXB0SIDL=0X60;
RXB0DLC =0x02; //接收数据长度为8字节
//初始化接收寄存器
RXB0D0 =0x00;
RXB0D1 =0x00;
RXF0SIDH=0XFF;
RXF0SIDL=0x60;
RXM0SIDH=0xff;
RXM0SIDL=0xe0;
//*********************************************************************
//使CAN进入某种模式
CANCON =0x00;//CAN正常工作模式
while(CANSTAT&0xe0!=0){;}
PIR3 =0x00;
PIE3 =0x01;
IPR3 =0x01;
}
//接收中断程序
#pragma code low_ISR=0x18
void low_ISR(void)
{
_asm
goto can_isr
_endasm
}
#pragma code
#pragma interrupt can_isr
void can_isr(void)
{
if(PIR3bits.RXB0IF==1) //有接收中断产生
cnt++;
if(cnt==1000)cnt=0;
if(cnt<500){PORTAbits.RA4=0;}
else PORTAbits.RA4=1;
CAN_FLAG=1; //接收完成标志置1
PIR3bits.RXB0IF=0; //清接收标志
RXB0CONbits.RXFUL=0; //接收满标志清零
}
//主程序
void main (void)
{
PORTA=0;
LATA=0;
ADCON1=0X0F;
TRISA=0x00;
PORTAbits.RA4=0;
INTCON=0x00;//禁止所有中断
cnt=0;
initcan();//初始化can口
WDTCON=0;//禁止看门狗
INTCON=0xc0;//使能中断
while(1)
{
TXB0CONbits.TXREQ=1;//请求发送
while(PIR3bits.TXB0IF!=1){;}//等待发送完成
TXB0CONbits.TXREQ=0;//禁止发送
// while(CAN_FLAG==0){;}//等待接收数据
// CAN_FLAG=0;//清除接收完成标志
/*
TXB0D0=RXB0D0;
TXB0D1=RXB0D1;
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -