TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570can

大家好,

      在调can时初始化后通过while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX2))循环判断是否收到数据,然后在这个循环中把接收到的数据再发走,用的是不同的canMESSAGE_BOX收发。测试中通过测试工具发出数据,单片机能接收,且接收后又能发出来。但第二次开始用测试软件给单片机发数据就不行了,显示发送失败,这是什么原因呢?是需要清除什么标志位还是什么的?

Ray11:

第二次是指发送成功数据以后继续发一帧数据。后来再连续给单片机发数据都不行了

Ken Wang:

回复 Ray11:

Ray,

  可以这样,既然你有测试工具,你可以将它也挂在CAN总线上,监听一下总线上的信息,看看你第二次软件发出来的报文是怎么样的?报文ID和接收端的message BOX设置是否一样。

谢谢

Ray11:

回复 Ken Wang:

Ken,

     感谢您的回复!报文ID和接收端设置的ID等是一样的。可能我表达的意思不清楚。我的意思就是我通过上位软件连续两次或者三次。。给单片机发同样数据,只有第一次发给单片机后,单片机相应了,发出了报文,上位软件也收到了它发的,第2次,3次。。后面的就收不到单片机反馈了,具体代码如下,

while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX2));{canGetData(canREG1, canMESSAGE_BOX2, tx_data);canTransmit(canREG1, canMESSAGE_BOX1, tx_data);}

是不是需要做延时什么的还是要清具体哪个标志位?

谢谢

Ken Wang:

回复 Ray11:

Ray,

  我比较少用查询的方式去接收CAN总线的报文,一般都是用中断的方式来的快捷一些。

印象中没有需要清标志位的操作。你如果单步调试的时候,在第二次或第三次是,程序能跳到while(1)里面去吗?如果不能,。你可以设下断点,查看一下CAN寄存器里面对应的newdata寄存器里面有没有收到你发送的数据。

谢谢

Ray11:

回复 Ken Wang:

Ken,

     感谢!我先试着按照您的方法解决下问题再回复。

     Ray11

Ken Wang:

回复 Ray11:

Ray,

  好的,用中断方式可以了吗

谢谢

Ray11:

回复 Ken Wang:

Ken,

    我试了一下中断接收。在使能一个中断的情况下,调用canMessageNotification函数里发送数据是可以的。然后又试了下使能2个接收中断。在一个canMessageNotification函数里写了canGetData(canREG1, canMESSAGE_BOX3, tx_data);canGetData(canREG1, canMESSAGE_BOX2, tx_data);最后再写一个发送函数。用上位机软件测试同时发送2帧ID数据,故意把mailbox3的ID数据放在前面,mainbox2的ID数据放在后面,然后同时发送。结果是mainbox3先收到数据,mainbox2后收到。这是什么原因?mainbox2应该优先的。难道是中断嵌套了?

   谢谢

Ken Wang:

回复 Ray11:

Ray,

 首先TMS570默认是不支持终端嵌套的,这个放心。其次在CAN总线的协议里面,它是支持无损伤仲裁机制的,也就是说它的优先级是和报文的ID挂钩的。

你可以确定一下你的messagebox2和3对应的ID分别是多少。理论上说是ID越小,优先级越高 

谢谢

Ray11:

回复 Ken Wang:

Ken,

     谢谢你的解答。但我在手册上多次看到这个:The Message Object 1 has the highest priority, the last message object has the lowestpriority,什么情况?断章取义了吗?

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » TMS570can
分享到: 更多 (0)