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)

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;

}

有不对的还请大家指出来哦!

sja1000 中断_SJA1000的错误中断处理相关推荐

  1. sja1000 中断_SJA1000程序

    给你提供一些思路 1.sja1000初始化 2.发送子程序 3.中断方式接收 下面是一些程序段 你参考下(已用于产品) /**********SJA1000初始化***********// void ...

  2. sja1000 中断_SJA1000中断接收为什么接收中断不能被触发,不能进入中断接收子函数?看资料,里面说会自动触发中断的。...

    1.sja1000的int引脚你先不连接   sja1000通电后 (纯粹通电不运行程序) 你测试一下int 是否为高? 如果是高正常. 2.sja1000的int引脚你先不连接   运行程序    ...

  3. sja1000 中断_CAN总线 SJA1000中断

    背景: 最近一直在使用C8051F340 + SJA1000来实现CAN通信,就SJA1000部分做个记录. 正文: 整个系统结构拓扑图如下: 两路CAN,C8051F340作为CPU,处理CAN与U ...

  4. 专题2-通过按键玩中断\第1课-中断处理流程深度剖析-lesson1

    中断概念 1.中断生命周期 串口先产生一个事件,该事件传送到中断控制器里面,中断控制器会进行相应过滤,能通过过滤,那么就交给CPU去处理. 2.中断源 2440芯片手册 6410芯片手册 3.中断过滤 ...

  5. sja1000 中断_[转载]SJA1000的错误中断处理

    SJA1000的错误处理好似还是比较复杂的的啦,下面是我自己的一些理解,有不对之处还请各位大虾多多指点啊! SJA1000的错误有: 仲裁丢失: 数据溢出: 总线错误: 错误状态有: 错误主动(Err ...

  6. GNU ARM汇编--(五)中断汇编之嵌套中断处理

    在上篇<GNU ARM汇编--(四)中断汇编之非嵌套中断处理>中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整 ...

  7. sja1000 中断_SJA1000PeliCAN模式下自收发问题

    /*************************************************************************MCU:ATmega16MCLK:内部震荡8M熔丝位 ...

  8. sja1000 中断_关于单片机+SJA1000接收中断C语言编程的问题

    采用at89S52+sja1000的模块.一个节点发送,一个节点接收.可以确定发送节点能正确工作.但是接受节点无法接收到报文,接受节点采用中断0,程序如下voidCAN_RXD(void)interr ...

  9. ARM通用中断控制器GIC之中断处理简介

    在阅读本章之前,可以参考笔者之前关于GIC的一些描述: ARM通用中断控制器GIC(generic Interrupt Controller)简介 ARM架构Generic Interrupt Con ...

最新文章

  1. Linux下利用rsync实现多服务器文件同步
  2. 微信小程序 - this.triggerEvent()
  3. dp application in paper (c#)
  4. 多线程之 CreateThread与_beginthreadex本质区别
  5. layui富文本编译器添加图片
  6. 计算机应用板块还有行情吗,今日股市行情资金收评:计算机应用板块资金流出居前...
  7. YBTOJ:单词频率(AC自动机)
  8. linux内核调度 0号进程,Linux内核源代码情景分析---第四章 进程与进程调度
  9. OK6410-A编译u-boot时遇到的问题及解决
  10. http发送16进制报文_图解HTTP 第三章HTTP报文内的HTTP信息
  11. 谢谢有你【我与51CTO一“七”成长】
  12. 组概念_【收藏】学习质谱一定要知道的6组概念
  13. 一款保险系统架构设计图
  14. IOT:基于oblog的应用
  15. 无线通信中存在的远近效应、多普勒效应、多径效应以及其应对策略
  16. android全平台基于ffmpeg解码本地MP4视频推流到RTMP服务器
  17. APP消息智能推送有什么特点
  18. 抖音播放量突然被限流降权是什么原因
  19. PATA 1093 有几个PAT
  20. 共地问题的干扰用滤波器也难于解决.

热门文章

  1. 大数据学习(十三)hive正则表达式
  2. 代码实现:圣诞树效果(易懂,必会)/用html实现圣诞树效果
  3. 百度之星2018初赛游记
  4. 电脑字体突然变细了:macOS Mojave 在非Retina屏幕下字体太细了怎么办
  5. 2021-12-08:扑克牌中的红桃J和梅花Q找不到了,为了利用剩下的牌做游戏,小明设计了新的游戏规则: 1) A,2,3,4....10,J,Q,K分别对应1到13这些数字,大小王对应0; 2) 游
  6. NGBOSS转型在即:COTS初露锋芒
  7. 清闲的工作与温水煮青蛙;-)
  8. GameFramework框架个人笔记汇总
  9. 详解Windows系统中如何释放C盘空间(转)
  10. python爬虫能赚钱吗-个人利用Python爬虫技术怎么挣钱-10万被动收入