记28377系列芯片中Can总线标准帧和扩展帧该怎么设置?

笔者最近在调试28377系列DSP芯片的can通讯时,遇到一个小问题,百思不得姐~

起因是这样的,在设计一个多单元并联的系统,所有单元使用can总线进行通讯,当通讯端口,can外设,以及相关通讯协议都设计好后,开始使用上位机进行通讯调试时,发现上位机可以正常接收到dsp通过can发送的数据,但检测dsp中的接收缓存,始终看不到上位机下发的数据。

于是,笔者反复排查can模块的配置,can邮箱的配置,以及相关变量的设计等,但并没有找到问题所在。

经过了半天时间,突然想到是否是上位机下发数据格式问题,再次检查上位机下发数据,发现在下发数据设置中勾选了Extended Frame(扩展帧格式)选项。

按照我在dsp中对can的调用,本意是使用扩展帧的,但实际在配置Can信息ID时,因为单元数量并不多,ID虽然是按照29位格式配置,但数值实际只是1到10这样子,比如其中一个是“0x00000006”。

这里简单介绍一下Can总线中,标准帧和扩展帧的区别,标准帧是使用11bit位作为ID识别,扩展帧使用29bit位作为ID识别,具体就不再赘述了,相关对can总线稍有了解的同学就知道这个ID识别的作用。

那么回到我们的问题中来,实际上28377系列芯片对于Can总线使用标准帧还是扩展帧是怎么配置的呢?注意,和28335或者2812等以前的Can结构是不一样的,所以28377系列配置方法有区别哦,对于can的信息帧是扩展帧还是标准帧,28377系列使用其对应库里相关的CANMessageSet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *pMsgObject, tMsgObjType eMsgType)函数进行配置,具体相关的配置语句是这样的:

// See if we need to use an extended identifier or not.
    if((pMsgObject->ui32MsgID > CAN_MAX_11BIT_MSG_ID) ||
       (pMsgObject->ui32Flags & MSG_OBJ_EXTENDED_ID))
    {
        bUseExtendedID = 1;
    }
    else
    {
        bUseExtendedID = 0;
    }

其中,CAN_MAX_11BIT_MSG_ID = 0x7ff,MSG_OBJ_EXTENDED_ID = 0x00000004

简要解释一下上面的意义,就是说,在配置can的MsgObject变量时,判断其ui32MsgID(Can信息ID)值的大小,如果大于0x7ff则自动配置为扩展帧,0x7ff正是11bit位ID的最大值;或者,判断ui32Flags标志,如果其bit2位是1,则也配置为扩展帧。

检查了笔者对于can相关MsgObject配置,发现其ui32MsgID小于0x7ff,而ui32Flags又默认配成了0,所以,实际上dsp是以标准帧格式在接收数据的。

原因找到了,解决起来也很简单,上位机取消勾选扩展帧格式,按照标准帧发送,则dsp正常接收。或者,上位机发送设置不变,dsp通过将can的接收MsgObject的ui32MsgID配置为大于0x7ff的值,或者将ui32Flags配置为0x00000004,则dsp可以扩展帧格式正常接收上位机信息。

posted @ 2019-08-23 13:33  大风当歌  阅读(2567)  评论(0编辑  收藏  举报