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万D:TMS320F2.8377万D Dcan寄存器

Guru**** 2587345 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/585135/tms320f28377d-tms320f28377d-dcan-register

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

你(们)好

在controlSuit中,CAN寄存器设置如下所示

为什么不喜欢这个呢

 它比使用HW_REG()。更方便

另一个问题是"HWREGH(Base + CAN_O_IF1CMD+2)= 0x00F3"这意味着将 DcanbRegs.CAN_IF1CMD寄存器设置为更高的16位,但为什么是"Base + CAN_O_IF1CMD+2",为什么不是"Base + CAN_O_IF1CMD+1"。

谢谢。

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

    您好,

    您当然可以使用位字段方法(例如 DcanbRegs.CANIF1ARB.ALL =(ID | 0xE0万);)。  我们使用controlSUITE示例中指出的编程方法的主要目标是使我们所有微控制器中的编码标准化。  您还可以参考Tommy在此链接中发布的有关这两种方法的线程( CCS/TMS320F2.8377万S: Setting Up a project )。

    关于CAN IF1CMD寄存器编程的下一个问题,由于2.8377万D的CAN模块硬件实施,它必须为"Base + CAN_O_IF1CMD+2"。  只能通过这种方式访问CAN模块寄存器。

    此致,

    约瑟夫

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

    感谢您的回答,我知道您的意思。

    是的,我已使用位字段方法(例如 DcanbRegs.CANIF1ARB.ALL =(ID | 0xE0万);),并完成调试,现在CAN模块工作正常,但我不知道是否存在隐藏的危险。

    使用(例如 DcanbRegs.CANIF1ARB.ALL =(ID | 0xE0万);)方法代码执行效率更高,因为使用此方法,汇编代码更加简洁。 您能告诉我使用HW_REG() mathod的优点,以及使用bitfield方法的缺点吗?

    第二个问题是,如果我们要写入Higer 16位的DcanbRegs.CAN_IF1CMD寄存器,我们应该写入HWREGH(ui32Base + CAN_O_IF1CMD +1),我认为“HWREGH(ui32Base + CAN_O_IF1CMD +1)"代表Dcanb_IF1Base的hW16位,但不能注册“RE1CMD”。

    非常感谢!

    此致,

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

    你好,摇摇着,

    HWREG的目的是在我们的微控制器上采用标准化的driverlib编码方法,对我们来说,这是一个优势,因为我们可以在2.8377万D或任何其他微控制器上使用此方法,而无需为每个微控制器系列创建唯一的位域结构。  我们确实提供了更高级别的函数调用,如CANMessageSet()或CANMessageSet(),这些函数应该更易于用户在其代码中实现,因此您不必担心位级编程。  如果比特字段方法更方便,则不会阻止您使用该方法。

    由于在2.8377万D (32位总线上的一个字节可寻址外围设备)中实现CAN模块的方式,偏移不符合规则。  这只是CAN模块的例外情况。    对于较高的16位IF1CMD寄存器[31:16],您必须使用  

    HWREG (ui32Base + CAN_O_IF1CMD + 2)。  例如,如果要设置CLRINTPND位,则应写入:

    HWREG(ui32Base + CAN_O_IF1CMD +2)= CAN_IF1CMD_CLRPND >> 16; 我知道这会让人困惑,但这是您必须对其进行编码才能绕过2.8377万D上的CAN实现的方式。

    此致,

    约瑟夫

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