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.

[参考译文] AM2631:AM2631 CAN–TX 邮箱未完全传输帧

Guru**** 2826755 points

Other Parts Discussed in Thread: AM2631, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1575408/am2631-am2631-can-tx-mailbox-not-fully-transmitting-frames

器件型号:AM2631
主题: SysConfig 中讨论的其他器件

工具/软件:

您好:
我目前正在处理的 AM2631 上的 CAN 模块 、使用 TI 提供的低级驱动程序。

我在测试过程中遇到了以下问题:
当我尝试连续发送多个 CAN 帧(例如 10 帧)时、 第一次仅成功传输前几个帧(例如 3)
其余帧是 不立即发送

而是发送它们 下一次 我调用 send 函数 以及新数据 、结果为:

  • 第一次传输期间仅发送部分帧;

  • 其余帧延迟到下一次传输;

  • 在总线上、我会观察到“最后一个调用的剩余帧+当前新数据“一起发送。

第一次尝试中发送的帧数为 不固定 ——有时 3、有时 4 或 5 等
我怀疑这可能与有关 可以发送队列、邮箱配置或中断处理


我想问:

  1. 请帮助检查是否存在 CAN 配置(邮箱,中断等) 对吗?

    请在随附的文件中找到 CAN 低级配置。
    static void mcanInitMsgRamConfigParams(MCAN_MsgRAMConfigParams
                                               *msgRAMConfigParams)
    {
        int32_t status;
    
        MCAN_initMsgRamConfigParams(msgRAMConfigParams);
    
        /* Configure the user required msg ram params */
        msgRAMConfigParams->lss = BMS_MCAN_STD_ID_FILTER_CNT;
        msgRAMConfigParams->lse = BMS_MCAN_EXT_ID_FILTER_CNT;
        msgRAMConfigParams->txBufCnt = BMS_MCAN_TX_BUFF_CNT;
        msgRAMConfigParams->txFIFOCnt = BMS_MCAN_TX_FIFO_CNT;
        /* Buffer/FIFO mode is selected */
        msgRAMConfigParams->txBufMode = MCAN_TX_MEM_TYPE_BUF;
        msgRAMConfigParams->txEventFIFOCnt = BMS_MCAN_TX_EVENT_FIFO_CNT;
        msgRAMConfigParams->rxFIFO0Cnt = BMS_MCAN_FIFO_0_CNT;
        msgRAMConfigParams->rxFIFO1Cnt = BMS_MCAN_FIFO_1_CNT;
        /* FIFO blocking mode is selected */
        msgRAMConfigParams->rxFIFO0OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
        msgRAMConfigParams->rxFIFO1OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
    
        status = MCAN_calcMsgRamParamsStartAddr(msgRAMConfigParams);
        DebugP_assert(status == CSL_PASS);
    
        return;
    }
    
    #define MCAN_STD_ID_FILTER_CNT               (1U)
    /* Maximum EXT Filter Element can be configured is 64 */
    #define MCAN_EXT_ID_FILTER_CNT               (1U)
    /* Maximum TX Buffer + TX FIFO, combined can be configured is 32 */
    #define MCAN_TX_BUFF_CNT                     (1U)
    #define MCAN_TX_FIFO_CNT                     (1U)
    /* Maximum TX Event FIFO can be configured is 32 */
    #define MCAN_TX_EVENT_FIFO_CNT               (10U)
    /* Maximum RX FIFO 0 can be configured is 64 */
    #define MCAN_FIFO_0_CNT                      (32U)
    /* Maximum RX FIFO 1 can be configured is 64 and
     * rest of the memory is allocated to RX buffer which is again of max size 64 */
    #define MCAN_FIFO_1_CNT                      (32U)
    #define MCAN_TX_MEM_TYPE_BUF                               (0U)
    /**< MCAN Tx Msg RAM buffers/FIFO */
    #define MCAN_TX_MEM_TYPE_QUEUE                             (1U)
    /**< MCAN Tx Msg RAM Queue */
    
    #define MCAN_DATA_SIZE_0BYTES                  (0U)
    /**< 0 byte data field */
    #define MCAN_DATA_SIZE_1BYTES                  (1U)
    /**< 1 byte data field */
    #define MCAN_DATA_SIZE_2BYTES                  (2U)
    /**< 2 byte data field */
    #define MCAN_DATA_SIZE_3BYTES                  (3U)
    /**< 3 byte data field */
    #define MCAN_DATA_SIZE_4BYTES                  (4U)
    /**< 4 byte data field */
    #define MCAN_DATA_SIZE_5BYTES                  (5U)
    /**< 5 byte data field */
    #define MCAN_DATA_SIZE_6BYTES                  (6U)
    /**< 6 byte data field */
    #define MCAN_DATA_SIZE_7BYTES                  (7U)
    /**< 7 byte data field */
    #define MCAN_DATA_SIZE_8BYTES                  (8U)
    /**< 8 byte data field */
    #define MCAN_DATA_SIZE_12BYTES                 (9U)
    /**< 12 byte data field */
    #define MCAN_DATA_SIZE_16BYTES                 (10U)
    /**< 16 byte data field */
    #define MCAN_DATA_SIZE_20BYTES                 (11U)
    /**< 20 byte data field */
    #define MCAN_DATA_SIZE_24BYTES                 (12U)
    /**< 24 byte data field */
    #define MCAN_DATA_SIZE_32BYTES                 (13U)
    /**< 32 byte data field */
    #define MCAN_DATA_SIZE_48BYTES                 (14U)
    /**< 48 byte data field */
    #define MCAN_DATA_SIZE_64BYTES                 (15U)
    /**< 64 byte data field */

提前感谢您的支持!

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

    您好:

    感谢您提出此问题。

    是否使用 SysConfig 配置 MCAN 模块? 如果是、您能否提供.syscfg 以供查看?

    您提到要连续发送 10 帧、

    但是、根据您共享的代码(摘录如下):

    #define MCAN_TX_BUFF_CNT (1U)
    #define MCAN_TX_FIFO_CNT (1U)
    /* Maximum TX Event FIFO can be configured is 32 */
    #define MCAN_TX_EVENT_FIFO_CNT (10U)
    /* Maximum RX FIFO 0 can be configured is 64 */
    
    
    
    msgRAMConfigParams->txBufMode = MCAN_TX_MEM_TYPE_BUF;

    您正在定义单个 TX_BUFF(如果仅依赖 FIFO、则该值应为 0)。

    您正在将 TX_MSG_FIFO 大小定义为仅 1(如果需要将 10 条连续消息加载到 TX FIFO 缓冲区以进行后续传输、则该大小应该为 10)。

    您正在将 txBufMode 定义为 MCAN_TX_MEM_TYPE_BUF (0)、应将其分配给 MCAN_TX_MEM_TYPE_FIFO (1)。

    有关更多详细信息、请查看以下链接的 MCAN API 指南中提供的信息:

    AM261x MCU+ SDK:MCAN_MsgRAMConfigParams 结构参考

    应用上述更改后、我希望您的测试结果更好。

    此致、

    Zackary Fleenor

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

    我是否可以理解、如果我的发送类型是 FIFO 发送、则我的配置应该是:
    txBufMode = MCAN_TX_MEM_TYPE_FIFO;
    #define MCAN_TX_BUFF_CNT (0U)
    #define MCAN_TX_FIFO_CNT (10U)
    #define MCAN_TX_EVENT_FIFO_CNT (10U)
    如果我的传输类型是缓冲器、则配置应为:
    txBufMode = MCAN_TX_MEM_TYPE_BUF;
    #define MCAN_TX_BUFF_CNT (10U)
    #define MCAN_TX_FIFO_CNT (0U)
    #define MCAN_TX_EVENT_FIFO_CNT (0U)
    这是正确的吗?

    附件是 SysConfig 的屏幕截图

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

    您好、理解正确。

    我假设您已为给定的 CAN 收发器/系统配置了适当的比特率属性。 在 SysConfig 中为 MCAN 配置了其他参数、这些参数在评估 MSG RAM/TX 配置时会更有用、但原始代码也就足够了。

    此致、

    Zackary Fleenor