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.

[参考译文] TMS320F280025:上电后 CAN 接收存在问题

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1186562/tms320f280025-problem-with-can-receive-after-power-up

器件型号:TMS320F280025

F280025上的 CAN 0存在一个奇怪的问题(如果它起作用、则为80引脚)。

如果处理器正常通电(即施加3.3V 电压)。  发送 CAN 消息似乎还可以、但无法接收任何内容。  如果我复位处理器(将 XRSn 拉为低电平)、则它可以工作(或者如果我在启动期间将 XRSn 保持为低电平)。  其他一切似乎都正常(从闪存正确引导、PWM 正常工作、ADC 功能等)。   当运行一个调试器时、我永远不会遇到这个问题(我猜是因为它会切换 XRSn)。

我将使用所有推荐的 XRSn 和3.3做法、这些做法的速度非常快、并且非常稳定。  

我可以正确地检测到我没有接收到数据、并尝试重新初始化 CAN0、但它不起作用。 只有将 XRSn 拉至低电平有效。  我还尝试使用仿真的 XRSn 在启动时复位处理器... 这也不起作用...   

我在 F280049或其他 C2000处理器上没有遇到此问题。  有没有关于如何解决此问题的想法?

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

    您好、Kyle、

    这可能是一个启动问题、完全与基于您刚才描述的行为的 CAN 无关。  当不关闭调试器时、您能否通过 xRSN 引脚来查看是否有周期性切换?  另请参阅以下 TRM 中的引导流程图片段:

    从调试器 A 和 POR/xRSN 复位等启动时有一个不同的流程。  首先要检查的一点是、如果您不使用看门狗、看它是否被禁用、或者如果您使用看门狗、看它是否被处理、否则您可以在 XRSN 引脚上观察到周期性复位。

    此致、

    Joseph

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

    我已经将 XRSn 引脚与3.3V 进行了比较、它后跟大约1ms 的延迟、然后是坚如磐石的(无干扰)。   

    我正在使用看门狗(延迟很长)、但我可以确认它不会触发、因为所有其他系统都已启动并正在运行、并且我有一个运行时计数器仍在计数而不进行复位。  我们将尝试将其关闭、以查看是否会产生影响。  请尽快了解。

    我们找到了另一种使其正常工作的方法... 在上电时保持 XRSn 引脚为低电平、然后释放(使用按钮)。  尝试使上拉电阻器变大以降低此引脚的启动速度、但它仍然会导致 CAN 接收问题。   

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

    您好、Kyle、

    是否有关闭 WD 的进一步发现?  顺便说一下、在您的启动流程中、您是否确保 CAN 初始化是要执行的第一个例程之一?  代码可能会提前分支并绕过 CAN 初始化例程。

    此致、

    Joseph

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

    尝试 WD 关闭... 无帮助。  相同的行为..

    CAN 正在初始化... 再说一次、我看到的是来自电路板的传输、只是没有接收到任何内容。  此外、如果它在4秒内未收到任何内容、它会强制重新初始化。

    我想、由于 CAN 时序相当精确、可能是晶体校准不够准确、无法使 CAN 正常工作。  也不是这样。

    我使用200kHz PWM 来查看时序是否有任何不同。  不是。

    我尝试使用内部振荡器来查看、200kHz 的时序显示为202.5kHz、这不是完美的。  但是、可以具有相同的行为。  如果不手动按下电路板上的复位按钮、将无法正常工作... 即使计时也关闭、它也能正常工作。

    这是 init 函数。  它与示例基本相同...

    void Comms_SetupCAN0(void)
    {
        uint16_t i;
        //Setup the Pins:
        GPIO_SetupPinMux(CAN_0_RX_GPIO, GPIO_MUX_CPU1, CAN_0_RX_MUX);
        GPIO_SetupPinOptions(CAN_0_RX_GPIO, GPIO_INPUT, GPIO_ASYNC);
    
        GPIO_SetupPinMux(CAN_0_TX_GPIO, GPIO_MUX_CPU1, CAN_0_TX_MUX);
        GPIO_SetupPinOptions(CAN_0_TX_GPIO, GPIO_OUTPUT, GPIO_PUSHPULL);
    
        //
        // Initialize the CAN controllers
        //
        CAN_initModule(CAN_0_BASE);
    
        //
        // Set up the CAN bus bit rate to 250kHz for each module
        // Refer to the Driver Library User Guide for information on how to set
        // tighter timing control. Additionally, consult the device data sheet
        // for more information about the CAN module clocking.
        //
        //CHECK Bit timining value for this CAN speed
        CAN_setBitRate(CAN_0_BASE, DEVICE_CLOCK_SPEED, CAN_0_SPEED, 20);
    
        //
        // Enable interrupts on the CAN A peripheral.
        //
        //TCHECK and use proper interrupts
        //CAN_enableInterrupt(CAN_int_BASE, CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS);
        HWREG_BP(CAN_0_BASE + CAN_O_CTL) |= CAN_INT_IE0;// | CAN_INT_ERROR; //| CAN_INT_STATUS;
        //
        // Enable CAN test mode with external loopback
        //
        //CAN_enableTestMode(CAN_int_BASE, CAN_TEST_EXL);
    
         //
        // Interrupts that are used in this example are re-mapped to
        // ISR functions found within this file.
        // This registers the interrupt handler in PIE vector table.
        //
        //
        // Enable the CANinterrupt on the processor (PIE).
        //
        EALLOW;
        CAN_0_INTERRUPT_LOCATION = Coms_Can0ExternalInterrupt;
        CAN_0_INTERRUPT_ENABLE;
    
        EDIS;
        //
        // Enable the CAN-A interrupt signal
        //
        CAN_enableGlobalInterrupt(CAN_0_BASE, CAN_GLOBAL_INT_CANINT0);
    
        //Setup Mailbox:
        //Setup the mail boxes:
        //Setup the standard boxes for standard messages, accept all:
        for(i = FIRST_MAILBOX_FOR_STANDARD_MESSAGES; i < FIRST_MAILBOX_FOR_EXTENDED_MESSAGES; i++ )
        {
            //Accept all standard messages:
            // Message Object Parameters:
                //      CAN Module: A
                //      Message Object ID Number: 1
                //      Message Identifier: 0x1FFFFFFF
                //      Message Frame: Std
                //      Message Type: Receive
                //      Message ID Mask: 0x00000000 //No bits are used to reject messages
                //      Message Object Flags: UMask, MXtd, MDir
                //      Message Object flag CAN_MSG_OBJ_USE_ID_FILTER enables usage
                //       of msgIDMask parameter for Message Identifier based filtering
                //      Message Data Length: 0  //Don't care
            CAN_setupMessageObject(CAN_0_BASE, i,
                                   0x1FFFFFFF,
                                   CAN_MSG_FRAME_STD,
                                   CAN_MSG_OBJ_TYPE_RX,
                                   0x0,
                                   (CAN_MSG_OBJ_USE_ID_FILTER | CAN_MSG_OBJ_NO_FLAGS | CAN_MSG_OBJ_RX_INT_ENABLE),
                                   0);
        }
    
        for(i = FIRST_MAILBOX_FOR_EXTENDED_MESSAGES; i <= LAST_MAILBOX_FOR_EXTENDED_MESSAGES; i++ )
        {
            //Accept all Extended messages:
            // Message Object Parameters:
            //      CAN Module: A
            //      Message Object ID Number: 1
            //      Message Identifier: 0x1FFFFFFF
            //      Message Frame: Extended
            //      Message Type: Receive
            //      Message ID Mask: 0x00000000 //No bits are used to reject messages
            //      Message Object Flags: UMask, MXtd, MDir
            //      Message Object flag CAN_MSG_OBJ_USE_ID_FILTER enables usage
            //       of msgIDMask parameter for Message Identifier based filtering
            //      Message Data Length: "Don't care" for a Receive mailbox
            CAN_setupMessageObject(CAN_0_BASE, i,
                                       0x1FFFFFFF,
                                       CAN_MSG_FRAME_EXT,
                                       CAN_MSG_OBJ_TYPE_RX,
                                       0,
                                       (CAN_MSG_OBJ_USE_ID_FILTER | CAN_MSG_OBJ_NO_FLAGS | CAN_MSG_OBJ_RX_INT_ENABLE),
                                       0);
        }
    
        //
        // Start CAN module A operations
        //
        CAN_startModule(CAN_0_BASE);
    
        //Flush the Outgoing CAN Buffer:
        CAN_fifo_init(&Outgoing_CAN0);
    
        for(i = 0; i < (NUMBER_OF_TRANSMIT_MAILBOXES); i++ )
        {
    
            Can0MailBoxTransmittingStatus[i] = false;
        }
    }

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

    只是想对以下陈述进行一些澄清:"我看到的是来自电路板的传输、只是没有收到任何东西"。  在 CAN 初始化设置中、所有消息对象都定义为 CAN_MSG_OBJ_TYPE_RX、因此我假设 CAN 仅配置为接收 CAN 帧、而不设置为发送帧。  当您说您看到电路板的传输时、是否在 TX 线上观察到这种情况?  这可能是 CAN 向 CAN 总线发回一些错误帧。

    最好查阅 CAN_ES 寄存器的值以查看错误是什么、但这会比较棘手、因为问题仅在没有调试器的情况下发生、您需要调试器查看寄存器值、但这可能起作用:  请勿连接调试器并为电路板加电、在您为代码运行留出足够的时间后、将调试器和目标连接到 Code Composer、然后使用"Registers"视图、 查看错误寄存器 CAN_ES 和中断挂起寄存器 CAN_IPEN_21的内容、以查看是否存在错误或任何等待处理的挂起中断、以及是否可能导致溢出。

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

    Joseph、

     "我看到电路板的传输、只是没有收到任何东西"- 这意味着 CAN 网络上的其他器件看到来自此电路板的消息。 (我将进一步介绍完整的消息、例如、它将发送一条完整的消息、提供组件 A 的电压。 不是错误帧) 无论出于何种原因、TI 芯片似乎都正确地"确认"了来自其他器件的消息、 但实际上看不到消息(RX 中断未触发?)、除非处理器已手动复位。

    "所有消息对象都定义为 CAN_MSG_OBJ_TYPE_RX、因此我假设 CAN 仅配置为接收 CAN 帧"

    这不是真的。  我为扩展 PID 接收设置了一些邮箱、为标准 pid 接收设置了一些邮箱。  我保留3个发送框。   

    我在启动后尝试连接...  您是否有一个合适的指南? 我在论坛上看到了各种不同的成功方式。  连接时、我的处理器通常会重新启动。  

    我可以尝试将 CAN_ES 寄存器导出为发送消息、因为我正在获取这些消息、并查看 是否发生了怪异的情况。

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

    Kyle、

    好的、明白了。  是的、最好发送 CAN_ES 内容以及 CAN_IPEN_21寄存器、以便查看是否有挂起的中断。  在调试器重新连接时、首先从目标配置中删除 GEL 文件。  GEL 文件通常具有在检测到连接时重新启动处理器的命令。  这是通过"Tools"(顶部菜单上的第5个功能区)和选择 GEL Files 来完成的。  将弹出一个窗口并显示 GEL 文件。  右键单击 GEL 文件并选择"Remove"。  只要您不退出 CCS 或重新加载目标、这将临时删除加载的目标配置中的 GEL 文件。  如果重新加载目标配置、GEL 文件仍将存在。  然后、在电路板上执行 POR 后、您可以在没有 GEL 文件的情况下重新连接目标。

    此致、

    Joseph