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.
工具与软件:
大家好、您可以帮助了解 CAN API 吗?下面是 mcan_multi_message_tx 项目的代码
/*将 Tx 消息写入消息 RAM。 */
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&txMsg0);
/*将 Tx 消息写入消息 RAM。 */
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、1、&txMsg1);
/*添加传输请求。 */
DL_MCAN_TXBufAddReq (MCAN0_INST、0);
/*添加传输请求。 */
DL_MCAN_TXBufAddReq (MCAN0_INST、1);
我的客户需要使用 FIFO;因此、他们将 DL_MCAN_MEM_TYPE_BUF 更改为 DL_MCAN_MEM_TYPE_FIFO
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_FIFO、0、&txMsg0);
但是、当它们更改为 DL_MCAN_MEM_TYPE_FIFO 时、代码不起作用。
请告诉我们如何将 API 用于 FIFO。
此致、
Frangline。
嗨、Frangline、在上面的代码中、似乎仍在引用 TXBuf、而不是 TXFifo。 如果按住 CTRL 并点击 DL_MCAN_TXBufAddReq、它应该会将您带到 dl_mcan.h 文件中所引用的声明和定义。 您可以 在该视图中查看是否需要进行任何更改。 我看到其中的多个 FIFO 函数可能会导致问题。 能否提供有关代码、所做的任何其他更改以及 SysConfig 设置的更多详细信息?
-Brian
Brian、您好!
感谢重放、我们正在尝试在 FIFO 模式下使用完整的 CAN 缓冲区 RAM (前512字节作为 Rx FIFO 缓冲区、后512字节作为 TX 缓冲区、随附下图)
使用上述经典 CAN 和以下代码对 RAM 进行上述配置后、我们无法一次传输1条以上的消息、接收也是如此
/*将 Tx 消息写入消息 RAM。 */
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_FIFO、0、&txMsg0);
/*将 Tx 消息写入消息 RAM。 */
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_FIFO、0、&txMsg1);
/*添加传输请求。 */
DL_MCAN_TXBufAddReq (MCAN0_INST、0);
/*添加传输请求。 */
DL_MCAN_TXBufAddReq (MCAN0_INST、1)
我们正在尝试了解当 CAN RAM 配置为 FIFO 时要使用哪些 API 进行传输、如果有任何响应、我们将不胜感激。
谢谢你
尊敬的 Shivaraj:
看看 SDK 中针对 CAN 的示例、FIFO 事件大小似乎具有不同的设置、您是否可以尝试更改此值以查看是否允许发送多条消息? 看起来您没有同时使用 FIFO TX 缓冲器。
-Brian
Brian、您好!
是的、我们不使用 FIFO 事件、因此我们将其保持为0。 我们将 CAN RAM 仅用于 FIFO
在了解可用的 API 后、现在我们可以使用以下代码一次传输32条消息以进行传输、但我们在接收 CAN 消息时仍然面临问题
对于接收 CAN 消息、我们不知道当 FIFO 中填充多条消息时要使用哪个 API。
尊敬的 Shivaraj:
您应该能够通过以下代码读取这些 RX 数据:
if ((gInterruptLine1Status & MCAN_IR_RF0N_MASK) == MCAN_IR_RF0N_MASK) { rxFS.num = DL_MCAN_RX_FIFO_NUM_0; while ((rxFS.fillLvl) == 0) { DL_MCAN_getRxFIFOStatus(MCAN0_INST, &rxFS); } DL_MCAN_readMsgRam( MCAN0_INST, DL_MCAN_MEM_TYPE_FIFO, 0U, rxFS.num, &rxMsg); DL_MCAN_writeRxFIFOAck(MCAN0_INST, rxFS.num, rxFS.getIdx); processRxMsg(&rxMsg); gInterruptLine1Status &= ~(MCAN_IR_RF0N_MASK); }
谢谢!
此致
Johnson