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.

[参考译文] 编译器/TMS320F28075:DCAN 接口寄存器 IF1CMD 和 MSG_NUM 字段

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675568/compiler-tms320f28075-dcan-interface-register-if1cmd-and-the-msg_num-field

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

工具/软件:TI C/C++编译器

大家好、

我对 CAN_IF1CMD 寄存器的 MSG_NUM 位行为感到困惑。

当单步执行通过32位访问(MOVL)向寄存 器写入零的代码并在写入后读取寄存器时、读回的值不是0x00000000、而是0x00000020。 我知道 TRM 解释说0是无效的消息编号、但这是一个令人惊讶的结果、因为 C2000Ware_1_00_03_00中的 CAN_loopback 位字段示例 使用类似的代码:

CANaRegs.CAN_IF1CMD.ALL = 0;
(...)

//
//设置 Control、Mask 和 ARB 位,以便将它们传送到
//消息对象。
//
CANaRegs.CAN_IF1CMD.bit.Control = 1;
CANaRegs.CAN_IF1CMD.bit.ARB = 1;
CANaRegs.CAN_IF1CMD.bit.Mask = 1;
CANaRegs.CAN_IF1CMD.bit.DIR = 1;

(...)

//
//将数据传输到消息对象 RAM
//
CanaRegs.CAN_IF1CMD.bit.MSG_NUM = Objid; 

因此、在上面的第一条指令之后、从 CanaRegs.CAN_IF1CMD.all 读回的值将为0x00000020。 但是、当执行示例 CanaRegs.CAN_IF1CMD.bit.Control = 1时、实际生成的指令如下所示:

080e11:06C4 MOVL ACC、*+ XAR4[0]
080e12:5110 ORB AH、#0x10
080e13:1EC4 MOVL *+XAR4[0]、ACC 

因此、写入 CAN_IF1CMD 的值将为0x00100020、其中一个值的预期值为0x00100000。 我可以告诉大家、结果应该是触发接口寄存器的写入命令、将4行中每行的数据传输到32号报文对象、然后再传输一次、以获得由 Objid 给出的正确报文对象。

我想我缺少一些东西、您能帮我理解吗?

谢谢、

皮埃尔

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    皮埃尔
    我在器件上尝试过这个、看到了同样的东西。 让我更深入地探讨一下这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Haresh、
    您是否找到了调查此问题的时间?
    此致、
    皮埃尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    皮埃尔
    很抱歉、我无法及时回复。 我收到了同事的一些意见、只是想在回应之前尝试在器件上进行。 将在明天对此进行介绍。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hareesh、

    好的、同时我将整个配置作为单个32位写入来执行、以避免任何问题。 请在您对此问题有更深入的了解后立即通知我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    皮埃尔

    正确的做法是、最好将其作为单个32位写入进行处理。 我已提交一个错误、以更正此示例。 IFxCMD 不应全设为零、应通过32位写操作写入以避免出现问题。 由于当 MSG_NUM 字段被写入时、这将触发向/从报文对象传输到报文对象的寄存器或寄存器。 如果 MSG_NUM 在 IFxCMD 的高位之前被写入、那么您将面临执行错误操作的风险。

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

    Christopher、

    您是否还可以要求更正数据表? 最好添加几行来解释 IFxCMD 不应全部设置为零并且应使用32位写入来写入。  

    您还能澄清一下 driverlib 中使用的16位写入是否会遇到同样的问题吗? 有许多辅助函数会写入 IFxCMD、如下所示:

    HWREGH (CANA_base + CAN_O_IF1CMD + 2)=(CAN_IF1CMD_DIR | CAN_IF1CMD_ARB)>> 16;
    HWREGH (CANA_base + CAN_O_IF1CMD)= ui32ObjID 和 CAN_IF1CMD_MSG_M; 

    由于低16位仅包含 MSG_NUM 参数和 BUSY 位、并且所有配置位都位于高16位、我假设这种代码正常、但我仍然希望得到确认。

    此致、

    皮埃尔

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

    是的、我将请求添加一些额外的澄清。

    两个16位写入(只要您首先写入高16位)是可以接受的、并且不会导致问题。
    对于32位写入、我强烈建议使用内在函数"__byte_peripheral_32()"来保证32位写入不会被破坏。
    processors.wiki.ti.com/.../MCU_Compiler_v15

    这就是我们在最新的驱动程序库中使用的内容(请参阅 c2000ware\driverlib\f2807x\driverlib)。 我建议使用此 driverlib。

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

    Chris、

    我发布的代码片段使用了此内在函数、因为我使用了全局变量 CanaRegs、该变量基于具有 BP_16和 BP_32位字段成员的结构。

    我知道 driverlib、但对我来说开销太大、我不想用数百个宏替换控制套件的存储器映射结构。

    此致、

    皮埃尔

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

    是的、您答对了、位字段 CanaRegs 确实使用了内在函数。

    您是否想进一步探讨您对使用 driverlib 的关注? 您能否说明您所指的开销?
    您可以在同一个项目中同时使用 driverlib 和位字段结构。 我们有一些空示例在 C2000Ware 中展示了这一点。
    此外、本应用手册将更深入地介绍 driverlib 与位字段方法: http://www.ti.com/lit/spraa85

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

    Christopher、

    我记得几年前阅读过该应用手册。 不过、我不认为它以前有过有关 driverlib 的部分。 不管怎样、在当前形式中、本注释首先非常有力地说明了 bitfield 方法基本上在各个方面优于预处理器指令、然后在整个第8章中解释了 bitfield 方法实际上并不是那么好。 至少可以说、这是令人困惑的。

    此外、只要我负担得起、我就不会启用 TI 编译器优化;优化错误带来的不良体验太多。  

    此致、

    皮埃尔

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

    当然、bitfield 和 driverlib 方法之间存在各种权衡。 driverlib 的性能最佳、至少启用了一些优化、因此如果您不打算使用优化、我可以理解保留了位字段。 我非常感谢您对应用手册的反馈、并在下一版文档中记录了该应用手册。 谢谢!

    此致
    Chris