本日由于一个项目要用到canopen编码器,由于canopen是标准帧格式的,而我以前的项目都是用扩展帧写的,那么就碰着了扩展帧和标准帧稠浊吸收的问题。刚开始以为很大略,改个ID格式不就办理了嘛,现实却是改完往后,标准帧不论如何也触发不了CAN中断,网上搜了一下,也没有干系内容。几年不看,根本内容都忘得差不多了,那么只能回顾以前的资料了!
二,根本知识回顾
我们知道,CAN总线具有两种不同的帧格式,不同之处在于标识符的长度不同:具有11为标识符的为标准帧,具有29位标识符的为扩展帧,详细帧格式,如下所示:

CAN总线帧格式
从图中可以知道,标准帧标识符长度为11位,相称于扩展帧的基本ID,标准帧与扩展帧通过IDE位来区分,IDE的全称为“标识符扩展位”,IDE位位于标准帧的掌握场,位于扩展帧的仲裁场。IDE位在标准帧里面为“显性”,也便是“0”,在扩展帧里面为“隐性”,也便是“1”。
那么在2812/28335里面,CAN ID寄存器是怎么表示的呢?查看干系书本,截图如下:
可以看到,0~28为标识符ID,标准帧格式的标识符有效位为18~28位,扩展帧格式全部有效。29位(AAM)为自动应答模式位,与吸收无关,不管它。30位(AME)为吸收屏蔽使能位,这里可以根据自己须要进行设置。31位(IDE)便是我们的标识符扩展位,大略来说IDE置1,设置的标识符就为扩展帧,设置为0就为标准帧。
三问题办理过程
有了上面的根本知识,这个问题该当就能迎刃而解了吧?我们修正一下试一试,末了修正的内容如下:
首先,ID号的最高位(IDE位)必须要修正为0,其次,我们的有效标识符要把稳修正。对付标准帧,有效标识符为18~28位,因此我们须要左移18位。这也是我出错的地方,只修正了最高位,而没有对有效标识符进行移位操作。比如把ID号设置为0X00000181,那么此ID便是无效ID,不管对标准帧还是扩展帧都是缺点的。但是我们知识见告我们,标准帧的ID便是这种的,比如在剖析仪里面输入时便是这样:
因此,犯了一个履历性缺点。这样由于ID是无效的,以是也就触发不了中断。这里也解释老外设计的东西比较奇葩,都不按常理出牌。
在进行移位操作时,还要把稳进行逼迫类型转换,不然会报一下警告:
shift count is too large
如果不逼迫转换,将会导致我们的末了移位结果是缺点的,因此须要在这里加一个逼迫类型转换。
四总结
问题很小,但是对一些老项目的掩护和改造,从事理上来讲都很大略,由于这些东西都是你以前做过的。但是真正落地的时候每一个小细节的实现都还是须要花不少韶光的。对付一个项目,最怕的便是翻烧饼,而且是永劫光的烧饼,由于韶光一长,很多以前看过的东西都忘得差不多了,要再捡起来,用一首歌来回答,那只能是《从头再来》~