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.

[参考译文] TDA4VM:有时 TDA4 CAN't 向 CAN 工具成功传输 CAN 数据、数据丢失

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1187324/tda4vm-sometimes-tda4-can-t-transfer-can-data-to-can-tools-successful-data-has-lost

器件型号:TDA4VM

您好、TI

   可以在我们的项目中的 MCU2_0上工作。 有时候有一个问题,我添加了 MCAN_txBufAddReq ()的传输请求,我也获得了 MCAN_getProtocolStatus ()的传输状态,我认为状态表示传输成功,但 CAN 工具和相反 CAN 设备没有收到传输的数据。

 从 MCAN_getProtocolStatus()获取的状态是

((mCAN_ERR_code_no_error == protStatus.lastErrCode)||
(MCAN_ERR_CODE_NO_CHANGE = protStatus.lastErrCode)&&
((mcan_ERR_code_no_error == protStatus.dlec)||
(mcan_ERR_code_no_change == protStatus.dlec)&&
(protStatus.busOffStatus == 0u)&&
(0u = protStatus.PXE)

 如何调试该问题?

非常感谢!

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

    我们 使用了 TJA1043、我使用逻辑分析仪捕获 TXD 引脚的信号波形、逻辑分析仪还 丢失了 CAN 工具未收到的数据波。  虽然从软件的角度来看,我添加请求传输成功,并获得保证传输状态。

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

    您好!

    您是否使用了 PDK 中的任何示例? 如果需要、您能指出这个例子并在上面分享您所做的更改吗? 此外、您使用的是 TI-EVM 上的定制电路板还是定制电路板。 请同时说明您正在使用的 SDK 版本。

    此致、
    帕尔特

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

    大家好,帕斯

      感谢您的回复!  由于春节假期,很抱歉回复的晚了。

       我们使用的 PDK 示例 为  mcan_evm_loopback_app_main_k3.c、并使用定制板。 SDK 版本为  08.02.00.03。

    更改了设置、如下所示:

       initParams.brsEnable = 0;// 0x1U;

        initParams.darEnable = 0;//0x1U;

       msgRAMConfigParams.LSS = 0;// APP_MCAN_STD_ID_FILTER_NUM;

    *分别将500Kbps 配置为标称位速率和数据位速率*/
    bitTimes.nomRatePrescalar = 0xFU;
    bitTimes.nomTimeSeg1 = 0x6U;
    bitTimes.nomTimeSeg2 = 0x1U;
    bitTimes.nomSynchJumpWidth = 0x0U;
    bitTimes.dataRatePrescalar = 0x3U;
    bitTimes.dataTimeSeg1 = 0x6U;
    bitTimes.dataTimeSeg2 = 0x1U;
    bitTimes.dataSynchJumpWidth = 0x0U;

    删除了以下配置

    // stdFiltelem.sfid2 = 0x0U;
    // stdFiltelem.sfid1 = 0x4U;
    // stdFiltelem.sfec = 0x7U;
    // stdFiltelem.SFT = 0x0U;

    中断函数如下:

    静态空 App_mcanIntr0ISR (uintptr_t arg)
    {
    AppMcan_Instance * insts =(AppMcan_Instance *) arg;
    uint32_t intrStatus;

    intrStatus = mcan_getIntrStatus (inst->mcanModAddr);
    mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
    if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
    (IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
    (IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
    (IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
    {
    SemaphoreP_post(inst->transferSem );


    如果(MCAN_IE_RF1NE_MASK ==
    (intrStatus 和 MCAN_IE_RF1NE_MASK)
    {
    SemaphoreP_post(inst->receiverSem);

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

    大家好, 帕斯

     我很 期待您的回复! 有新的问题,有时从其他 CAN 设备传输的数据不能通过 TDA4接收.

     CAN 总线是 canfd 和500k+2M。

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

    您好!

    您多久看到一次此问题? 是否有任何一致的模式可使这种情况发生?

    此致、
    帕尔特

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

    大家好, 帕斯

      问题不经常发生。和  情况是, 当有连续的帧在传输的 canfd 很容易发生。

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

    您能否在失败前后共享 MCAN 寄存器转储?

    此致、
    帕尔特

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

    大家好,帕斯

      如何转储寄存器?

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

    大家好,帕斯

     有更新吗?   有时 TDA4无法接收从其他 CAN 器件传输的数据。如何调试?

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

    您好!

    您可以使用 CCS 内存浏览器获取转储。

    此致、
    帕尔特

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

    大家好,帕斯

      您可以使用 CCS 内存浏览器获取转储。

       ---------------- >由于我们的定制板没有布局 JTAG 接口,有没有 其他方法来调试问题?

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

    大家好,帕斯

     期待您的回复。 谢谢。我们的硬件 设计图。您有任何建议?

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

    大家好,帕斯

      我们发现、 在同样的数据传输场景中、当数据以极高的速度传输到 TDA4时、 TDA4更有可能无法接收特定的数据。这些信息是否有助于解决该问题?

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

    大家好,帕斯

     项目即将进入量产阶段。 这一问题已经困扰了我们很长一段时间,而且非常紧迫。 请提供帮助、非常感谢。

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

    您好!

    对于故障情况、我们将需要寄存器转储。 如果 JTAG 不可用、您能否打印寄存器并共享转储。
    如果我们能得到完整的寄存器转储是最好的,但如果不可能,我们至少需要:MCAN_PSR (对于协议错误)、MCAN_IR (对于此事件引起中断)、MCAN_IE (对于此中断事件已启用)、MCAN_ECR (对于错误计数器)

    此致、
    帕尔特

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

    大家好,帕斯

      非常感谢! 我将尽快重现问题并在出现问题时转储寄存器。

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

    大家好, 帕斯

       我 捕获了日志、当中断发生时打印了 mcan 寄存器、 日志似乎更多了。 as fllowing  

       这是正常现象? 为什么有这么多的中断。

       [MCU1_0] 12-30 2:26:4.256411 1223.654468 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256440 1223.654575 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256468 1223.654684 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256496 1223.654796 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256524 1223.654902 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256552 1223.655408 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256580 1223.655510 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256608 1223.655622 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256637 1223.656422 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd300f MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256665 1223.656523 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256693 1223.656631 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256721 1223.657457 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256750 1223.657580 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256783 1223.657671秒:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256812 1223.657784 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256841 1223.658392 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256868 1223.658505 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256896 1223.658611 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256932 1223.659399 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256960 1223.659508 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.2569881223.659616 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.257015 1223.660476 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.257043 1223.662424 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.257070 1223.662829 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.257098 1223.662942 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.267187 1223.664752 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0

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

    您好、TI

     Fifl 已满且数据丢失后、这是否是丢失 CAN 数据的根本原因?

      MCAN_IR = 0x50.MCAN_PSR= 0xd3017 MCAN_ECR= 0x0

      MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0

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

    大家好,帕斯

       我们紧急等待 您的答复。非常感谢。

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

    您好!

    看一下寄存器转储、看起来您根本就没有进行传输。 MCAN_PSR 寄存器 MCAN 作为接收器节点运行 Act[4-3]:0x2

    您能在您的代码中发送吗? 此外,请采取一个转储的工作案例也和分享。

    此致、
    帕尔特

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

    大家好, 帕斯

     是的,现在问题不是在传输时间,而是在接收。我们目前的问题是,我们不能接收所有的数据,有丢失一个数据帧的可能性。 在寄存器转储、FIFO 已满且数据丢失的情况下、我们应该增加 FIFO 来解决这个问题、对吧?如何提高 FIFO?  只需增大  APP_MCAN_FIFO_0_NUM 的值 &APP_MCAN_FIFO_1_NUM ?

    #define APP_MCAN_FIFO_0_START_ADDR (548U)
    #define APP_MCAN_FIFO_0_NUM (5U) APP_MCAN_FIFO_1_NUM  
    #define APP_MCAN_FIFO_1_START_ADDR (748U)
    #define (5U)
    #define APP_MCAN_RX_BUFF_START_ADDR (948U)

    msgRAMConfigParams.rxFIFO0startAddr = APP_MCAN_FIFO_0_START_ADDR;
    msgRAMConfigParams.rxFIFO0size = APP_MCAN_FIFO_0_NUM;
    msgRAMConfigParams.rxFIFO0waterMark = 3U;
    msgRAMConfigParams.rxFIFO0OpMode = 0u;
    msgRAMConfigParams.rxFIFO1startAddr = APP_MCAN_FIFO_1_START_ADDR;
    msgRAMConfigParams.rxFIFO1size = APP_MCAN_FIFO_1_NUM;
    msgRAMConfigParams.rxFIFO1waterMark = 3U;
    msgRAMConfigParams.rxFIFO1OpMode = 0u;
    msgRAMConfigParams.rxBufStartAddr = APP_MCAN_RX_buff_start_ADDR;
    msgRAMConfigParams.rxBufElemSize = MCAN_Elm_size_64BYTES;
    msgRAMConfigParams.rxFIFO0ElemSize = MCAN_ELEM_SIZE_64BYTES;
    msgRAMConfigParams.rxFIFO1ElemSize = MCAN_Elm_size_64BYTES;

    静态空 App_mcanIntr0ISR (uintptr_t arg)
    {
    AppMcan_Instance * insts =(AppMcan_Instance *) arg;
    uint32_t intrStatus;

    intrStatus = mcan_getIntrStatus (inst->mcanModAddr);
    mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
    if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
    (IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
    (IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
    (IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
    {
    SemaphoreP_post(inst->transferSem );--> >透射完成

    如果(MCAN_IE_RF1NE_MASK ==
    (intrStatus 和 MCAN_IE_RF1NE_MASK)
    {
    SemaphoreP_post(inst->receiverSem );----------------------------------------------------- >接收数据

    我们的设置代码与参考代码之间的差异
    initParams.darEnable = 0;//0x1U;----- >1更改为0

    msgRAMConfigParams.LSS = 0;// APP_MCAN_STD_ID_FILTER_NUM;--> >1更改为0

    *分别将500Kbps 配置为标称位速率和数据位速率*/ 500K+2M
    bitTimes.nomRatePrescalar = 0xFU;
    bitTimes.nomTimeSeg1 = 0x6U;
    bitTimes.nomTimeSeg2 = 0x1U;
    bitTimes.nomSynchJumpWidth = 0x0U;
    bitTimes.dataRatePrescalar = 0x3U;
    bitTimes.dataTimeSeg1 = 0x6U;
    bitTimes.dataTimeSeg2 = 0x1U;
    bitTimes.dataSynchJumpWidth = 0x0U;

    删除设置

    // stdFiltelem.sfid2 = 0x0U;
    // stdFiltelem.sfid1 = 0x4U;
    // stdFiltelem.sfec = 0x7U;
    // stdFiltelem.SFT = 0x0U;


    接收功能:

    MCAN_getErrCounter (mcanModAddr、&errCounter);
    if (/*(0U = errCounter.recErrCnt)&&*/
    (0u = errCounter.canErrLogCnt))
    {
    MCAN_RxFIFOStatus FIFO 状态;
    FifoStatus.num =(uint32_t) MCAN_RX_FIFO_NUM_1;
    MCAN_getRxFIFOStatus (mcanModAddr、&fifoStatus);
    MCAN_readMsgRam (mcanModAddr、
    MCAN_MEM_TYPE_FIFO、
    FifoStatus.getIdx、
    (uint32_t) fifoStatus.num、
    &rxMsg);
    (void) MCAN_writeRxFIFOAck (mcanModAddr、
    (uint32_t) fifoStatus.num、
    FIFO 状态.getIdx);

    crxparser_recevied(inst->index、rxMsg.id >>18、rxMsg.data、gMcanAppdataSize[rxMsg.dlc]);

    否则
    {
    looge ("mcan:接收%d 时出错:rc %d、cel %d!!!\n"、inst->index、errCounter.recErrCnt、errCounter.canErrLogCnt);

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

    让我们备份一点。

    之前、您发现在尝试传输数据时会出现故障。 这现在起作用了吗?
    如果是、您做了哪些更改来使其正常工作?

    现在、在接收数据时、故障的频率是多少? 是长时间运行几次、还是每次尝试接收时您都可以看到此问题?

    此致、
    帕尔特

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

    大家好, 帕斯

    让我总结一下我们的问题:
    1.在尝试传输数据时失败。
    出现问题时我们没有转储寄存器、我们会继续测试、出现故障时转储寄存器
    2.在接收数据时发生故障,tda4已经丢失了一个 CAN 数据。
    (发生故障时、我们按如下方式转储寄存器。    )APP_MCAN_FIFO_0_NUM 的默认值为5 μ s。
    [MCU1_0] 12-30 2:26:4.256868 1223.658505 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256896 1223.658611 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256932 1223.659399 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.256960 1223.659508 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
    [MCU1_0] 12-30 2:26:4.2569881223.659616 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0


    从寄存器、接收 FIFO 已满、数据丢失、我认为接收 FIFO 可能会增加到
    更大。 我的分析是否正确? 如果需要、如何增加接收 FIFO?

    我按如下所示将当前的接收 FIFO 和发送 FIFO 从5修改为8。 这是否正确?(正在测试修改的软件。 我不确定它是否有助于解决问题)


    #define APP_MCAN_FIFO_0_START_ADDR (548U)
    #define APP_MCAN_FIFO_0_NUM (8U)-->从5更改为8U
    #define APP_MCAN_FIFO_1_START_ADDR (748U)
    #define APP_MCAN_FIFO_1_NUM (8U)-->从5更 改为8U

    #define APP_MCAN_TX_BUFF_SIZE (8U)-->从5更改为8U
    #define APP_MCAN_TX_FIFO_SIZE (8U)-->从5 U 更改为8U

    问题不是每次测试都发生、但频率约为60%。 如果问题发生、测试将停止。 通常在测试后几分钟或更长时间发生。此问题发生在 OTA 升级测试中、因此 CAN 数据非常大、传输速度非常快。

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

    您好!

    问题不是每次测试都发生,但频率约为60%。 如果问题发生、测试将停止。 通常在测试后几分钟或更长时间发生。此问题发生在 OTA 升级测试中、因此 CAN 数据非常大、传输速度非常快。


    是的、请尝试增加 FIFO 大小、

    我修改了当前接收 FIFO 如下,从5改为8。 这是否正确?(正在测试修改的软件。 我不确定它是否有助于解决问题)

    是的、这是增加 FIFO 大小的正确方法、请让我们知道该行为

    尝试传输数据时出现故障。
    发生问题时我们没有转储寄存器。我们将继续测试、并在发生故障时转储寄存器


    请也获取该转储并分享。

    此致、
    帕尔特

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

    大家好, 帕斯

    问题1: 我已  将 FIFO 大小从5增加到15、 接收数据的故障率大大降低。  是否存在此修改的任何其他风险?  该 num 最大值的设置量是多少? 是28吗?

    #define APP_MCAN_FIFO_0_START_ADDR (548U)
    #define APP_MCAN_FIFO_0_NUM (15U)-->从5更改为8U
    #define APP_MCAN_FIFO_1_START_ADDR (748U)
    #define APP_MCAN_FIFO_1_NUM (15U)-->从5更 改为8U

    问题2:有时 CAN 总线上接收此数据帧的时间可能长于传输成功的日志中所示的时间。详细信息如下。如何分析此类问题?

    tda4 CAN 数据传输日志:

    接收 id 701和 tarnsfer id 709之间的时间间隔 在1毫秒内

    [MCU1_0] 1222.670000 s:===ottedebug=== MCAN:receive in=0,id=701,data=0x10 F9 36 7b!
    [MCU1_0] 1222.670316 s:==otadebus=== MCAN:transfer in=0、id=709、data=0x30 0 1 0!
    [MCU1_0] 1222.670514 s:==otadebus=== MCAN:传输成功,id=000,DATA=0x709 30 0 1! ACT=0 errPassiv=1 warningStatus=0dlec=0 rbrs=0 rfdf=1 rtdcv=0

    CAN 总线数据如下、 id 701到 id 709之间的时间间隔为147ms。

    [09:22:22.355] 0x701 10 F9 36 7b
    [09:22:22.508] 0x709 30 00 01 00 00 00 00 00

     传递函数如下:

    int32_t App_mcanImplementation Transfer (candata_t *cd)
    {
    uint32_t mcanModAddr;
    int32_t testStatus = CSL_PASS;
    AppMcan_Instance * INSTRUM;
    MCAN_ProtocolStatus protStatus;
    MCAN_TxBufElement txMsg;

    断言(cd);
    断言(CD->len<=CANFD_DATA_SIZE);
    assert (CD->in<Ary_size (appMcanInsts);
    Inst =&appMcanInsts[CD->In];
    mcanModAddr = inst->mcanModAddr;

    /*初始化要传输的消息*/
    txMsg.id =((uint32_t)(CD->id)<< 18u);
    txMsg.rtr = 0u;
    txMsg.xtd = 0u;
    txMsg.esi = 0u;
    if (cd->in ==0)
    {
    txMsg.FDF = 1;
    txMsg.brs = 1;// 1u;

    否则
    {
    txMsg.FDF = 0;// 1U;
    txMsg.brs = 0;// 1u;

    txMsg.efc = 1u;
    txMsg.mm = 0xAAU;
    txMsg.dlc = gMcanAppSizeDlc[CD->len];
    memcpy (txMsg.data、cd->d、cd->len);

    // appLogPrintf ("mcan: transfer in=%d,id=%03x,len=%d!\n",cd->in,cd->id, cd->len);
    MutexP_LOCK (inst->transferMutex、MutexP_WAIT_FOREVER);
    /*将消息写入 Msg RAM */
    MCAN_writeMsgRam (mcanModAddr、
    MCAN_MEM_TYPE_BUF、
    1u、
    txMsg (&T);
    /*添加传输请求*/
    如果(cd->id=0x709)
    appLogPrintf (=========otadebug=== mCAN:transfer in=%d、id=%03x、data=0x%x %x %x %x!\n"、CD->IN、CD->id、CD->d[0]、CD->d[1]、 CD->d[2]、CD->d[3]);
    testStatus = MCAN_txBufAddReq (mcanModAddr、1U);
    如果(CSL_PASS == testStatus)
    {
    // appLogPrintf ("Successful MCAN_txBufAddReq、PEND TX SAM now ...\n");
    if (SemaphoreP_pend (inst->transferSem、1000)== SemaphoreP_OK)
    {
    MCAN_getProtocolStatus (mcanModAddr、&protStatus);
    /*检查错误*/
    if ((((mcan_ERR_code_no_error == protStatus.lastErrCode)||
    (MCAN_ERR_CODE_NO_CHANGE = protStatus.lastErrCode)&&
    ((mcan_ERR_code_no_error == protStatus.dlec)||
    (mcan_ERR_code_no_change == protStatus.dlec)&&
    (protStatus.busOffStatus == 0u)&&
    (0u = protStatus.PXE)
    {
    // appLogPrintf ("MCAN:%d 成功传输%x",CD->IN,CD->id);

    如果(cd->id=0x709)
    appLogPrintf ("===otadebug=== MCAN:传输成功,id=%03x,DATA=0x%x %x %x %x %x! Act=%d errPassive=%d warningStatus=%d"
    "dlec=%d resis=%d rbrs=%d rfdf=%d PXE=%d tdcv=%d\n"、
    cd->in、cd->id、cd->d[0]、cd->d[1]、cd->d[2]、 cd->d[3]、protStatus.act、protStatus.errPassive、protStatus.warningStatus、protStatus.dlec、
    protStatus.resi、protStatus.rbrs、protStatus.rfdf、protStatus.PXE、protStatus.tdcv);

    中断功能:

    静态空 App_mcanIntr0ISR (uintptr_t arg)
    {
    AppMcan_Instance * insts =(AppMcan_Instance *) arg;
    uint32_t intrStatus;
    intrStatus = mcan_getIntrStatus (inst->mcanModAddr);

    mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
    if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
    (IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
    (IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
    (IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
    {
    SemaphoreP_post(inst->transferSem );

    // IF (MCAN_INTR_SRC_DISCONTED_RX_buff_MSG =
    //(IntrStatus 和 MCAN_INTR_SRC_DITGED_RX_buff_MSG)
    //{
    // gMcanIsrIntr1Flag = 0u;
    //}
    如果(MCAN_IE_RF1NE_MASK ==
    (intrStatus 和 MCAN_IE_RF1NE_MASK)
    {
    SemaphoreP_post(inst->receiverSem);

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

    大家好, 帕斯

    问题: 我  将 FIFO 大小从5增加到了15, 接收数据的故障率大大降低。  是否存在此修改的任何其他风险?  该 num 最大值的设置量是多少? 是28吗?

    #define APP_MCAN_FIFO_0_START_ADDR (548U)
    #define APP_MCAN_FIFO_0_NUM (15U)-->从5更改为15U
    #define APP_MCAN_FIFO_1_START_ADDR (748U)
    #define APP_MCAN_FIFO_1_NUM (15U)-->从5更 改为15U

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

    您好!

    因此增加 FIFO 大小没有风险。 但这不是问题的永久解决办法。 增大 FIFO 大小可以降低溢出的风险、但这表明从 FIFO 读取的速率<写入 FIFO 的速率、需要加以解决、否则、在较长时间的运行中、您仍然可能会遇到该问题。

    您能分享如何从 FIFO 读取数据吗? 此外、最终能否进行分析并确保在读取 FIFO 时没有额外的延迟?

    此致、
    帕尔特

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

    大家好, 帕斯

     感谢您的回复!

    是的、我也怀疑从 FIFO 读取数据的速率<写入 FIFO 的速率是根本原因。
    但 FIFO 的最大值是多少?

    我已经添加了读取 FIFO 的时间成本记录、用于检查读取 FIFO 的时间是否过长。


    如下读取 FIFO 代码:请帮助检查读取 FIFO 的方法是否存在问题、非常感谢。

    接收中断发生时、将发布 SemaphoreP_POST (inst->seeiverSem)


    if (SemaphoreP_pend (inst->receiverSem、SemaphoreP_WAIT_FOREVER)== SemaphoreP_OK)
    {
    /*检查错误*/
    MCAN_getErrCounter (mcanModAddr、&errCounter);
    if (/*(0U = errCounter.recErrCnt)&&*/
    (0u = errCounter.canErrLogCnt))
    {
    MCAN_RxFIFOStatus FIFO 状态;
    FifoStatus.num =(uint32_t) MCAN_RX_FIFO_NUM_1;

    MCAN_getRxFIFOStatus (mcanModAddr、&fifoStatus);

    MCAN_readMsgRam (mcanModAddr、
    MCAN_MEM_TYPE_FIFO、
    FifoStatus.getIdx、
    (uint32_t) fifoStatus.num、
    &rxMsg);

    (void) MCAN_writeRxFIFOAck (mcanModAddr、
    (uint32_t) fifoStatus.num、
    FIFO 状态.getIdx);


    crxparser_recevied(inst->index、rxMsg.id >>18、rxMsg.data、gMcanAppdataSize[rxMsg.dlc]);
    //将 CAN 数据发送到其它功能,如下所示

    否则
    {
    looge ("mcan:接收%d 时出错:rc %d、cel %d!!!\n"、inst->index、errCounter.recErrCnt、errCounter.canErrLogCnt);



    void crxparser_reevied (uint8_t cin、uint16_t cid、uint8_t *、uint8_t len)
    {
    candat_t cd;
    cd.in = cin;
    cd.id = CID;
    cd.len = min (len、sizeof (cd.d));
    memcpy (cd.d、dt、cd.len);
    如果(cd.id=0x701)
    appLogPrintf ("=OTA= MCAN:receive id=%03x、0x%x %x %x!\n"、cd.id、cd.d[0]、cd.d[1]、cd.d[2]、 cd.d[3]);

    (void) MailboxP_POST (mailboxHandle、&CD、0);

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

    大家好, 帕斯

    问题:1.   关于 RX FIFO, 该 num 最大可设置的 RX FIFO 容量是多少?  

    #define APP_MCAN_FIFO_0_START_ADDR (548U)
    #define APP_MCAN_FIFO_0_NUM (18U)-->从5更改为18U
    #define APP_MCAN_FIFO_1_START_ADDR (748U)
    #define APP_MCAN_FIFO_1_NUM (18U)-->从5更 改为18U

     从 FIFO 中读取数据时有什么问题吗?

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

    您好!

    很抱歉给您带来不便,是否仍支持此主题?

    此致

    M·塔伦

x 出现错误。请重试或与管理员联系。