This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8377万S:CAN转换

Guru**** 2487425 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/664828/tms320f28377s-can-conversion

部件号:TMS320F2.8377万S
主题中讨论的其他部件: C2000WARE

您好,

我的一位客户正面临 TMS320F2.8377万S CAN转换的问题。

他同意在论坛上分享他的问题,因此我希望你能够在这个问题上帮助我们。

以下是他对该问题的描述:

我需要一些帮助,因为我在377s上遇到了使用driverlib (C2000Ware_1_00_03_00)的CAN接口问题

我在C2000 wiki中寻找了一些想法,但我没有找到答案....

 

我正在尝试使用通用驱动器设置两个CAN接口(CANA和CANB),以符合特定要求。

此时,我不知道应用程序需要传输哪个CobID,也不知道哪一个是消息长度

 

我已经开始从 C2000Ware的示例中编写代码,并且能够传输和接收数据

(设备已启用环回)

在附加的代码中,如果我在 运行时(使用CCS)更改了变量vIntTxCobId_guh,CAN_readMessage将返回接收到的数据

但如果我更改变量vIntTxDlc_guc,我可以在CAN TX引脚上看到长度不同的帧,但CAN_readMessage 返回

始终为false

 

我还尝试在2 "CAN_setupMessageObject"之前添加"CAN_disableController",然后添加CAN_enableController"

但已   收到任何帧。

 

是否可以动态更改msgLen?

否则,哪一个解决方案?

是否必须为每个msgLen设置不同的邮箱(从1到8)?

-----------------------

我尚未了解CAN_getStatus的行为

我已添加呼叫vStatus_guh = CAN_getStatus(Cana_base);

此外,当我正确接收数据时(msgLen中没有变化),我从未在1 (CAN_ES寄存器的第4位)看到RxOk标志

vStatus_guh = 8

这是否正确?

-----------------------

我已经查看了C2000Ware_1_00_03_00\driverlib\f2837xs\driverlib中2837中的can.c文件

Cana_base常量是否正确?

-----------------------

第556行.....

   //
   //查看是否有可用的新数据。
   //
   IF ((msgCtrl & CAN_IF2MCTL_NEWDAT)== CAN_IF2MCTL_NEWDAT)
   {
       //
       //从CAN寄存器读取数据。
       //
       CAN_readDataReg (msgData,(Int16_t *)(BASE + CAN_O_IF2DATA),
                       (msgCtrl & CAN_IF2MCTL_DLC _M));

       状态=真;

       //
       //现在清除新的数据标志
       //
       //将消息对象传输到指定的消息对象
       //对象标识
       //
       HWREG_BP (Cana_base + CAN_O_IF2CMD)= CAN_IF2CMD_TXRQST |
                                            (Objid & CAN_IF2CMD_MSG_NUM_M);

       //
       //等待忙位清除
       //
       While ((HWREGH (Cana_base + CAN_O_IF2CMD)& CAN_IF2CMD_BUSY)== CAN_IF2CMD_BUSY)
       {
       }
   }
行584

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Mickael:

    根据客户的描述,他们的主要问题(根据我能解释的内容)如下(我还添加了一些回复/评论):

    1) 能否动态更改消息长度?

    是的,可以动态更改消息长度。  在C2000Ware driverlib函数CAN_setupMessageObject()中,最后一个参数是消息长度。  在数据传输之前,用户应调用CAN_setupMessageObject()函数并相应地设置消息长度。  根据定义,最多可以传输8字节的数据。

    2) CAN_getStatus函数返回什么?

            此函数返回CAN_ES寄存器的内容(有关CAN寄存器说明,请参阅TMS320F2.8377万S的技术参考手册)。  返回值8表示数据传输正常。  如果客户正在使用环回测试,这种情况可能是根据描述得出的, 不会设置RxOk位 ,因为环回示例是一种测试模式,Cana在该模式下传输数据,并确保数据通过 内部路径(而不是外部CAN总线)传回邮箱。  RxOk位 只能在CAN模块处于接收模式时设置。  

           另一个示例是使用2个CAN模块,CANA传输数据,CANB接收数据。  我认为此示例将最好地演示CAN_ES寄存器轮询,特别是TxOk和RxOk位状态如何在每次事务处理后更新。  此示例需要使用CAN总线和收发器。

    3)  Cana_base是否为常量?

          是的,Cana_base是常量的。  这是TMS320F2.8377万S具有的两个CAN模块中第一个的基本外设地址。  如果需要使用第二个CAN模块,则必须将例程更改为CANB_BASE。

    请告诉我此信息是否有用,以及客户是否仍有上述问题。

    此致,

    约瑟夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Joseph

    我是参与此线程的客户

    感谢重播

    如果可能的话,我需要解释一下

    问题1)

    传输路径是否正常,但接收是否正常?

    我是否必须使用CAN_MSG_OBJ_USE_ID_FILTER作为CAN_setupMessageObject中的标志?

    是否有一个字段不 只筛选 长度?

    问题2)

    好的,清除

    我正在使用CAN_getNewDataFlags;它似乎也在环回模式下工作

    问题3)

     附加的代码 来自driverlib源代码中的ccan.c。

    在可能的情况下,应 使用变量"base"而不是Cana_base

    在我的测试中,CAN_readMessage功能仅在Cana接口上清除NewDataFlag,而不是在CANB上

    是否可以依赖这一点?

    此致

    Antonio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Antonio:

    欢迎参加论坛!  您可以将您的帖子直接放在论坛上,因为 多个社区成员和专家也可以分享您可能从  此处讨论的各种主题中获得的其他问题的答案。

    对于第一个问题:-  消息长度和筛选完全相互独立。  在传输过程中,在调用CAN_setupMessageObject之前设置消息长度可以正确设置CAN参数,以确定要 传输的字节数。  在接收过程中,CAN IFX寄存器(DLC字段)中的消息长度将根据发送的字节数相应更新。  邮件过滤(使用CAN_MSG_OBJ_USE_ID_FILTER标志)完全是一个不同的主题,决不会指示邮件的长度。  CAN中的消息ID筛选选项是一项功能,它仅允许特定节点接收数据,具体取决于与消息对象关联的消息ID (有时称为仲裁ID)。  在接收过程中,如果使用CAN_MSG_OBJ_USE_ID_FILTER标志,则只有与消息ID和某些掩码规则匹配的节点才会接收数据。  为了简单说明,传输节点将被分配 一个仲裁ID 0x0F,并将传输4字节 数据。  例如,在CAN总线中,有多个节点,分配为节点1至15 (节点15的仲裁ID为0x0F传输)。  如果只希望节点8至14接收来自节点15的传输,请使用CAN_MSG_OBJ_USE_ID_FILTER标志,同时设置掩码位以在设置消息对象时忽略消息ID的最后三位。  这样,节点0-7将不会接收任何数据,而节点8-14将接收来自节点15的4字节数据。

    第二项质询:我认为这点已澄清,所以我假设这里没有其他问题。

    对于最后一个问题:-您有一个要点,就是将此变量指定为'base'将会起作用,但这意味着用户必须提供正在使用的模块的基本外围设备地址。  编写C2000Ware实用程序/标头时,用户无需返回到不同的设备文档,即可找到需要为不同模块提供的基本地址。  抽象化的一种更有效和直观的方法是使用预定义的头值,如Cana_base或CANB_BASE, 只要用户在函数调用(如can_initModule(Cana_base,......)中传递此参数时一致 CAN_setupMessageObfage(Cana_base...., CAN_startModule(Cana_base,......) can_sendMessage(Cana_base,.... can_readMessage (cana_base,...)则这些信息应起作用。  这样,用户只需使用Cana_base或canb_base,而不必担心获取每个模块的不同基本地址(并且在 输入这些值时可能会出现拼写错误)。

    此致,

    约瑟夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Joseph

    我正在尝试继续我的CAN功能,但我面临着一些其他问题。

    我正在使用F2837xS外设驱动程序库1.03 .00.0

    收到帧后,如何读取其参数?

    我的意思是,我有任何输入筛选器,因此RX邮箱中可能有一封包含任意COD_ID,RTR或不同MSG_LENG...的邮件。 (请告诉我这句话是否正确)

    我已经看到还有一个带有CAN控制器API的已弃用_F2837xS_DRL_UG

    在该库中有void CANMessageGet (UINT32_t ui32Base, UINT32_t ui32ObjID, tCANMsgObject∗pMsgObject,
    bool bClrPendingInt)以获取所有帧参数。

    为什么在“新”库中没有这样的库?

    应如何管理?

    提前感谢

    此致

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Antonio:

             有一个与CANMessageGet等效的函数。  它 是void CAN_readMessage(UINT32_t base, UINT32_t Objid, uint16_t *msgData)。  您是否尝试使用过此功能?  参数msgData中应提供数据。  您还可以读取其他参数的IF寄存器。  (例如 CAN_IFxCTL,接收数据长度的DLC字段)。

             如果您在读取CAN参数时仍有问题,请告诉我。

    此致,
    约瑟夫

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Joseph

    是的,我已经使用void CAN_readMessage(UINT32_t base, UINT32_t Objid, uint16_t *msgData)进行了查询

    但它只读取接收到的帧的数据部分

    是否有获取其他"标志"的功能,或者我必须使用直接注册访问?

    是否建议使用CANMessageGet和同一库中的其他函数?

    此致

    Antonio

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Antonio:

    建议不要使用过时的函数,因为将来不支持这些函数。  另一个选项是读取CAN_readMessage不可用的其他标志或参数的IF寄存器。  请尝试从行号1119开始查看文件can.h。  您可以使用函数定义来读取寄存器值(例如,用于读取CAN_ES标志的CAN_getStatus)或具有CAN_getTxRequests,CAN_getValidMessageObjects,CAN_getNewDataFlags和CAN_getInterruptMessageSource等函数的其他信息。  您可以在can.h文件中找到所需的等效函数。  

    同时尝试转到driverlib中的docs子目录。  其中一个文档是名为F2837xS_Driverlib_Users_Guide.pdf的pdf文件。  有关支持的CAN功能的完整列表和说明,请参阅第7章。  希望这将有助于缩小搜索范围,查找您需要的特定读取功能。

    此致,

    约瑟夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Antonio:

    我有一段时间没有收到您的信息,因此我假设您已经解决了您的问题。

    此致,
    约瑟夫