工具/软件:
您好、
我一直在尝试为我们的工程实现 CAN 协议。 TX 配置正常。 但对于接收、我们当前使用的是 RXFIFO、我尝试配置专用的 RXBUFFER、但无法通过 RXBUFFER 接收任何中断和接收消息。 请给出使用 RXBUFFER 的一些想法。
谢谢。
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 协议。 TX 配置正常。 但对于接收、我们当前使用的是 RXFIFO、我尝试配置专用的 RXBUFFER、但无法通过 RXBUFFER 接收任何中断和接收消息。 请给出使用 RXBUFFER 的一些想法。
谢谢。
您好、
正如我向大家介绍的、我们在工程中使用的是 CAN 协议。 问题是、在使用 RXFIFO 时、我们无法使用带有专用缓冲器的 RX 缓冲器。 但我们更喜欢使用 RXBUFFER 元件来减少 CAN 总线的流量。 因为在使用 RXFIFO 时、我们无法尽快处理。 则无法使用 RXFIFO 进行调试。 因此、我建议您给我一个使用 RX 缓冲器实现 CAN 协议的想法。
谢谢、
Praveen
尊敬的 Praveen:
感谢您提供的信息。 我查看了提供的代码、想详细了解您是如何实现系统的。
我们首先尝试缩小这是否可以是软件还是硬件
听起来您已经创建了一个测试用例、其中发送器发送了一个恒定值、但接收器偶尔收到了错误的值。
>>>您能否提供显示端接电阻(以及任何其他连接)的原理图?
>>您是否在 Launchpad /EVM 上测试了代码、以便使用经验证的硬件来测试软件?
马修
您好、Matthew、
你好!
我们已解决了作为与 CAN 通信相关的查询而提出的问题。
以前的方法:
我们对每个 ID 使用 TX 专用缓冲区。 因为我们认为、如果我们为每个 ID 使用专用缓冲区、将会更加高效和可靠。
但是它意外地造成了一个问题。
CAN 传输侧使用了以下功能。
DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&TxMsg);
在这里、您可以看到完全取决于缓冲器类型和缓冲器编号的参数。 在这里、您可以通过不同的缓冲区传输数据
生成单个缓冲区。
DL_MCAN_TXBufAddReq (MCAN0_INST、0);
这是用于通过 CAN 传输(请求传输)数据的函数。 在这里、我们还提到缓冲区编号。
因此、它不会导致任何问题。
无论怎么说,一切都是完美的定义和使用,我们都无法解决这个问题。
为便于您理解、这里我提供了一个小型示例代码、说明我们如何实现 CAN 状态机。
交换机(传输) 
{ 
充电盒充电器_信息: 
         充电器信息 (); 
         DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&Tx Msg_Charger_Info); 
         DL_MCAN_TXBufAddReq (MCAN0_INST、0); 
         TRANSMIT = CHARGE_PROFILE; 
         休息; 
充电盒 Charge_profile: 
         Charge_Profile (); 
         DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、1、&Tx Msg_Charge_Profile); 
         DL_MCAN_TXBufAddReq (MCAN0_INST、1); 
         传输= CHARGER_INFO: 
         休息; 
} 
在状态机显示上方、这两种情况都使用了不同的缓冲区编号。
当前方法:
现在、我们将对所有 ID 使用单个 TX 缓冲区。 它按预期运行。
交换机(传输) 
{ 
充电盒充电器_信息: 
         充电器信息 (); 
         DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、0、&Tx Msg_Charger_Info); 
         DL_MCAN_TXBufAddReq (MCAN0_INST、0); 
         TRANSMIT = CHARGE_PROFILE; 
         休息; 
充电盒 Charge_profile: 
         Charge_Profile (); 
         DL_MCAN_writeMsgRam (MCAN0_INST、DL_MCAN_MEM_TYPE_BUF、 0 &Tx Msg_Charge_Profile); 
         DL_MCAN_TXBufAddReq (MCAN0_INST、0); 
         传输= CHARGER_INFO: 
         休息; 
} 
在状态机显示的上方、两种情况都使用相同的缓冲区编号。
第一种方法有什么问题、如何使用最后一种方法解决?
您能告诉我们实际的问题是什么吗?
谢谢、
Praveen
1) 它看起来像你正在使用缓冲区 0 你的所有消息. 这种行为是否可以接受?
a) 我的理解是、您希望 CHARGE_PROFILE 位于缓冲器 0 中、CHARGER_INFO 位于缓冲器 1 中。
2) 当您测试出现间歇性错误的初始解决方案时-->是否有任何其他子例程可能导致其挂起?
我会尝试创建一个基本的设置 系统 包括 CAN 传输、因此您可以将问题隔离到缓冲区。 听起来可能还有另一个变量在播放。
您好、Matthew、
您好、Matthew、
1) 它看起来像你正在使用缓冲区 0 你的所有消息. 这种行为是否可以接受?
a) 我的理解是、您希望 CHARGE_PROFILE 位于缓冲器 0 中、CHARGER_INFO 位于缓冲器 1 中。
回复:
是的、功能行为是可以接受的。
是的、我们希望使用专用缓冲器。
2) 当您测试出现间歇性错误的初始解决方案时-->是否有任何其他子例程可能导致其挂起?
回复:
没有、没有子例程。
我会尝试创建一个基本的设置 系统 包括 CAN 传输、因此您可以将问题隔离到缓冲区。 听起来可能还有另一个变量在播放。
回复:
我们已经尝试过。 项目代码仅具有 CAN 发送和接收功能。 但我们也面临同样的问题。
当前方法与前一种方法的区别在于、我们用于传输的缓冲区数量没有、其余部分完全相同。
查询:
我对当前方法的关注是“如果传输的信息数量增加到说 50 个消息“。
我怀疑对所有消息使用相同的缓冲区会导致问题。 您的意见如何?
谢谢、