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.

[参考译文] TMS320F28377S:CAN 配置问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/903387/tms320f28377s-can-configuration-issue

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

我正在尝试通过观察窗口确认我的 CAN 配置、但似乎没有更新任何寄存器或存储器。

我将以与 C200ware 示例 CAN_loopback_bitfields_cpu01中类似的方式配置 CANA。  我正在设置 CAN_CTL Init 和 CCE 位、并且可以在观察窗口上看到此更新。 当我写入 CAN_BTR 寄存器时、我在观察窗口中观察到寄存器没有变化。  其他寄存器似乎也没有设置、当我通过存储器浏览器观察 CANA 消息 RAM 时、我看到它没有变化。   

我还尝试以 C200ware exmaple CAN_external_transmit cpu01中使用的方式设置 CAN_BTR、并观察到类似的结果。   

我做了什么错误、或者我错过了什么?

提前感谢您的任何见解。

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

    尊敬的 Andrew:

    如果有一种方法可以将应用移植到使用 driverlib 函数和示例(在 C2000Ware 根目录/driverlib/f2837xs/examples/cpu1/cA/…中)、我强烈建议您这样做。  已弃用 bitfield 函数和示例、并且不提供大量支持。  我怀疑您看到的是与旧位字段结构进行寄存器映射的结果。


    无论如何、下面是一个快速建议来查看它是否确实是一个寄存器显示映射问题(但是在执行以下步骤之前、为了使 CAN_BTR 寄存器可写、必须设置 CAN_CTL 中的 CCE 和 Init 位):

       -添加此声明:struct can_regs *canregs;

       -将其添加到您的代码中:canregs =&CanaRegs.CAN_BTR;

    上述代码片段仅将 CAN_BTR 的地址分配给变量寄存器。  在表达式窗口中、添加 canregs。  执行上述代码后、canregs 地址的值将显示在 Expressions 窗口中。  转至内存浏览器并键入 canregs 的地址。  在写入位时序参数时、查看存储器窗口是否显示 CAN_BTR 的更新值。  给这个机会、让我知道。

    此致、

    Joseph

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

    Joseph、

    我已经做了以下声明:

    volatile struct CAN_regs     *康雷格斯;
    volatile union CAN_BTR_REG *坎本;

    注意: 我添加了*canbtr 作为保险、因为我收到编译器警告、"volatiule union CAN_BTR_REG 类型无法分配给"volatile struct CAN_regs"类型的实体;但它按计划工作。   

    并在我的代码中实现了以下行:

    canregs =&CanaRegs.CAN_BTR;
    CANBtr  =&CANaRegs.CAN_BTR;

    易失性 UINT32 BTRupdate = (UINT32) BRP_VAL         \
                         +((UINT32) SJW_VAL<<6)     \
                         +(((UINT32) TSEG1_VAL <<8)  \
                         +(((UINT32) TSEG2_VAL <<12) \
                         +(((uint32) BRPE_VAL<<16);


    CanaRegs.CAN_BTR.All = BTRupdate;

    执行上述行后的表达式和内存浏览器窗口如下所示:

    请注意、CANGS 和 CANBtr 均设置为地址0x00048006、这不是 CAN_BTR 地址、应为0x00048000C。  这是问题吗?

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

    尊敬的 Andrew:

    是的、这是 CAN 位字段标头的问题、因为寄存器视图会误导开发者。  寄存器实现是每隔32位字执行一次、但在寄存器视图中未正确显示。  在 driverlib 中、这些偏移在 inc/hw_ca.h 中预定义:

    //
    //
    //为 CAN 寄存器偏移定义了以下内容
    //
    //
    #define CAN_O_CTL 0x0U // CAN 控制寄存器
    #define CAN_O_ES 0x4U //错误和状态寄存器
    #define CAN_O_ERRC 0x8U //错误计数器寄存器
    #define CAN_O_BTR 0xCU //位时序寄存器
    #define CAN_O_INT 0x10U //中断寄存器
    #define CAN_O_TEST 0x14U //测试寄存器
    #define CAN_O_PERR 0x1CU // CAN 奇偶校验错误代码
    //注册
    #define CAN_O_RAM_INIT 0x40U // CAN RAM 初始化

    :...等等...

    此致、

    Joseph

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

    Joseph、

    感谢您提供的信息、现在有很多道理。   

    我已经成功地对寄存器进行了如下编程:

    UNION  CAN_BTR_REG      *pcAN_BTR;

    CAN.A.PCAN_BTR      =(UNION  CAN_BTR_REG      *)(CANA_base + CAN_O_BTR);

    这样我就可以访问位字段、至少出于调试目的。  我注意到、写入操作作为32位字执行时、似乎只能可靠地执行、这有道理吗?

    还有一个问题。  邮箱1和2是否仅限于传输? 我可以看到、当我将邮箱0的消息 RAM 配置为 TX 时、它被正确配置、但是如果我将邮箱1配置为 Rx、我不会获得预期结果(RAM 从零开始)。

    谢谢、

    Andy

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

    Andrew、

    所有32个邮箱都可配置为发送或接收。  所有邮箱都不是只能用于发送或接收的。

    此致、

    Joseph