背景:测试
最近一直在使用C8051F340 + SJA1000来实现CAN通讯,就SJA1000部分作个记录。blog
正文:配置
整个系统结构拓扑图以下:im
两路CAN,C8051F340做为CPU,处理CAN与USB数据。通信
转入正题,关于SJA1000的中断。数据
SJA1000的/INT脚与单片机的外部中断输入脚相连,平时/INT保持高电平,当SJA1000内部有中断时,/INT脚及变为低电平(单片机外部输入中断引脚设置为低电平有效边沿触发),等待单片机进行处理。img
SJA1000中断部分应该关注两个寄存器“IR”(Interrupt Register),“IER”(Interrupt Enable Register)。顾名思义,“IER”为使能相应中断,“IR”为指示中断状态,应当注意的是:当单片机读取了SJA1000的“IR”寄存器后,/INT脚从新变为高电平,“IR”寄存器全部位复位为0!时间
还有一个值得注意的是:为了保险起见,应该要将“IER”清零,而后根据须要配置相应位。co
为此,我也郁闷了许久,过程以下:为了测试,因而将2路CAN相互接通,当经过SJA1000_1发送数据时,按照逻辑来讲,SJA1000_1发送数据,SJA1000_2过滤接收该条数据并产生接收完成中断,但是这个SJA1000_1居然与SJA1000_2同时产生中断!而我中断使能使用的是“或”的方式配置了“总线错误中断”、“数据溢出中断”“错误报警中断”、“接收中断”,SJA1000_1不该该会在这个时候产生中断!SJA1000_1难道会过滤接收本身发的数据?这是首先被怀疑的,查了资料后发现,处于发送状态的节点是不会接收数据的。排除!折腾了许久才发现SJA1000_1发送完毕产生了发送完成中断,所以能够确认“发送使能中断”不清零的话,是有可能被打开的(SJA1000的官档并未说明每一位的默认值),其它“使能中断”亦如此,错误
记录地点:深圳WZ
记录时间:2016年3月16日