SJA1000的错误中断处理

阅读: 评论:0

SJA1000的错误中断处理
SJA1000的错误处理好似还是⽐较复杂的的啦,下⾯是我⾃⼰的⼀些理解,有不对之处还请各位⼤虾多多指点啊!SJA1000的错误有:
仲裁丢失;
数据溢出;
总线错误;
错误状态有:
错误主动(Error Active)
错误被动 (Error Passive)
总线关闭;
错误中断:
去腐生肌膏
总线错误中断;
仲裁丢失中断;
错误消极中断;
数据溢出中断;
错误报警中断;
涉及到的寄存器
状态寄存器(SR);
中断寄存器(IR);
中断使能寄存器(EIR);
仲裁丢失捕捉寄存器(ALC);
错误代码捕捉寄存器(ECC);
错误报警限制寄存器(EWLR);
TX错误计数寄存器(TXERR);
RX错误计数寄存器(RXERR);
处理中断当然是从中断寄存器说起了;
中断寄存器:只说和错误有关的位啦;
IR.7:BEI 总线错误中断;
当CAN控制器检测到总线错误且中断使能寄存器(EIR)中的BEIE被置位时此位被置位
当前的错误代码可以通过错误代码捕捉寄存器(ECC)获得;其中可以分为:
位错误;
格式错误;
填充错误;
其它错误;
IR.6:ALI 仲裁丢失中断;
当CAN控制器丢失仲裁,变为接收器和中断使能寄存器的ALIE为被置位时,此位被置位
当前仲裁丢失的位置可以通过读仲裁丢失捕捉寄存器(ALC)获得;
IR.5:EPI 错误消极中断;
当CAN控制器到达错误消极状态(Error Passive)(⾄少⼀个错误计数器超过协议规定
的值127)或从错误消极状态(Error Passive)⼜进⼊错误活动状态(Error Active)
以及中断寄存器的EPIE位被置位时此位被置1
IR.3:DOI 数据溢出中断;
数据溢出状态位(状态寄存器的SR.1位 DOS)有0-1 跳变且中断寄存器的DOIE位被置
位时此位被置1
IR.2 EI 错误报警中断;
错误状态位(状态寄存器的SR.6位 ES)和总线状态位(状态寄存器的SR.7位 BS)的
改变和中断寄存器的EIE位被置位时此位被置1
影响错误状态位的有:
1,错误计数器⾄少有⼀个错误计数器满
2,超过错误报警限制寄存器(EWLR)设置的值时错误状态位被置位;报警中断。EWLR 硬
件复位后的默认值是96
3,当发送错误计数器超过限制255 总线状态位被置为1 总线关闭
4,进⼊总线关闭后,再次进⼊错误主动状态(Error Active)时,也会产⽣中断;
再说⼀下错误状态:
1,当TX错误计数寄存器和RX错误计数寄存器中有⼀个计数⼤于127时,则就进⼊错误被动状态(Error Passive)
cellid
2, 当TX错误计数寄存器和RX错误计数寄存器两个计数都⼩于127时,则就进⼊错误主动状态(Error Active)
2, 总线关闭状态,当TX错误计数寄存器超过限制255 总线状态位被置为1 总线关闭;
从上⾯来看错误报警中断(EI)是由多个中断源产⽣的,所以其处理也最为复杂;我只对总线关闭进⾏了处理,其它的未做处理;下⾯的图有助于⼤家理解:
下⾯是我写的程序:
void can_signal(void)
{
改性沥青稳定剂unsigned char data can_irq;
unsigned char data temp;
x_wdgtime();
can_irq = InterruptReg;
if(can_irq&ALI_Bit){ // 仲裁丢失位
++al_counter;
temp=ArbLostCapReg; // 读仲裁丢失寄存器
alc_current=temp&0x1F; // 获得当前仲裁丢失的位置
}
if(can_irq & BEI_Bit){ // 总线错误中断
temp=ErrCodeCapReg;
buse_current=temp&0x3F;
temp=temp&0xD0; // 获得总线错误的类型
switch (temp) {
case 0x00: ++bite_counter;
case 0x40: ++forme_counter;
case 0x80: ++stuffe_counter;
高铬铸铁case 0xd0: ++othere_counter;
}
}
if(can_irq & EPI_Bit){ // 消极错误中断,
// 接收或发送错误计数超过127时,错误状态变为被动错误
if((RxErrCountReg>127)||(TxErrCountReg>127)) errstatus_current=ERR_PASSIVE;
// 接收或发送错误计数回到⼩于127时,错误状态变为主动错误
if((RxErrCountReg<127)&&(TxErrCountReg<127)) errstatus_current=ERR_ACTIVE;
}
if(can_irq & DOI_Bit){ // data overflow
CommandReg = (CDO_Bit|RRB_Bit);
return;
}
if(can_irq&EI_Bit){ // 错误报警中断, 这⾥只对总线关闭错误做处理
if(StatusReg&BS_Bit){ // 检测状态寄存器的总线状态位
中频加热
++busoff_counter;
ModeControlReg = 0x00;
return;
背板制作}
}
if(can_irq & RI_Bit){ // 接收数据中断
if(StatusReg & DOS_Bit){
CommandReg = (CDO_Bit|RRB_Bit);
return;
}
can_readmsg();
return;
}
return;
}
有不对的还请⼤家指出来哦!

本文发布于:2023-06-02 11:21:39,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/2/122821.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:错误   寄存器   中断   状态   总线
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图