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.

[参考译文] TMS320F28335:有关 CAN 编程的问题

Guru**** 2582405 points
Other Parts Discussed in Thread: TMS320F28335, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/650768/tms320f28335-questions-about-can-programming

器件型号:TMS320F28335
主题中讨论的其他器件:C2000WARE

我正在使用基于 TMS320F28335的电路板、最近出现了内存损坏问题、我认为这些问题与 CAN 总线有关。 我一直在使用 TI 参考指南交叉检查我们的代码、但我还不清楚一些要点。 我非常感谢对下列问题的任何帮助或澄清。

 

1.在第13页,这些文件提到:

在初始化阶段、CPU 将应用程序使用的所有消息标识符指定给消息控制器

  • 我无法在我们的 CAN 驱动程序中识别相应的代码。 有人能解释一下这意味着什么、我们应该如何指定使用的消息、如果我们稍后使用初始化时未指定的消息标识符配置邮箱、会发生什么情况吗?

     

2.在第15页:

注意:不在应用程序中使用的 LAMN、MOTSn 和 MOTOn 寄存器和邮箱(在 CANME 寄存器中禁用)可被 CPU 用作通用数据存储器。

  • 建议在初始化时打开所有邮箱以为 CAN 控制器保留存储器吗? 目前、我们的代码在初始化时禁用所有邮箱。

 

3.关于接收邮箱的配置,在第73页:

如果 AME 位设置为1、则必须对相应的接受屏蔽进行编程

  • 在我们的代码中、我们始终将掩码设置为0x00000000、将 AME 位设置为1。 是这样吗? (在遇到内存损坏问题后、我们似乎也停止了使用接受屏蔽)

 

4.在第79页,关于中断处理:

如果它是一个接收邮箱、CPU 应该如上所述读取数据并通过向它写入1来清除 RMP.31-0标志

  • 我们的代码似乎首先清除 RMP 标志、然后读取数据。 是否存在不遵循指定订单的潜在风险?

     

5.在 CAN 模块初始化之前、我们的代码通过设置 CANMC.6执行"软件复位"。
->这是明智的还是应该避免? 硬件与软件复位的影响在参考指南中没有详细说明。

 

6.初始化时,代码逻辑如下所示:

(i)设置 ECanaRegs.CANMC.ALL = 0x00000020 (软件复位);

(ii)置位 TXFUNC 和 RXFUNC 位、

(III)设置 SCB 位(启用 eCAN 模式)、

(IV)为所有邮箱设置 MSGCTRL.ALL = 0、

(v)将 CANTA、CANRMP、CANGIF0、CANGIF1、CANOPC 设置为0xFFFFFFFF、 (VI)将 CANMIL 设置为0

(vi)配置位时序(设置 CCR、等待 CCE、配置 CANBTC、清除 CCR、等待 CCE 清零)

(VII)禁用所有邮箱(CANME.ALL = 0)

(VIII)设置 CANMIM.ALL = 0xFFFFFFFF、CANGIM.ALL = 0x00000001

  • 该逻辑有任何问题吗? 在参考文档的第72页上、它说"复位后、CCR 位(CANMC.12)和 CCE 位(CANES.4)被设定为1"。 软件复位也是如此吗? 如果是、在上述点(ii)-(v)期间、CCR 和 CCE 可能已经被设置为1。

 

7.在第72页的"配置 eCAN 的步骤"中、第6步被称为

对主控制寄存器(CANMC)进行如下编程:

a.清除 CCR (CANMC.12)= 0

b.清除 PDR (CANMC.11)= 0

c.清除 DBO (CANMC.10)= 0

d.清除 WUBA (CANMC.9)= 0

e.清除 CDR (CANMC.8)= 0

f.清除 ABO (CANMC.7)= 0

g.清除 STM (CANMC.6)= 0

h.清除 SRES (CANMC.5)= 0

i.清除 MBNR (CANMC.4-0)= 0

->但是、除 CCR 外、我们的代码中没有明确清除任何这些错误。 是否有不这样做的潜在风险?

 

8.在第78页,关于中断配置:

现在配置 CANGIM 寄存器。 标志 AAIM、WDIM、WUIM、Boim、EPIM、 和 WLIM

(GIM.14-9)应该一直被置位(启用这些中断)。 此外、GIL (GIM.2)位可以被置位

使全局中断处于邮箱中断之外的另一个级别

  • 我们的代码中没有设置 AAIM、WDIM、WUIM、Boim、EPIM 或 WLIM 标志(CANGIM.ALL = 0x00000001)。 这是可以的、还是必须设置这些?

 

9.在发送消息时,我们的代码中的逻辑是:(i)禁用邮箱,(ii)设置其消息标识符、RTR、DLC 和 MDL/MDH 数据字段,(iii)重新启用邮箱,及(iv)设置 TRS 位。 代码不会清除 TA 标志。

->这是好的、还是有更明智的方法来实现这一点? 是否绝对有必要清除 TA 标志? 如果我们不这样做、会发生什么情况?

 

发送报文时、相应的 CANTRSn 位将通过表单中的指令置位

ECANaRegs.CANTRS.ALL = 0x00000001 << mailboxnumber;

  • 这是一种明智的方法,还是应该在此处使用|=运算符? (该文档指出向 TRS 写入0无效)

 

11. eCAN-A 和 eCAN-b 这两个模块到底是什么;它们是否可以同时使用、从而允许32 * 2邮箱? 在我们的代码中、这两个引脚都被启用、但实际上只有 eCAN-A 被使用。

 

非常感谢、

 

Laurent Badel

 

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

    这更多是一个指南。 通常、邮箱初始化(MSGID、DLC 等的配置)在模块初始化期间完成。 您可以随时任意次数重新配置邮箱。

     

    2.不确定我是否理解这个问题。 邮箱 RAM 布局如第20和21页所示。 该存储器块已为 CAN 控制器保留。 如果它们未被使用、它们可被用作通用 RAM。 为此、必须在链接器命令文件中定义和分配所需的 RAM 块。 无需为 CAN 控制器"保留"存储器。

     

    3.这是可以的。 这与不使用接受屏蔽具有相同的效果。 MSGID 必须位与位匹配。

     

    4.首先清除 RMP 会导致无法检测到消息覆盖的可能性。 建议遵循指南中概述的顺序。

     

    5.在初始化之前执行软件复位没有问题。

     

    6.您可以在 C2000ware 的 DSP2833x_eCAN-c 文件中引用初始化序列。 您可以在 C:\ti\c2000\C2000Ware_1_00_03_00\device_support\f2833x\con\source 中找到此文件。 这是网络上的 c2000ware 的最新版本。

     

    对于通过 CCS 进行上电复位或器件复位、CCR (以及 CCE)被设置为1。 我在器件上尝试过 SRES、但未观察到 CCR 设置。 在 SRES 描述中,该规范显示“…… 除受保护的寄存器外,所有参数都被重置为默认值".... 受 EALLOW 保护的 CCR 可能是它不受 SRES 影响的原因。

     

    7.这些步骤是一项准则。 根据应用的不同、编程步骤可能会有所不同。 必须遵循某些序列。 例如、如果不先写入 CCR、就无法写入 CANBTC。 同样、在写入 MSGID 字段之前、邮箱必须被禁用。 在访问 EALLOW 受保护的位/寄存器之前、EALLOW 必须有效。 参考指南提供了更多详细信息。

     

    这取决于应用。 如果应用程序不使用某个功能、则无需启用该中断。 例如、如果未使用低功耗模式(PDR)、则无需启用唤醒中断。

     

    9.如何确定传输完成? 是否轮询 TA 位或是否有中断有效? 我假设您使用中断。 该规范如下:"CPU 通过写入1来重置 CANTA 中的位。 如果已经产生了一个中断、这也会清除中断。"

     

    您不想清除 TA 标志是否有原因?

     

    10.模块设计的唯一规定是所有的读/写操作都应该是32位的。 满足该条件后、它确实是首选编程风格。 正确的是、写入"0"不会对 TRS 执行任何操作。

     

    11.它们是两个独立的 CAN 模块。 通过选择合适的 MSGID 和接受屏蔽、您可以使它们像具有64个邮箱的单个 CAN 模块一样"运行"。 但如前所述、它们是映射到存储器不同部分的两个独立模块。

     

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

    非常感谢您的详细回答。

    为此、必须在链接器命令文件中定义和分配所需的 RAM 块

    这正是我想要听到的、谢谢!

    4.首先清除 RMP 会导致无法检测到消息覆盖的可能性。 建议遵循指南中概述的顺序。

    我将提出这一建议,非常感谢这一建议。

    9.如何确定传输完成? 是否轮询 TA 位或是否有中断有效? 假设您使用中断


    正确的、 在进行双次检查时、我发现 ISR 中的 TA 位被清除、这是我的错误。

    总之、处理 CAN 消息的方式似乎没有任何关键问题。 这既是好消息、也是坏消息、因为我仍然不知道存储器问题的根本原因。 如果我有任何严重问题、我将继续调查并再次发布。

    非常感谢您的支持!

    Laurent Badel