小心DSP2407 与SJA1000 CAN使用上的不同

对于熟悉了使用SJA1000的我们来说,使用DSP2407的CAN总线也没有什么本质上的区别。CAN总线的初始化,CAN的发送和接收等三个函数的步骤和对寄存器的操作基本上是一样的,2407无非是多了几个参与CAN通讯的邮箱而已。但是最近在调试2407的can总线通讯的时候却被它与SJA1000的一点小小的不同给绊倒了,陷了进去,一个小小的陷阱:

这就是2407的每个邮箱的ID寄存器与SJA1000不兼容的问题,对于CAN通讯的扩展帧来说,ID需要29位,2407用两个16位寄存器IDH和IDL来表示。而SJA1000由于是一个8位的控制器,所以扩展帧的ID需要4个字节来表示。这样无论哪种方式,它们都会有3个字位的空余。SJA1000把这三位放在寄存器最高字节的低三位,而2407把这三个字节放在最高字节的高三位。两外SJA1000的29位ID居然是从寄存器的高地址字节往低地址字节排列,这样就有点变扭了,违背了由低到高的基本规律。2407却又遵循了这个基本规律,把29位的ID由低位到高位依次排列在IDL和IDH中。这样就产生了2407与SJA1000 之间关于29位ID两点不同,1. 三个空闲位的位置;2. 位顺序的排列。这样就必须有一方要对ID的寄存器进行“乾坤大挪移”。不幸的是,我选择了对2407实施这门武功,由于这门武功杀伤力太强不小心伤及到了无辜,也就使我不幸地对2407的CAN代码和硬件电路折腾了整整一天多的时间。这里面的无辜者就是我们前面提到的不用的那三位,在SJA1000中,把这三个位保留起来,不做使用,并建议设为0,而在2407中它把这三位没有保留而是作为了十分重要的三个控制位,分别是:标识符扩展位、接收屏蔽位和自动应答模式位。尤其是第一位关系到发送的数据包是扩展帧还是标准帧,如果不小心设成标准帧的话,在SJA1000的那边看到总是第一个数据字节丢失。无论你怎么折腾都是第一个字节丢失,所以下次最好使用点“一阳指”这样的保险系数高的武功,别再伤及到无辜了。呵呵。

下面是SJA1000的ID寄存器的图

这下面是2407的邮箱ID

永不止步步 发表于03-14 14:47 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:382741个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号