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.

[参考译文] AM2634:CAN-FD Rx FIFO 始终在第二个帧(rxMapping[]中的空指针)上崩溃

Guru**** 2544120 points
Other Parts Discussed in Thread: TMDSCNCD263, TCA6416, AM2634, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1522384/am2634-can-fd-rx-fifo-always-crashes-on-second-frame-null-pointer-in-rxmapping

器件型号:AM2634
Thread 中讨论的其他部件:TMDSCNCD263TCA6416Sysconfig

工具/软件:

您好!

我尝试运行 TI 的 canfd_external_read_write.c 示例 、该示例位于:

https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/drivers/mcan/canfd_external_read_write/canfd_external_read_write.c

https://dev.ti.com/tirex/content/mcu_plus_sdk_am263x_10_01_00_31/docs/api_guide_am263x/EXAMPLES_DRIVERS_MCAN_CANFD_EXTERNAL_READ_WRITE.html

我按照示例中的说明、将 TMDSCNCD263 控制卡开发套件设置到运行 PCAN 视图的 Windows 计算机。

我将`canfd_external_read_write_am263x-cc_r5fss0-0_nortos_ti-arm-clang`导入到我的 CCS 版本 20.1.1 (20.1.466)、在可用的调试器下编译和运行代码。

我有两个问题。  

1)

我发现我需要注释 L97 `mcanEnableTransceiver ()`来运行程序。  https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/drivers/mcan/canfd_external_read_write/canfd_external_read_write.c#L97 

如果我没有收到该错误信息`Cortex_R5_0:asserted:0.181s:.../canfd_transmitter.c:SetupI2CTransfer:103:SystemP_Success == status failed!!` 在终端上。

这 可以评论出来吗? 为什么会发生这种情况?

2)

在注释掉 canfd_external_read_write.c  L97 `mcanEnableTransceiver()`后。

运行代码时、我可以确认 TX 正在工作、因为我的 PCAN 视图会显示传入的 CAN FD 消息。 如果我从 PCAN 视图发送多条 CAN ID 为 0x0 的消息、程序就会收到这些消息而不会出现问题。 通过调试工具、我 看到调用了`MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG`和`CANFD_receiveBufferInterrupt`的中断状态。  https://github.com/TexasInstruments/mcupsdk-core/blob/next/source/drivers/mcan/v0/canfd.c#L319

但是、当我发送的 CAN ID 不是 0x0 的消息时、我会看到中断状态`MCAN_INTR_SRC_RX_FIFO0_NEW_MSG`、并调用`CANFD_processFIFOElements`。 这对第一条非 0 CAN ID 消息成功有效。 但是、 接收到的第二个非 0 CAN ID 消息会导致硬故障。  

ptrCanMsgObj = ptrCanFdObj->rxMapping[fifoStatus.getIdx]; 具有 getIdx 返回 1、ptrCanMsgObj 被赋予值 0  、因为 rxMapping[1]仍为 NULL、而 解除引用 ptrCanMsgObj 会导致崩溃。  https://github.com/TexasInstruments/mcupsdk-core/blob/next/source/drivers/mcan/v0/canfd.c#L198 

如何以不同的方式配置/设置 CAN FIFO、以便它可以成功从任何扩展 CAN ID 接收多条 CAN 消息? (我仍然需要 64B canfd 消息)。  我尝试使用配置设置来专门用于支持 CAN FD - FIFO、但没有成功。

谢谢!

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

    尊敬的 Justin:

    感谢您联系并提供您当前测试结果的详细说明。

    我正在研究这个问题、并将在本周结束前作出答复。 感谢您的耐心。

    此致、

    Zackary Fleenor

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

    非常感谢。 如果我能提供更多背景信息、请告诉我。 这对于我们的需要是非常紧迫的。

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

    嗨、Justin、

    1) mcanEnableTransciever () 函数因 EVM (LaunchPad 与 ControlCARD) 而异。 在中、该 LaunchPad 仅用于将 GPIO51 拉至低电平、该引脚连接至 TCAN1044 收发器的 STB(待机)引脚。 当 STB 引脚为高电平时、收发器处于待机/低功耗模式;当该引脚为低电平时、收发器处于工作/正常模式。 在 controlCARD 中、它将 I2C0 配置为与 TCA6416 I/O 扩展器通信、以针对正常模式实现相同的 STB 下拉功能(因此函数名称为“EnableTransciever")“)。 有一个外部下拉电阻器会使收发器默认进入正常模式。 因此、可以对此行进行注释。 但是、如果您可以单步执行该函数来确定哪个 I2C 传输导致了故障、那么这个函数会很有用。

    2)

    您是否已将 RX_FIFO0 配置为接收元素? 如果是、您是如何配置的? 您还能分享一下 RX 缓冲器的配置吗?

    您需要设置您的 RX_FIFO 接受过滤器、以便接收正在发送的特定 ID。

    TI 在调试 CAN 实现时提供以下建议 (https://www.ti.com/lit/an/spracu9/spracu9.pdf)

    “首次尝试在总线上发起通信时、请确保使用相同的 MSGID 对发送节点和接收节点中的邮箱进行编程。 最初不要使用接受掩码过滤。 确认没有硬件问题后、可以稍后添加筛选

    希望这有助于您开始调试过程、我们很高兴为您提供更多帮助。

    此致、

    Zackary Fleenor

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

    您好、Zackary、感谢您回复我。

    1) 我已逐步执行该函数、运行`canfd_external_read_write_am263x-cc_r5fss0-0_nortos_ti-arm-clang` imported 示例不变。 看起来就像从`mcanEnableTransceiver``S到` etupI2CTransfer `的第一个调用导致失败,收到错误` Cortex_R5_0 : asserted : 0.181s:../canfd_transmitter.c:SetupI2CTransfer:103: SystemP_Success == status failed !!! 在终端上。

    https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/drivers/mcan/canfd_external_read_write/am263x-cc/canfd_transceiver.c#L71

    2) 最初我没有修改示例的原始状态(除了注释掉 mcanEnableTransceiver ) 。 syscfg 可在此处找到

    https://github.com/TexasInstruments/mcupsdk-core/blob/next/examples/drivers/mcan/canfd_external_read_write/am263x-cc/r5fss0-0_nortos/example.syscfg

    但是、当我尝试按以下方式更改 syscfg 时、找到中断状态`MCAN_INTR_SRC_RX_FIFO0_NEW_MSG`(而不是`MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG`,因为有缓冲器中断)时、它仍然会停止并失败。

    话虽如此、我可以配置此示例程序、以便从任何 CAN ID 成功发送 TX 消息、但仍接收具有 CAN ID 0x0 的 RX 消息、只是不接受任何具有不同 CAN ID 的 RX。

     `修改 Δ t canfd_external_read_write_am263x-cc_r5fss0-0_nortos_ti-arm-clang`导入示例、以下 是我在 syscfg 中尝试禁用滤波器并启用 Rx FIFO 时的配置。 它将在 RX FIFO 中接收一条消息、而在 RX FIFO 中接收到第二条消息时程序出现硬故障(由于指针 DEREF 为空)。

    mcan1.$name =“CONFIG_MCAN0";“;
    mcan1.sdkInfra =“HLD";“;
    mcan1.transferMode =“回调“;
    mcan1.transferCallbackFxn =“App_CANFDTransferCallback";“;
    mcan1.errorCallbackFxn =“App_CANFDErrorCallback";“;
    mcan1.darEnable = true;
    mcan1.autoWkupEnable = true;
    mcan1.wkupReqEnable = true;
    mcan1.additionalCoreConfig = true;
    mcan1.enableLoopback = false;
    mcan1.loopbackMode =“外部“;
    mcan1.nomPseg1 = 8;
    mcan1.nomPseg2 = 2;
    mcan1.tdcEnable = true;
    mcan1.rxMemType =“FIFO";“;
    mcan1.extendedFilterEleConfig =“MCAN_EXT_FILT_Elem_disable";“;
    mcan1.standardFilterEleConfig =“MCAN_STD_FILT_Elem_disable";“;
    mcan1.MCAN.$assign =“MCAN1";“;

    这里是一个修改后的`canfd_external_read_write_main`

    #include
    #include
    #include
    #include “ti_drivers_config.h"</s>“
    #include “ti_drivers_open_close.h"</s>“
    #include “ti_board_open_close.h"</s>“

    /**\brief CAN FD 帧的最大数据大小*/
    #define MCAN_APP_MAX_DATA_SIZE 64U

    CANFD_MessageObject rxMsgObject;
    静态 SemaphoreP_Object gMcanRxDoneSem;
    uint8_t rxData[MCAN_APP_MAX_DATA_size]={0};
    易失性 uint32_t totalMessagesReceived = 0U;

    void mcanEnableTransceiver (void);

    void canfd_external_read_write_main (void *args)

    CANFD_MsgObjHandle rxMsgObjHandle;
    int32_t 状态= SystemP_Success;

    /*打开驱动程序以打开控制台的 UART 驱动程序*/
    drivers_open();
    BOARD_DRIVERSOpen ();

    // mcanEnableTransceiver ();

    status = SemaphoreP_ConstructBinary (&gMcanRxDoneSem、0);
    DebugP_assert (SystemP_Success == status);

    DebugP_LOG(“\r\n[MCAN] CAN RX FIFO 监控器已启动...\r\n“);
    DebugP_LOG((“等待 CAN 消息(按 CTRL+C 停止)...\r\n\r\n“);

    /*为 FIFO 操作设置接收消息对象*/
    rxMsgObject.direction = CANFD_Direction_RX;
    rxMsgObject.msgIdType = CANFD_MCANXidType_29_bit;/*接受 11 位和 29 位 ID */
    rxMsgObject.startMsgId = 0x0;/*起始 ID(不用于 FIFO)*/
    rxMsgObject.endMsgId = 0x1FFFFFFF;/*结束 ID(全部接受)*/
    rxMsgObject.args =(uint8_t *) rxData;
    rxMsgObject.dataLength = MCAN_APP_MAX_DATA_SIZE;
    STATUS = CANFD_createMsgObject (gCanfdHandle[CONFIG_MCAN0]、&rxMsgObject);
    if (status != SystemP_Success)

    DebugP_log(“错误:CANFD 创建 Rx 消息对象失败\r\n“);
    返回;
    }
    rxMsgObjHandle =&rxMsgObject;

    /*主接收回路*/
    while (1)

    /*从 FIFO 读取(非阻塞)*/
    STATUS = CANFD_READ (rxMsgObjHandle、1、&rxData[0]);
    IF (STATUS == SystemP_SUCCESS)

    /*等待 RX 完成*/
    SemaphoreP_Pend (&gMcanRxDoneSem、SystemP_WAIT_FOREVER);

    totalMessagesReceived++;

    /*打印数据的前 8 个字节*/
    DebugP_LOG(“MSG #%u:data:“、totalMessagesReceived);
    uint32_t bytesToPrint =(rxMsgObject.dataLength > 8)? 8:rxMsgObject.dataLength;
    对于 (uint32_t i = 0;i < bytesToPrint;i++)

    DebugP_log(“%02x “、rxData[i]);
    }
    if (rxMsgObject.dataLength > 8)

    DebugP_log(“... (+%u 更多)“、rxMsgObject.dataLength - 8);
    }
    DebugP_LOG(“\r\n")“);
    }
    暴露

    /*防止繁忙等待的短暂延迟*/
    ClockP_USleep (1000);/* 1ms 延迟*/
    }
    }

    /*清理(在无限循环中永远不会到达此代码)*/
    SemaphoreP_Departt (&gMcanRxDoneSem);
    状态= CANFD_deleteMsgObject (rxMsgObjHandle);

    Board_driversClose();
    drivers_close();

    返回;
    }

    void App_CANFDTransferCallback(void *args、CANFD_reason 原因)

    if (reason == CANFD_reason_RX)

    SemaphoreP_POST ((SemaphoreP_Object *)&gMcanRxDoneSem);
    }
    }

    void App_CANFDErrorCallback(void * args、CANFD_reason 原因)

    DebugP_log(“CAN 错误:原因代码 0x%x\r\n“,原因);
    }

    请告诉我、我是否应该以不同的方式行事。

    是否有一个将在启用了 CAN FD Rx FIFO 的 AM2634 开发板上运行的示例、我可以用作参考? 这将是最有帮助的。  

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

    嗨、Justin、

    我将此主题分配给我们的软件专家、为 CAN-FD RX FIFO 示例提供额外的指导和可能的时间表。

    请留出一些时间进行审核并提供其他反馈。

    此致、

    Zackary Fleenor

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

    非常感谢 Zackary。 只是撞到这个螺纹。

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

    嗨、Justin、

    我已经收到了这个主题,请给我一些时间,可能到下周中旬复制它在我的结尾,并进一步检查. 如果您可以在此处将修改后的工程附加为 zip 文件、将会很有帮助。

    同时、您可以参考此示例“mcan_loopback_Polling",“,该、该示例演示了 FIFO 模式下使用的 Tx 和 Rx、但它是一个 HLD 示例、而不是与您所指的 canfd 示例类似的 LLD 示例。 因此在这种情况下、配置将在源代码本身中找到、而不是在 SysConfig 中找到。

    此致、
    Aswathi  

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

    尊敬的 Aswathi:

    这是 修改后的代码的压缩文件。 我尝试查看  mcan_loopback_Polling 示例、但无法将其与使用 fdcan FIFO 模式相关联。 同样、每次 电路板没有收到 CAN ID 0x0 的消息时、FIFO 指针无效、第二条消息会导致硬崩溃。

    有什么可以对此进行测试的吗? 具有 CAN FD 示例的工作 FIFO 最适合在任何 CAN ID 上发送消息并在任何 CAN ID 上接收消息。

    谢谢你。

    e2e.ti.com/.../canfd_5F00_external_5F00_read_5F00_write_5F00_am263x_2D00_cc_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

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

    尊敬的 Justin:

    感谢您分享该计划。  

    1.将以下文件粘贴到此路径中:{SDK}/source/drivers/mcan/v0

    e2e.ti.com/.../canfd.c

    2.将该项目导入 CCS

    e2e.ti.com/.../2604.canfd_5F00_external_5F00_read_5F00_write_5F00_am263x_2D00_cc_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    它应该可以解决收发器问题和崩溃问题。 但 Tx 和 Rx 都在中 缓冲模式 。 我目前没有要测试 FIFO 模式的硬件。 请告诉我通过 SysConfig 选择的 FIFO 是否仍无法用于这个更新后的工程。 我将在星期二上试一下。  

    此致、
    Aswathi

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

    尊敬的 Aswathi:使用 MCU_PLUS_SDK_AMXXX v7.3.0.01 运行您的软件包时遇到问题。 您能否请向我详细说明应在 我的 syscfg 中更改的内容以及我之前的 zip 文件中提供的主函数。

    您发送的`canfd.c`与我在 mcu_plus_sdk_am263x_10_01_00_31 中具有的差异似乎也很大。

    我正在使用的较新版本的 SDK(如 v10.01.00.31)是否不支持此功能?

    感谢您研究一下 fifo 选项、这最终是我们需要的工作。

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

    您好、Aswathi、这里是否有任何更新? 谢谢

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

    尊敬的 Justin:
    对不起延迟,我不是很好。 我会让团队中的某个人帮助您迁移我发送的文件。 感谢您的耐心。

    谢谢、
    Aswathi

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

    尊敬的 Justin:

    很抱歉耽误你的时间。

    下面是 SDK 10.1 上的应用程序。 您可以尝试同样的方法吗?

    /cfs-file/__key/communityserver-discussions-components-files/908/6765.canfd_5F00_external_5F00_read_5F00_write_5F00_am263x_2D00_cc_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    canfd.c 文件中的唯一更改是将中的 ifcondition 替换为 switch case  CANFD_isDataSizeValid() as shown below

    current implementation
    
    int32_t CANFD_isDataSizeValid(uint32_t dataSize)
    {
        uint32_t canfdDataSize[CANFD_MAX_DLC_MAPPING] = 
                        {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U,
                         12U, 16U, 20U, 24U, 32U, 48U, 64U};
    
        if((canfdDataSize[dataSize] == 0U) || 
           (canfdDataSize[dataSize] == 1U) ||
           (canfdDataSize[dataSize] == 2U) ||
           (canfdDataSize[dataSize] == 3U) ||
           (canfdDataSize[dataSize] == 4U) ||
           (canfdDataSize[dataSize] == 5U) ||
           (canfdDataSize[dataSize] == 6U) ||
           (canfdDataSize[dataSize] == 7U) ||
           (canfdDataSize[dataSize] == 8U) ||
           (canfdDataSize[dataSize] == 12U) ||
           (canfdDataSize[dataSize] == 16U) ||
           (canfdDataSize[dataSize] == 20U) ||
           (canfdDataSize[dataSize] == 24U) ||
           (canfdDataSize[dataSize] == 32U) ||
           (canfdDataSize[dataSize] == 48U) ||
           (canfdDataSize[dataSize] == 64U))
        {
            return SystemP_SUCCESS;
        }
    
        return SystemP_FAILURE;
    }
    
    
    fixed implementation
    int32_t CANFD_isDataSizeValid(uint32_t dataSize)
    {
        switch (dataSize)
        {
            case 0U:
            case 1U:
            case 2U:
            case 3U:
            case 4U:
            case 5U:
            case 6U:
            case 7U:
            case 8U:
            case 12U:
            case 16U:
            case 20U:
            case 24U:
            case 32U:
            case 48U:
            case 64U:
                return SystemP_SUCCESS;
            
            default:
                return SystemP_FAILURE;
        }
    }

    Could you please try this and let me know if it works at your end?

    谢谢。此致、

    Nikhil Dasan

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

    你好、Nikhil、  

    我尝试使用您的 zip 文件示例、但除了 0x0、它仍然不接受任何其他的 CAN ID。

    它确实修复了`mcanEnableTransceiver ()`,谢谢。


    相反、我移植了 LLD mcan 环回轮询示例、将 canfd 用于我的用例。 这个功能可以正常运行。

     

    谢谢!