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.

[参考译文] LAUNCHXL-F280039C:集成 CAN 错误状态

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1201737/launchxl-f280039c-intepretation-of-can-error-status

器件型号:LAUNCHXL-F280039C
主题中讨论的其他器件: C2000WARE

您好!

使用  LAUNCHXL-F280039C LaunchPad、 我将运行 C2000ware4.03 /英语/ 器件/ F28003x / F280039C /    示例/ CAN 中提供的 CAN 通信代码示例"CAN_Ex5_Transmit_RECEIVE"

从 can_ex5_transmit_receive.c 中的文档注释可以看出下面的要求

//! \b Hardware \b Required \n
//!  - A C2000 board with CAN transceiver.
//!
//! \b External \b Connections \n
//!  - ControlCARD CANA is on DEVICE_GPIO_PIN_CANTXA (CANTXA)
//!  - and DEVICE_GPIO_PIN_CANRXA (CANRXA)

 F280039C LaunchPad 具有板载 CAN 收发器、支持使用手册、因此我假设它已经满足硬件要求。 我没有找到 DEVICE_GPIO_PIN_CANTXA、大概是因为它没有板载 CAN 收发器。 我按连接 launchpad 的方式  

BeagleBone GREEN == CAN 收发器(这 BBG 需要)==(总线线)== F280039C CAN 引脚(Hi/Lo/GND ) ,正如我在另一篇文章 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1201564/launchxl-f280039c-question-about-the-f28003x-launchpad-can-pins-connection-gnd-pin 中提到的  ,所以想法是将 F280039C 作为 CAN 发送器,将 BBG 作为接收器 CAN 节点。  

现在、 CAN_Ex5_Transmit_Receive.c 将被构建(CPU1_launchxl_flash)并加载到 F280039C 中、并且 BBG 已在正确的引脚(GPIO 24、26)上配置了其 CAN1通道、CAN 收发器/连接所有引脚。 在调试模式下运行代码、未看到预期输出(从 CAN_Ex5_Transmit_receive.c 代码来看、 F280039C 应发送一个 CAN 帧、该帧可以在 BBG 侧转储、但不显示任何内容)。  

通过逐步调试、我会遇到这样的情况

在这一行(在 canaISR()函数中)之后:

//
        // Read the controller status.  This will return a field of status
        // error bits that can indicate various errors.  Error processing
        // is not done in this example for simplicity.  Refer to the
        // API documentation for details about the error status bits.
        // The act of reading this status will clear the interrupt.
        //
        status = CAN_getStatus(CANA_BASE);

 根据观察窗口, status (从 can_getStatus(Cana_base )返回)变量的值为229。

根据 can.h、STATUS 应该是 CAN 错误和状态寄存器 CAN_ES 的读取值、 从 hw_can.h 中、CAN_ES 的位为

//*************************************************************************************************
//
// The following are defines for the bit fields in the CAN_ES register
//
//*************************************************************************************************
#define CAN_ES_LEC_S   0U
#define CAN_ES_LEC_M   0x7U     // Last Error Code        0000000000000111
#define CAN_ES_TXOK    0x8U     // Transmission status    0000000000001000
#define CAN_ES_RXOK    0x10U    // Reception status       0000000000010000
#define CAN_ES_EPASS   0x20U    // Error Passive State    0000000000100000
#define CAN_ES_EWARN   0x40U    // Warning State          0000000001000000
#define CAN_ES_BOFF    0x80U    // Bus-Off State          0000000010000000
#define CAN_ES_PER     0x100U   // Parity Error Detected  0000000100000000
                                                          0000000011100101 229

为了便于阅读、我只编辑二进制值、而不是从原始文件中进行编辑。 我的问题是  

1) 1)为什么状态可以是229? 似乎它不是一个或多个错误位的组合

2)更重要的是,如何完成状态229即0000000011100101?

感谢您的答复。

此致、

Wei

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

    尊敬的 Wei:

    根据 CAN_ES 值、存在总线关闭状态、这意味着由于错误计数器超过允许的数量、节点被切断。  如果 CAN 线路连接中存在中断、通常会发生这种情况、因为它不允许接收节点确认已接收帧。  在进行测试时、请验证代码中使用的正确 CAN GPIO 通道是否与 Launchpad 中的板载收发器一致。  基于 LP 原理图的默认连接为 GPIO5=CANRX 和 GPIO4=CANTX:

        //
        // Initialize GPIO and configure GPIO pins for CANTX/CANRX
        // on module A.
        //
        Device_initGPIO();
        GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
        GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);
    

    在代码中、检查 GPIO5是否分配给了 DEVICE_GPIO_CFG_CANRXA、GPIO4是否分配给了  DEVICE_GPIO_CFG_CANTXA。

    此致、

    约瑟

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

    Wei、

             请看一下 www.ti.com/lit/SPRACE5中的调试提示。 通过查看此检查清单、可以解决大多数 CAN 问题。 另请观看该视频: https://training.ti.com/getting-started-dcan-module

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

    感谢您的回复。  从 device.h 确认、GPIO5分配给 DEVICE_GPIO_CFG_CANRXA、GPIO4分配给 DEVICE_GPIO_CFG_CANTXA。  

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

    感谢您的回复。

    我通过上面的链接观看了这个视频、并按照视频中显示的2个 LaunchPad 的 CAN 通信方式进行操作。 连接似乎很简单、使用跳线分别连接2个 LAUNCHXL-f280039c 的 CAN 引脚。  

    另外、我遵循 SPRACE5文档、并确保设置了 targetConfigs、预定义符号和 JTAG 模式。

    我正在使用  C2000ware /../  f280039c/driverlib/can/中的 can_ex5_transfer_receive 示例、唯一修改是注释掉其中一个 Launchpad 的#define transmit、因此它将用作接收器。  

    到目前为止、仍然没有获得预期的行为、从发送器 launchpad 的方面来说、它会在处卡住  

    while(txMsgSuccessful);

    与昨天我尝试 Launchpad 和 BeagleBone 之间的 CAN 通信的情况相同。

    当我获得万用表/示波器时、我将 按照 SPRACE5中的其他调试检查清单项进行操作、但不确定在此之前可以检查哪些其他项。

    另一件让我感到困惑的事情是、我已在 C 代码中切换了多个断点、而调试中的行为似乎不时会发生变化(我的意思是、有时它会停止执行、但有时断点可能不存在)。 观察结果:

    ——main () func 中的断点似乎是一致的

    在 canisr() func 中的断点曾经工作,但现在不工作。 如果不更改代码、唯一可能的解释就是执行由于某种原因没有到达中断(应该会调用 canISR);什么因素(硬件、软件)可能会导致这种情况? 是否可以逐步显示 canISR()是否被调用? 我目前尝试过,代码没有进入 canISR()。

    ---当我做 launchpad-lanchpad 可以通信实验  CAN_Ex5_TRANSMIT_RECEIVE 示例,如果接收器 launchpad 处于调试模式(可能有断点),这是否会影响传输? 现在我在调试模式下运行两个 lpd。

    感谢您的观看。

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

    大家好、我发现了 launchpad-launchpad CAN 通信失败的根本原因:CAN 路由开关。 在两个 Launchpad 上将其按下(接通)后、现在 CAN 通信示例按预期运行。  

    感谢您的答复。

    此致、

    Wei