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.

[参考译文] SK-TDA4VM:MCAN5 和 MCAN9 的总线关闭状态

Guru**** 2431030 points
Other Parts Discussed in Thread: SK-TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1539708/sk-tda4vm-bus-off-status-for-mcan5-and-mcan9

器件型号:SK-TDA4VM


工具/软件:

您好、

我在定制电路板上使用 SDK:RTOS-09_02_00_05、该定制电路板具有与 SK-TDA4VM 相同的原理图 (MCU_MCAN0、MCAN0、MCAN5 和 MCAN9)。

所有三个主域 CAN (MCAN0、MCAN5、MCAN9) 都进行初始化和配置。 但是、只有 MCAN0 工作、另外两个主 CAN:MCAN5 MCAN9 持续报告总线关闭错误: MCAN_ERR_CODE_BIT0_ERROR。 使用探头 Rx 和 Tx 线路始终为 3.3V。 例如、我们使用 mcan_evm_loopback_app_main_k3.c 代码。 收发器为 TCAN1046、这意味着应将 STB 下拉以实现正常模式。 这是有效的、但 CAN_H 和 CAN_L 仍然是隐性模式。

使用的引脚配置:

static pinmuxPerCfg_t gMcan0PinCfg[] =
{
    /* MyMCAN0 -> MCAN0_RX -> W5 */
    {
        PIN_MCAN0_RX, PIN_MODE(0) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyMCAN0 -> MCAN0_TX -> W6 */
    {
        PIN_MCAN0_TX, PIN_MODE(0) | \
        ((PIN_PULL_DISABLE) & (~PIN_PULL_DIRECTION & ~PIN_INPUT_ENABLE))
    },
    {PINMUX_END}
};

static pinmuxPerCfg_t gMcan5PinCfg[] =
{
    /* MyMCAN5 -> MCAN5_RX -> AE21 */
    {
        PIN_PRG1_PRU0_GPO18, PIN_MODE(6) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyMCAN5 -> MCAN5_TX -> AJ21 */
    {
        PIN_PRG1_PRU0_GPO17, PIN_MODE(6) | \
        ((PIN_PULL_DISABLE) & (~PIN_PULL_DIRECTION & ~PIN_INPUT_ENABLE))
    },
    {PINMUX_END}
};
static pinmuxPerCfg_t gMcan9PinCfg[] =
{
    /* MyMCAN9 -> MCAN9_RX -> AC27 */
    {
        PIN_PRG0_PRU0_GPO8, PIN_MODE(6) | \
        ((PIN_PULL_DISABLE | PIN_INPUT_ENABLE) & (~PIN_PULL_DIRECTION))
    },
    /* MyMCAN9 -> MCAN9_TX -> AC28 */
    {
        PIN_PRG0_PRU0_GPO7, PIN_MODE(6) | \
        ((PIN_PULL_DISABLE) & (~PIN_PULL_DIRECTION & ~PIN_INPUT_ENABLE))
    },
    {PINMUX_END}
};



有任何建议、为什么 MCAN5 和 MCAN9 无法正常工作?

此致、
Tamas

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

    您好:

    [报价 userid=“600131" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1539708/sk-tda4vm-bus-off-status-for-mcan5-and-mcan9

    所有三个主域 CAN (MCAN0、MCAN5、MCAN9) 都进行初始化和配置。 但是、只有 MCAN0 工作、另外两个主 CAN:MCAN5 MCAN9 持续报告总线关闭错误: MCAN_ERR_CODE_BIT0_ERROR。 使用探头 Rx 和 Tx 线路始终为 3.3V。 例如、我们使用 mcan_evm_loopback_app_main_k3.c 代码。 收发器为 TCAN1046、这意味着应将 STB 下拉以实现正常模式。 这是有效的、但 CAN_H 和 CAN_L 仍然是隐性模式。

    [/报价]

    MCAN5 和 MCAN9 与 MCAN0 相同、没有任何不同。

    这应该是应用问题、您的引脚多路复用器看起来仅正确、但  提到的 mcan_evm_loopback_app_main_k3.c 应用程序是基于 MCAN0 和 MCU_CAN0 编写的。 您能和我分享您的最新应用程序更改以及 MCAN5 和 MCAN9 的核心寄存器转储吗?

    您还可以比较 CAN0 和 CAN5、CAN9 的寄存器

    此致

    Tarun Mukesh

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

    一些更新!

    第一条 CAN 消息成功传输、没有任何问题。 然而,在这之后,我始终遇到lastErrorCode: (5) Bus_Off的状态。

    我已经多次重新启动电路板、在某些情况下、第一条和第三条消息在进入 Bus_Off 之前成功发送。

    我还尝试了在传输之间增加延迟、但这没有影响。 此外、我在每次传输后都尝试复位或重新初始化 MCAN 模块、但该方法也无法解决问题。

    有任何建议吗?
    此致、
    Tamas

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

    您好、Tamas、

    感谢您的最新更新。 这清除了我的大部分事情,如果你的第一条消息被成功地收到然后所有你的配置,引脚复用,初始化等... 一切都很好。

    我还尝试了在传输之间增加延迟、但这没有影响。 此外、我在每次传输后都尝试重置或重新初始化 MCAN 模块、但该方法也无法解决问题。

    这不能解决问题。 我强烈怀疑软件中没有问题、但硬件中没有问题。 这可能是由于其他一些人重新使用进入 CAN 收发器的 GPIO0 引脚或接线问题所致。 由于 MCAN5 和 MCAN9 位于同一 CAN 收发器上、并且工作方式不同 、因此强烈怀疑存在硬件问题。

     如果你得到 CAN 总线关闭,在示例应用程序中没有 CAN 总线恢复机制。 因此,你必须确定为什么 CAN 总线关闭正在发生.

    错误代码 5 表示 CAN 节点已进入总线关闭状态、这意味着它已与 CAN 总线断开连接、无法再发送或接收数据。  当 CAN 节点的发送错误计数器超过 255 时、将触发此状态。
     处于总线关闭状态的 CAN 节点实际上被禁用、不能 参与网络通信。  当 CAN 节点在传输过程中出现过多错误时、其发送错误计数器会增加。
     如果此计数器达到 256 或更多、则节点进入“总线关闭“状态。  一旦节点处于总线关闭状态、它就无法发送或接收任何 CAN 消息、并且不会生成错误标志。
     若要恢复通信、通常需要复位 CAN 节点。  可通过硬件复位(下电上电)或必须运行命令序列的软件来完成此操作。
    要解决此问题、您可以检查接线、确保正确端接、检查传感器并验证 CAN 收发器。
    此致
    Tarun Mukesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦、这解释了一些错误! 谢谢。  
    同时、我想在 MCAN5 和 MCAN9 之间使用外部环回来测试通信。 我点击了以下链接: 【常见问题解答】TDA4VM:通过中断路由器路由中断 、但我不确定如何设置 ISR 来从 MCAN5 和 MCAN9 接收中断。  
    我 插入了以下函数、但不确定如何连接输入端和源端:

    static int32_t MCUCAN_regiterISR(uint32_t intNum, void f(uintptr_t))
    {
       int32_t configStatus = STW_SOK;
        OsalRegisterIntrParams_t    intrPrms;
        OsalInterruptRetCode_e      osalRetVal;
        HwiP_Handle                 hwiHandle = NULL;
    
        /* Enable CPU Interrupts and register ISR */
        Osal_RegisterInterrupt_initParams(&intrPrms);
        /* Populate the interrupt parameters */
        intrPrms.corepacConfig.arg              = (uintptr_t) NULL;
        intrPrms.corepacConfig.isrRoutine       = f;
        intrPrms.corepacConfig.priority         = 1U;
        intrPrms.corepacConfig.corepacEventNum  = 0U;
        intrPrms.corepacConfig.intVecNum        = intNum;
    
        /* Register interrupts */
        osalRetVal = Osal_RegisterInterrupt(&intrPrms, &hwiHandle);
        if(OSAL_INT_SUCCESS != osalRetVal)
        {
            configStatus = CSL_EFAIL;
            techtra_uart_write(DEBUG_UART, "Error in registering ISR!!!");
        }
        return configStatus;
    }
    
    static int32_t MCAN_CfgIrqRouterMain2Mcu(uint32_t devId, uint32_t offset, uint32_t dest_id, uint32_t intNum)
    {
        int32_t retVal;
        struct tisci_msg_rm_irq_set_req     rmIrqReq;
        struct tisci_msg_rm_irq_set_resp    rmIrqResp;
    
        rmIrqReq.valid_params           = TISCI_MSG_VALUE_RM_DST_ID_VALID;
        rmIrqReq.valid_params          |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
        rmIrqReq.src_id                 = devId;
        rmIrqReq.global_event           = 0U;
        rmIrqReq.src_index              = offset;
        rmIrqReq.dst_id                 = TISCI_DEV_MCU_R5FSS0_CORE0;
        rmIrqReq.dst_host_irq           = intNum;
        rmIrqReq.ia_id                  = 0U;
        rmIrqReq.vint                   = 0U;
        rmIrqReq.vint_status_bit_index  = 0U;
        rmIrqReq.secondary_host         = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
        retVal = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, 0x10000);//SCICLIENT_SERVICE_WAIT_FOREVER);
        if(CSL_PASS != retVal)
        {
            uart_write(DEBUG_UART, "Error in SciClient Interrupt Params Configuration!!!");
            snprintf(buffer, sizeof(buffer), "offset: %d \n", offset);
            uart_write(DEBUG_UART, buffer);
        }
        else
        {
            snprintf(buffer, sizeof(buffer), 
                    "SciClient Interrupt Params Configuration passed for intNum: %08X \n", intNum);
            uart_write(DEBUG_UART, buffer);
        }
        return retVal;
    }

    以下参数必须是什么:rmIrqReq.src_id、 rmIrqReq.src_index、rmIrqReq.dst_host_IRQ 

     rmIrqREQ_dst_id = TISCI_DEV_MCU_R5FSS0_CORE0 是否正确 


    此致、
    Tamas

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

    您好、Tamas、

    让我们将这一主题保留在传输问题上。

    与此同时、我想使用 MCAN5 和 MCAN9 之间的外部环回来测试通信。 我点击了以下链接: 【常见问题解答】TDA4VM:通过中断路由器路由中断 、但我不确定如何设置 ISR 来从 MCAN5 和 MCAN9 接收中断。  
    我已 插入以下函数、但不确定如何连接输入和源:

    我请求在外部回环和中断路由上生成另一个线程,因为线程“总线关闭“的描述偏离了。

    感谢您的理解。

    此致

    Tarun Mukesh

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

    好的、谢谢!

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

    抱歉、错误仍然存在。 我已经打印出中断寄存器 (MCAN_IR):

    0xb800000 = 1011 1000 0000 0000 0000 0000
    该位为:位 24 - EW — 错误警告状态
               位 25 - BO - Bus_Off 状态
               位 26 - WDI — 看门狗中断
               位 28 - PED — 数据段中的协议错误

    我还应该读取哪个寄存器?  

    此致、
    Tamas

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

    您好:

    抱歉、错误仍然存在。 我已打印出中断寄存器 (MCAN_IR):

    什么错误仍然存在? 我不知道为什么它的工作有时很好,它正在变得非常不确定甚至建议解决方案。

    系统进入总线关闭后、在列出的寄存器中不会出现活动错误、因此在总线关闭之前、您面临什么错误?

    此致

    Tarun Mukesh

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

    Hy Tarun、

    让我们总结一下。 使用以下参数以相同的方式配置 MCAN5 和 MCAN9:

            /* Initialize MCAN Init params */
            initParams.fdMode          = 0x0U;
            initParams.brsEnable       = 0x0U;
            initParams.txpEnable       = 0x1U;
            initParams.efbi            = 0x0U;
            initParams.pxhddisable     = 0x0U;
            /* To enable automatic retransmission of the packet,
             * program initParams.darEnable to "0" */
            initParams.darEnable       = 0x0U;
            initParams.wkupReqEnable   = 0x0U;
            initParams.autoWkupEnable  = 0x0U;
            initParams.emulationEnable = 0x0U;
            initParams.emulationFAck   = 0x0U;
            initParams.clkStopFAck     = 0x0U;
            initParams.wdcPreload      = 0xFFU;
            initParams.tdcEnable       = 0x1U;
            initParams.tdcConfig.tdcf  = 0xAU;
            initParams.tdcConfig.tdco  = 0x6U;
    
            /* Initialize MCAN Config params */
            configParams.monEnable         = 0x0U;
            configParams.asmEnable         = 0x0U;
            configParams.tsPrescalar       = 0xFU;
            configParams.tsSelect          = 0x0U;
            configParams.timeoutSelect     = MCAN_TIMEOUT_SELECT_CONT;
            configParams.timeoutPreload    = 0xFFFFU;
            configParams.timeoutCntEnable  = 0x0U;
            configParams.filterConfig.rrfs = 0x1U;
            configParams.filterConfig.rrfe = 0x1U;
            configParams.filterConfig.anfe = 0x1U;
            configParams.filterConfig.anfs = 0x0U;
    
            /* Initialize bit timings
             * Configuring 1Mbps and 5Mbps as nominal and data bit-rate respectively */
            bitTimes.nomRatePrescalar   = 0x7U;
            bitTimes.nomTimeSeg1        = 0x5U;
            bitTimes.nomTimeSeg2        = 0x2U;
            bitTimes.nomSynchJumpWidth  = 0x0U;
            bitTimes.dataRatePrescalar  = 0x1U;
            bitTimes.dataTimeSeg1       = 0x3U;
            bitTimes.dataTimeSeg2       = 0x2U;
            bitTimes.dataSynchJumpWidth = 0x0U;
            
            /* Initialize Tx Buffer Config params */
            stdFiltelem.sfid2 = 0x0U;
            stdFiltelem.sfid1 = 0x4U;
            stdFiltelem.sfec  = 0x7U;
            stdFiltelem.sft   = 0x0U;
    
            /* Initialize Message RAM Sections Configuration Parameters */
            msgRAMConfigParams.flssa                = MCAN_STD_ID_FILT_START_ADDR;
            msgRAMConfigParams.lss                  = MCAN_STD_ID_FILTER_NUM;
            msgRAMConfigParams.flesa                = MCAN_EXT_ID_FILT_START_ADDR;
            msgRAMConfigParams.lse                  = MCAN_EXT_ID_FILTER_NUM;
            msgRAMConfigParams.txStartAddr          = MCAN_TX_BUFF_START_ADDR;
            msgRAMConfigParams.txBufNum             = MCAN_TX_BUFF_SIZE;
            msgRAMConfigParams.txFIFOSize           = 0U;
            msgRAMConfigParams.txBufMode            = 0U;
            msgRAMConfigParams.txBufElemSize        = MCAN_ELEM_SIZE_64BYTES;
            msgRAMConfigParams.txEventFIFOStartAddr = MCAN_TX_EVENT_START_ADDR;
            msgRAMConfigParams.txEventFIFOSize      = MCAN_TX_BUFF_SIZE;
            msgRAMConfigParams.txEventFIFOWaterMark = 3U;
            msgRAMConfigParams.rxFIFO0startAddr     = MCAN_FIFO_0_START_ADDR;
            msgRAMConfigParams.rxFIFO0size          = MCAN_FIFO_0_NUM;
            msgRAMConfigParams.rxFIFO0waterMark     = 3U;
            msgRAMConfigParams.rxFIFO0OpMode        = 0U; /* Don't block if the fifo is full */
            msgRAMConfigParams.rxFIFO1startAddr     = MCAN_FIFO_1_START_ADDR;
            msgRAMConfigParams.rxFIFO1size          = MCAN_FIFO_1_NUM;
            msgRAMConfigParams.rxFIFO1waterMark     = 3U;
            msgRAMConfigParams.rxFIFO1OpMode        = 0U; /* Don't block if the fifo is full */
            msgRAMConfigParams.rxBufStartAddr       = MCAN_RX_BUFF_START_ADDR;
            msgRAMConfigParams.rxBufElemSize        = MCAN_ELEM_SIZE_64BYTES;
            msgRAMConfigParams.rxFIFO0ElemSize      = MCAN_ELEM_SIZE_64BYTES;
            msgRAMConfigParams.rxFIFO1ElemSize      = MCAN_ELEM_SIZE_64BYTES;

    这些参数是根据mcan_evm_loopback_app_main_k3.c文件和相应文档配置的。

    设置参数后、我将执行以下命令序列:MCAN_reset()MCAN_setOpMode()、、MCAN_config()MCAN_setBitTime()、、、 MCAN_setExtIDAndMask()MCAN_msgRAMConfig()MCAN_addStdMsgIDFilter()MCAN_setOpMode()然后又回到了她的身边。

    完成此序列后,我检查协议状态标志,并观察 LEC(最后一个错误代码)寄存器中包含的值7,该值对应于MCAN_ERR_CODE_NO_CHANGE
    这个误差应该上升到这里吗?  

    我的问题是:

    1.如果我想在轮询模式下使用 MCAN、是否需要为每个 CAN 模块设置 IRQ?
    2.在轮询模式下使用 MCAN(如果没有任何设备连接到每个 CAN)(因此没有人发回确认消息)发送多条消息可能会导致 Bus_Off 状态?  

    此致、
    Tamas  

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

    您好:

    在此序列之后、我检查协议状态标志、并观察 LEC(最后一个错误代码)寄存器中是否包含7对应的值MCAN_ERR_CODE_NO_CHANGE
    这个误差应该上升到这里吗?  
    [/报价]

    首先、这不是错误、这是默认设置。

    在 MCAN PSR 寄存器中、MCAN_PSR[2-0] LEC 字段指示 CAN 总线上最后发生的错误的类型。 当无误地传输(接收或发送)消息时、该字段将清零为 0h。

    7h =无效:对协议状态寄存器的任何读取访问都会将 MCAN_PSR[2-0] LEC 字段重新初始化为 7h。 当 MCAN_PSR[2-0] LEC 字段显示值 7h 时、自上次主机 CPU 对协议状态寄存器的读取访问以来、未检测到 CAN 总线事件。

    [quote userid=“600131" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1539708/sk-tda4vm-bus-off-status-for-mcan5-and-mcan9/5929065 如果我想在轮询模式下使用 MCAN、是否需要为每个 CAN 模块设置 IRQ?

    否、不需要。

    在轮询模式下使用 MCAN(如果没有任何器件连接到每个 CAN)(因此没有人发回确认消息)发送多条消息可能会导致 Bus_Off 状态?  [/报价]

    是的、Ack 错误将会出现、并最终导致总线关闭。

    此致

    Tarun Mukesh

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

    感谢您的帮助!  

    此致、
    Tamas