打印
[CAN-bus/DeviceNet]

sja1000怪问题求救??????????

[复制链接]
1932|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
evilwbj|  楼主 | 2012-2-16 15:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一个CAN中继项目,51单片机带4路CAN控制器SJA1000,波特率5kbps,SJA1000的16脚分别连接到单片机的INT0 T0 INT1 T1脚上,中断接收CAN数据
我做了2版电路版,第一版全部正常 ,第二版出现问题
现在的现象是连接到INT0 T1脚上的SJA1000可以正常进入中断,用示波器能看到16脚上的电平变化,  
而连接到T0 INT1的SJA1000的16脚由高变低后,在也不拉高,我使用查询方式接收这两路CAN数据,就正常,
现在死活找不到原因,

/************************************************************************
*函数原型:  void main(void)                         *
*参数说明:  无                                                         *
*返回值:  无                                                         *
*说明:主程序,完成CAN数据转发功能             *
************************************************************************/
void main(void)
{
MCU_Init();
RST_CAN = 1;
Delay_Nms(100);
RST_CAN = 0;
DOG = !DOG;
SJA0_Init();
DOG = !DOG;
SJA1_Init();
DOG = !DOG;
SJA2_Init();
DOG = !DOG;
SJA3_Init();
Delay_Nms(10);
EA = 1;
while(1)
{
DOG = !DOG;
if(Can0RevFrmCnt>0)
{
Send_Can0RevData();
Can0RevFrmCnt--;
}
if(Can1RevFrmCnt>0)
{
Send_Can1RevData();
Can1RevFrmCnt--;
}
if(Can2RevFrmCnt>0)
{
Send_Can2RevData();
Can2RevFrmCnt--;
}
if(Can3RevFrmCnt>0)
{
Send_Can3RevData();
Can3RevFrmCnt--;
}
}
}

/************************************************************************
*函数原型:  void MCU_Init(void)                         *
*参数说明:  无                                                         *
*返回值:  无                                                         *
*说明:该函数用于初始化MCU相关寄存器                             *
************************************************************************/
void MCU_Init(void)
{
TMOD = 0x66; // T0:计数器、8位自动重载模式;T1:计数器、8位自动重载模式
TH0 = 0xff; // T0计数初值
TL0 = 0xff;
TH1 = 0xff;    // T1计数初值
TL1 = 0xff;
TCON = 0x55; // TR1=1;TR0=1;IT1=1;IT0=1;
ET1 = 1; // 允许T1中断
EX1 = 1; // 允许INT1中断
ET0 = 1; // 允许T0中断
EX0 = 1; // 允许INT0中断
}

/************************************************************************
*函数原型:  void T1_IRQ() interrupt 3                         *
*参数说明:  无                                                         *
*返回值:  无                                                         *
*说明:定时器1中断服务子程序,用于接收CAN3数据                         *
************************************************************************/
void T1_IRQ() interrupt 3  // T1中断:CAN3接收中断
{
u8 idata temp;
EA = 0;
DOG = !DOG;
temp = IR3;
if(temp&0x01) // 接收数据状态
Can3RevData();
if(temp&0x08) // 数据溢出中断
CMR3 = 0x0c; // 清除数据溢出位,释放缓存区
if(temp&0x04) // 发生其他错误时,读取ALC0和ECC0,避免下次不进入中断
{
temp = ALC3; // 读取仲裁丢失捕捉寄存器
temp = ECC3; // 读取错误代码捕捉寄存器
}
temp = SR3;
if(temp&0x80) // 如果总线关闭,???
MODE3 = 0x08; // 单滤波
EA = 1;
}

/************************************************************************
*函数原型:  void SJA3_Init(void)                         *
*参数说明:  无                                                         *
*返回值:  无                                                         *
*说明:该函数用于初始化CAN3的SJA1000                             *
************************************************************************/
void SJA3_Init(void)
{
u8 temp;
MODE3 = 0x09;    // 单滤波,复位模式
do{temp = MODE3;}
while((temp&0x01)==0x00); // 等待进入复位模式

CDR3 = 0x88; // PeliCAN模式;CBP = 1;关闭时钟;0x88???
OCR3 = 0x1a; // ???
IER3 = 0x0d; // 数据溢出中断使能;错误报警中断使能;接收中断使能

AMR03 = 0xff; // 验收屏蔽寄存器0
AMR13 = 0xff; // 验收屏蔽寄存器1
AMR23 = 0xff; // 验收屏蔽寄存器2
AMR33 = 0xff; // 验收屏蔽寄存器3
ACR03 = 0x00; // 验收代码寄存器0
ACR13 = 0x00; // 验收代码寄存器1
ACR23 = 0x00; // 验收代码寄存器2
ACR33 = 0x00; // 验收代码寄存器3

BTR03 = 0x0f; // 波特率5kb
BTR13 = 0x7f; // 波特率5kb

TXERR3 = 0x00; // 清空TX错误计数寄存器
temp = ECC3; // 读取错误代码捕捉寄存器,即清空

MODE3 = 0x08; // 单滤波,正常模式
do{temp = MODE3;}
while(!(temp&0x08)); // 等待进入正常模式
}

1.jpg (67.15 KB )

1.jpg

2.jpg (117.31 KB )

2.jpg

相关帖子

沙发
evilwbj|  楼主 | 2012-2-20 08:51 | 只看该作者
结贴
找到原因了!
程序没问题 是硬件的问题
第一版和第二版的电路不同
有问题的2路CAN,中断线接的正好相反

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

31

帖子

1

粉丝