这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教CAN 寄存器问题

共3条 1/1 1 跳转至

请教CAN 寄存器问题

菜鸟
2008-03-07 12:11:33     打赏
    

1C0MCTL复位状态下是00H。我置RecReq1,就为接收槽。复位态时Inval data位为0。那么这个槽中的消息就是有效的。也就是说可以直接读取。不知道是否可以这么认为?(读取的数据为00)

2:是不是在复位状态后接收到新消息或者是接收到连续的消息才会改变该Msglost

              /*检查过载错误*/

              if(c0mctl[in_slot].receive.msglost){

              c0mctl[in_slot].receive.msglost=0;

lost_message_can0(CAN_RCV_BUFF_ERROR); /*配置过载错误发生时的用户程序*/

break;

                     }

检查过载错误为什么是检查msglost位?以及配置过载错误发生时的用户程序,不知道该做些什么处理。

3:在函数set_rec_std_dataframe_can0()中,已经设定好槽接收消息的ID。且在CAN配置中,设置C0GMR为FFH。那么只有发送的消息ID和槽中设定的ID匹配了,才能保存到该槽中。问题:既然我已经设置了屏蔽寄存器,为什么在还没有发送数据的时候,Inval data就已经有效可以读取(在问题1的基础上)。岂不是矛盾?
     请瑞萨工程师给予解答,或阅读此帖的朋友给予帮助.谢谢!

 




关键词: 请教     寄存器     问题    

助工
2008-03-07 18:22:41     打赏
2楼

首先我本人对CAN不是很了解,因此请教了我们同事,如有回答不妥之处,请谅解:

1) invaldata = 0可以有两种状态,1:这个slot还没有接收到message;2:已经接收完一个message。如果想要查看slot中有没有新的消息可以读取c0mctl中的newdata位。
在没有清的时候可以认为有可以读取的message。
2) msglost = 1 时有两种情况1,在overwrite时,这个slot中有消息,同时又来了新的消息;2,在overrun时,这个slot中有消息,同时又来了新的消息;
 过载可以检查这个位,分别在overrun 和 overwrite时做相应的处理。处理可以按照用户程序的需求来做。
3) invaldata理解有误。请参见1。


助工
2008-03-07 18:40:14     打赏
3楼

补充关于第一个问题:

1.      新数据可以接收的判断标准(以最新的RCANII为例):

if((Newdata ==1) && (Invaldata ==0)){

        /* 读取数据 */

}

说明:

(1)    请参考RCANII接收的时序图。当从CAN总线上成功收至一条帧的EOF段-Bit6后,Invaldata与Newdata同时置位1。然后在数据完全转移到CAN DPRAM后,Invaldata清0。此时,可以读取数据了。

(2)    实际的应用程序中,大家经常习惯于只检查Newdata,也不曾遇到问题。这是因为数据转移时间(Invaldata=1的时间)很短,只有几个CAN Clock。从安全的角度讲,应该用更安全的做法。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]