一个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)); // 等待进入正常模式
} |