采用at89S52+sja1000的模块。一个节点发送,一个节点接收。可以确定发送节点能正确工作。但是接受节点无法接收到报文,接受节点采用中断0,程序如下voidCAN_RXD(void)interrupt0using...
采用at89S52+sja1000的模块。一个节点发送,一个节点接收。可以确定发送节点能正确工作。但是接受节点无法接收到报文,接受节点采用 中断0,程序如下
void CAN_RXD( void ) interrupt 0 using 1
{//接收数据函数,在中断服务程序中调用
uchar bdata Judge;
uchar i;
EA = 0;//关CPU中断
// IE0 = 0;
//led=0;
Judge = IR;
P27=1;P26=0;P25=1;//用电压表测量是否进入中断
if( Judge & 0x01)
{//IR.0 = 1 接收中断
for(i=0;i<13;i++)
RX_buffer[i] = *(SJA_BASE_ADDR+16+i);
RXD_flag = 1;//置有接收标志
CMR = 0x04;
Judge = ALC;//释放仲裁随时捕捉寄存器
Judge = ECC;//释放错误代码捕捉寄存器
}
IER = 0x01;// .0=1--接收中断使能;
EA = 1;//打开CPU中断
}
void main(void)
{
CAN_init( shezhi ); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制片选有效无效
Delay(7);
EA = 1; //打开总中断
P27=0;P26=1;P25=0;
while(1)
{
Delay(900);
if(RXD_flag)
{
P30=0;P31=1;//用电压表测量是否接受到数据
}
}
中断采用低电平触发方式,验收屏蔽位全设为1,但是就是接收不到CAN报文。不知哪位大侠能给予帮助,谢谢~~
忘记说了 对于单片机中断的设置 在CAN_init函数里
EA = 1;
EX0 = 1;//外部中断1使能;CAN总线接收中断
IT0 = 0;//低电平触发
我曾经将中断引脚人为接地,mcu进入中断 进入不了 if( Judge & 0x01)
{//IR.0 = 1 接收中断
展开