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.

[参考译文] TMS320F28388D:如何使用 MCAN TX-FIFO 请求传输

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/965086/tms320f28388d-how-to-request-a-transmission-using-the-mcan-tx-fifo

器件型号:TMS320F28388D

我让 MCAN 外设在经典 CAN 模式下工作、使用单个 CAN 数据包发送/接收和缓冲模式、现在我尝试使用多个 FIFO 来扩展该功能。

使用 TX 缓冲区时、使用 MCAN_writeMsgRam 写入缓冲区数据、并通过写入 TXBAR (使用缓冲区索引)来启动传输。 使用 FIFO 时、发送请求是相同还是不同? 我找不到使用多个 FIFO 的任何示例代码。

另外、由于 TX-buffers 和 TX-FIFO 共享相同的存储空间、使用一个缓冲区还是使用另一个缓冲区有什么优势? 我认为 FIFO 功能看起来更像 C2000邮箱结构、 MCAN_getTxFIFOQueuStatus 函数提供了使用 TX 缓冲器时不可用(或更难获得)的可用/空传输空间的视图、但这也不清楚。

谢谢、

Jim

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

    您好!

    要配置 TX FIFO、首先必须在 msg ram config 参数中配置 TX FIFO 大小参数。

    msgRAMConfigParams.txBufNum = 10;//专用发送缓冲器数量。
    msgRAMConfigParams.txFIFOSize = 10U;// Tx FIFO/队列。

    相同的 API MCAN_writeMsgRam 可用于将 msg 数据添加到 TX FIFO 中、但具有不同的 mem 类型参数。

    MCAN_writeMsgRam (MCAN0_BASE、MCAN_MEM_TYPE_FIFO、0U、&txMsg);

    请注意、当使用 FIFO 时、第三个参数是无关参数、因为 Put 索引是从 FIFO 状态读取的、并且适当地将 msg 放在 FIFO 中。

    使用 TXBAR 启动 FIFO 的传输请求相同。  MCAN_txBufAddReq (MCAN0_BASE、1U);

    谢谢、

    Yashwant

     

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

    Yashwant、

    感谢您的快速回答;我还有另一个问题希望能解决所有这些问题。 如果我想发送一个多数据包消息、MCAN_writeMsgRam 和 MCAN_txBufAddReq 的参数是否改变(当然、除了 CAN 数据包数据外)? 换句话说、代码是否如下所示:

    txMsg.data =…… //填充第一个数据包
    MCAN_writeMsgRam (MCAN0_BASE、MCAN_MEM_TYPE_FIFO、0U、&txMsg);
    MCAN_txBufAddReq (MCAN0_BASE、1U);//使用 FIFO0

    txMsg.data =…… //填第二个数据包
    MCAN_writeMsgRam (MCAN0_BASE、MCAN_MEM_TYPE_FIFO、0U、&txMsg);
    MCAN_txBufAddReq (MCAN0_BASE、1U);//仍使用 FIFO0

    此代码对我来说还不起作用、因为我似乎溢出了 MCAN 外设(许多数据包、而不仅仅是2个数据包)。 在重新填充 FIFO 之前、是否需要添加一些"检查先前的数据包已完成"代码行? 我还尝试在重新加注之前检查 FillLevel、但这不起作用。

    谢谢、

    Jim

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

    Jim、

    txBufAddReq 的参数将根据正在添加的 msg 的 FIFO 中的位置而变化。 对于多个数据包、您可以将代码更新为类似这样的内容、即在添加消息之前读取 FIFO 存储索引并使用该代码来添加请求。

    MCAN_TxFIFOStatus FIFO 状态;
    对于(i=0;i<10;i++)
    {
    MCAN_getTxFIFOQueuStatus (MCAN0_BASE、FIFO 状态);
    MCAN_writeMsgRam (MCAN0_BASE、MCAN_MEM_TYPE_FIFO、0U、&txMsg);
    
    //
    //启用传输中断。
    //
    MCAN_txBufTransIntrEnable (MCAN0_BASE、FIFO 状态.putIdx、1U);
    
    //
    //添加传输请求。
    //
    MCAN_txBufAddReq (MCAN0_BASE、FIFO 状态.putIdx);
    } 

    谢谢、

    Yashwant