小弟刚学单片机,为啥CAN回环模式用不了啊,一直进入不了中断,希望各位大牛帮帮忙啊······
时间:10-02
整理:3721RD
点击:
#include <xc.h>
char CAN_TX_Adress_H,CAN_TX_Adress_L; /* CAN 发送邮箱标识符高低字节 */
char CAN_RX_Adress_H,CAN_RX_Adress_L; /* CAN 接收邮箱标识符高低字节 */
int CAN_FLAG; /* =1收到CAN数据,=0未收到数据 */
void initial()
{
INTCON=0x00; /* bit7-bit0:关总中断 */
ADCON1=0X07; /* 设置数字输入输出口 */
PIE1=0; /* PIE1 的中断不使能 */
PIE2=0; /* PIE2 的中断不使能 */
PIE3=0; /* PIE3 的中断不使能 */
}
void initcan()
{
/* 设置发送缓冲区0标识符 :10011001010=0x04CA */
CAN_TX_Adress_L=0x55; //CAN低地址标识符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
CAN_TX_Adress_H=0x99; //CAN高地址标识符,应与发送方标识符相同
/* 设置接收缓冲区0标识符 :00110011111=0x019F */
CAN_RX_Adress_L=0x55; //CAN低地址标识符,应与发送方标识符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
CAN_RX_Adress_H=0x99; //CAN高地址标识符
/* ************设置对CAN进行配置*************** */
TRISB=(TRISB|0X08)&0XFB; /* 设置CANRX/RB3输入,CANTX/RB2输出 */
CANCON=0X80; /* CANCON,bit7-5:1XX请求配置 */
while((CANSTAT&0X80)==0) /* CAN状态寄存器。bit7-5:100配置方式 */
{
;
} /* 等待进入CAN配置模式OPMODE=100 */
/* ***********波特率设置 ************************** */
BRGCON1=0X01; /* Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
BRGCON2=0X90; /*bit7=1自由编程,bit6=0总线在采样点采样1
次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
BRGCON3=0X42; /* 设置Phase_Seg2(bit2-0)=3TQ */
/* 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
=(1+1+3+3)TQ=8TQ,位率=1/(8*1U)=0.125MHz */
TXB0CON=0X03; /* bit1-0:发送优先级,设置TXB0为最高优先级3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
TXB0SIDH=CAN_TX_Adress_H; /* 标准标识符的10-3位*/
TXB0DLC=0X08; /* 设置数据长度为8个字节 */
TXB0D0=0X00; /* 写发送缓冲器数据区数据初值 */
TXB0D1=0X01; /* 写发送缓冲器数据区数据初值 */
TXB0D2=0X02;
TXB0D3=0X03;
TXB0D4=0X04;
TXB0D5=0X05;
TXB0D6=0X06;
TXB0D7=0X07;
RXB0SIDL=CAN_RX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
RXB0SIDH=CAN_RX_Adress_H; /* 标准标识符的10-3位 */
RXB0CON=0X20; /* bit6-5=01只接收有效的标准标识符信息 */
RXB0DLC=0X08; /* 设置接收缓冲器0数据区长度8个字节 */
RXB0D0=0X02; /* 初始化接收缓冲器0的数据区数据 */
RXB0D1=0X03; /* 初始化接收缓冲器0的数据区数据 */
RXB0D2=0X04;
RXB0D3=0X05;
RXB0D4=0X00;
RXB0D5=0X00;
RXB0D6=0X00;
RXB0D7=0X00;
//接收过滤器
RXF0SIDH=CAN_RX_Adress_H;
RXF0SIDL=CAN_RX_Adress_L&0xe0; /*高3位为标识符低3位,低5位是配置 */
//接收屏蔽器
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;
//CANCON :CAN 控制寄存器
CANCON=0X40; //=0X40,进入回环模式;=0x00,正常操作模式
//CANSTAT :CAN 状态寄存器
while(CANSTAT&0X40==0)
// while((CANSTAT&0XE0)!=0) /* 检测CAN配置完成 */
{
;
}
PIR5=0X00; /* 清所有CAN中断标志 */
PIE5=PIE5|0X01; /* 使能接收缓冲器0的接收中断 */
IPR5=IPR5|0X01; /* 接收缓冲器0的接收中断为最高优先级 */
}
void interrupt HI_ISR()
{
if(RXB0IF==1)// 1 = CAN 接收缓冲区 0 已接收到新报文
{
CAN_FLAG=1; /* 置接收到 CAN 数据 */
RXB0IF=0; /* 清接收中断标志 */
RXB0FUL=0; /* bit7=0打开接收缓冲器接收新信息 */
}
}
//****************主程序******************
main()
{
initial(); /* 系统初始化子程序 */
initcan(); /* CAN设置初始化 */
IPEN=1; /* 使能中断高低优先级 */
INTCON=INTCON|0xc0; /* 开总中断、开外围接口中断 */
TXB0REQ=0; /* 关发送,TXB0REQ=0; */
while(1)
{
if(CAN_FLAG==1)
{
CAN_FLAG=0; /* 清接收到标志 */
TXB0CON=TXB0CON&0xf7; /* TXB0REQ=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;
TXB0CON=TXB0CON|0x08; /* bit3(TXREQ)=1请求发送 */
}
}
}
char CAN_TX_Adress_H,CAN_TX_Adress_L; /* CAN 发送邮箱标识符高低字节 */
char CAN_RX_Adress_H,CAN_RX_Adress_L; /* CAN 接收邮箱标识符高低字节 */
int CAN_FLAG; /* =1收到CAN数据,=0未收到数据 */
void initial()
{
INTCON=0x00; /* bit7-bit0:关总中断 */
ADCON1=0X07; /* 设置数字输入输出口 */
PIE1=0; /* PIE1 的中断不使能 */
PIE2=0; /* PIE2 的中断不使能 */
PIE3=0; /* PIE3 的中断不使能 */
}
void initcan()
{
/* 设置发送缓冲区0标识符 :10011001010=0x04CA */
CAN_TX_Adress_L=0x55; //CAN低地址标识符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
CAN_TX_Adress_H=0x99; //CAN高地址标识符,应与发送方标识符相同
/* 设置接收缓冲区0标识符 :00110011111=0x019F */
CAN_RX_Adress_L=0x55; //CAN低地址标识符,应与发送方标识符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
CAN_RX_Adress_H=0x99; //CAN高地址标识符
/* ************设置对CAN进行配置*************** */
TRISB=(TRISB|0X08)&0XFB; /* 设置CANRX/RB3输入,CANTX/RB2输出 */
CANCON=0X80; /* CANCON,bit7-5:1XX请求配置 */
while((CANSTAT&0X80)==0) /* CAN状态寄存器。bit7-5:100配置方式 */
{
;
} /* 等待进入CAN配置模式OPMODE=100 */
/* ***********波特率设置 ************************** */
BRGCON1=0X01; /* Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
BRGCON2=0X90; /*bit7=1自由编程,bit6=0总线在采样点采样1
次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
BRGCON3=0X42; /* 设置Phase_Seg2(bit2-0)=3TQ */
/* 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
=(1+1+3+3)TQ=8TQ,位率=1/(8*1U)=0.125MHz */
TXB0CON=0X03; /* bit1-0:发送优先级,设置TXB0为最高优先级3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
TXB0SIDH=CAN_TX_Adress_H; /* 标准标识符的10-3位*/
TXB0DLC=0X08; /* 设置数据长度为8个字节 */
TXB0D0=0X00; /* 写发送缓冲器数据区数据初值 */
TXB0D1=0X01; /* 写发送缓冲器数据区数据初值 */
TXB0D2=0X02;
TXB0D3=0X03;
TXB0D4=0X04;
TXB0D5=0X05;
TXB0D6=0X06;
TXB0D7=0X07;
RXB0SIDL=CAN_RX_Adress_L&0xe0; /*bit3=0标准标识符,bit7-5:标准标识符2-0位*/
RXB0SIDH=CAN_RX_Adress_H; /* 标准标识符的10-3位 */
RXB0CON=0X20; /* bit6-5=01只接收有效的标准标识符信息 */
RXB0DLC=0X08; /* 设置接收缓冲器0数据区长度8个字节 */
RXB0D0=0X02; /* 初始化接收缓冲器0的数据区数据 */
RXB0D1=0X03; /* 初始化接收缓冲器0的数据区数据 */
RXB0D2=0X04;
RXB0D3=0X05;
RXB0D4=0X00;
RXB0D5=0X00;
RXB0D6=0X00;
RXB0D7=0X00;
//接收过滤器
RXF0SIDH=CAN_RX_Adress_H;
RXF0SIDL=CAN_RX_Adress_L&0xe0; /*高3位为标识符低3位,低5位是配置 */
//接收屏蔽器
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;
//CANCON :CAN 控制寄存器
CANCON=0X40; //=0X40,进入回环模式;=0x00,正常操作模式
//CANSTAT :CAN 状态寄存器
while(CANSTAT&0X40==0)
// while((CANSTAT&0XE0)!=0) /* 检测CAN配置完成 */
{
;
}
PIR5=0X00; /* 清所有CAN中断标志 */
PIE5=PIE5|0X01; /* 使能接收缓冲器0的接收中断 */
IPR5=IPR5|0X01; /* 接收缓冲器0的接收中断为最高优先级 */
}
void interrupt HI_ISR()
{
if(RXB0IF==1)// 1 = CAN 接收缓冲区 0 已接收到新报文
{
CAN_FLAG=1; /* 置接收到 CAN 数据 */
RXB0IF=0; /* 清接收中断标志 */
RXB0FUL=0; /* bit7=0打开接收缓冲器接收新信息 */
}
}
//****************主程序******************
main()
{
initial(); /* 系统初始化子程序 */
initcan(); /* CAN设置初始化 */
IPEN=1; /* 使能中断高低优先级 */
INTCON=INTCON|0xc0; /* 开总中断、开外围接口中断 */
TXB0REQ=0; /* 关发送,TXB0REQ=0; */
while(1)
{
if(CAN_FLAG==1)
{
CAN_FLAG=0; /* 清接收到标志 */
TXB0CON=TXB0CON&0xf7; /* TXB0REQ=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;
TXB0CON=TXB0CON|0x08; /* bit3(TXREQ)=1请求发送 */
}
}
}