尊敬的先生
当 CAN 端口用于发送和接收数据时、CAN 接收 DSP 本身的数据很少见。 此时、CAN 发送 DSP 本身的数据是正常的。 当详细检查软件时、发现软件无法进入 CAN 接收中断。
这种情况的可能原因是什么、您可以尝试哪些解决方案?
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 端口用于发送和接收数据时、CAN 接收 DSP 本身的数据很少见。 此时、CAN 发送 DSP 本身的数据是正常的。 当详细检查软件时、发现软件无法进入 CAN 接收中断。
这种情况的可能原因是什么、您可以尝试哪些解决方案?
亲爱的约瑟夫
可通过 CAN 分析仪读取 DCAN 发送的数据。 当 DCAN 无法接收数据时、上部功能通常可以接收由 DCAN 发送的数据帧来证明传输功能仍正常。
2、测试用两块 DSP 电路板、同时挂在总线上、上部计算机发送广播帧、当 DSP 2能够接收时、DSP 1无法接收数据、 为了证明外部器件必须在总线上进行正常的数据传输;
3.当发生故障的 DCAN 无法接收数据时,DCAN 的所有故障标志都是0。 出于未知原因、相关操作功能如下:
4、同时添加下面的 DCAN 外设复位功能不能解决问题:
尊敬的 Gabriel:
从您的设置说明来看、似乎在 CAN 总线上有多个节点、其中两个是 DSP。 一个主节点正在发送 CAN 消息、而另外两个节点(DSP1和 DSP2)应该正在接收 CAN 帧。 DSP1和 DSP2都是 F28377S 器件吗、并且两个 DSP 上的硬件是否有差异? 两个 DSP 是否使用相同的 CAN 配置? 从根本上说、我只想了解 DSP1和 DSP2之间的差异。
谢谢。
约瑟
尊敬的 Gabriel:
仅通过查看代码就很难调试您看到的问题、但也许您可以进行一些更改、以确定是什么原因导致其中一个节点无法接收帧。 查看您是否可以尝试以下操作:
1.) 移除可接收 CAN 帧的 DSP。 剩余的 DSP 是否能够接收 CAN 帧?
2.) 交换2个 DSP 的节点 ID。 无法接收 CAN 帧的原始节点是否仍然无法接收消息?
此外、什么是 CAN 时钟设置以及 SYSCLK 的源是什么(外部晶体、其他...)
谢谢。
约瑟
亲爱的约瑟夫
1、SYSCLK 的源是外部晶体、如以下函数所示:
InitSysPll (XTAL_OSC、IMULT_20、FMULT_0、PLLCLK_BY_2);
2、CAN 时钟为 CPU SYSCLKOUT、如以下函数所示:
CANClkSourceSelect (CANB_BASE、0);//0 -所选 CPU SYSCLKOUT (CPU1.SYSCLK 或 CPU2.SYSCLK)
3 μ s 在、两个 DSP 的节点 ID 后、我发现无法进入接收中断的节点 ID 仍然是之前的节点 ID 号、节点61。 交换 DSP 电路板后、节点44仍然正常。 这可以证明它与硬件无关、问题在于软件。
4 μ s、我删除能够始终进入接收中断的 DSP 节点(节点编号:44)后、仅保留 DSP 节点(节点编号: 61)那有时不能进入接收中断、我发现在这样做之后、节点61通常能够一直进入接收中断、并且之后不会出现无法进入接收中断的情况。
5、在上述操作中、我推测节点44向总线发送了过多的帧、这会影响节点61的接收。 为了验证此推测、我删除了一些由节点44发送到总线的消息、但是仍然将节点44和61连接到总线。 上电后、节点61无法进入接收中断的可能性大大降低。
6 μ s 在、操作中、我推测节点44向总线发送了太多帧、这会影响节点61的接收。 为了验证此推测、我删除了一些由节点44发送到总线的消息、但是仍然将节点44和61连接到总线。 上电后、节点61无法进入接收中断的可能性大大降低。 我高度怀疑接收邮箱的配置或者轮询空闲发送邮箱的代码有问题、但是我不知道它在哪里。 我希望你能帮我检查收发邮箱操作代码是否有问题。
谢谢!
尊敬的 Gabriel:
在 CAN 中、如果发送节点没有从接收节点接收 ACK、它将尝试重新发送帧、除非禁用了自动数据重新发送功能。 也许这就是问题所在。 以下是根据您的代码截取的片段:
//在总线脱离状态下,当检测到128*11个隐性位后,模块将自动恢复总线的连接状态 HWREG(CANB_BASE + CAN_O_CTL) |= CAN_CTL_ABO; //Auto-Bus-On Enable //在检测到任何总线活动后,模块退出低功耗模式(自动唤醒) HWREG(CANB_BASE + CAN_O_CTL) |= CAN_CTL_WUBA;//Wake Up on Bus Activity //关闭自动从发功能 HWREG(CANB_BASE + CAN_O_CTL) |= CAN_CTL_DAR;//Disable Automatic Retransmission
尝试通过将 DAR 位清零来启用重传。
此致、
约瑟
尊敬的 Gabriel:
我不了解您的代码中的 for 循环的作用。 似乎代码正在尝试将报文对象编号复制到 IF1CMD 寄存器中以处理对象1-24、之后轮询 BUSY 位和 TXRQST、那么在 for 循环之后用函数 CANMessageSet ()发送帧。 这意味着只传输了一个帧。 for 循环内的代码已在 CANMessageSet 内完成。 是否可以将 循环围绕函数 CANMessageSet()放置,如下所示?
for(i=1;i<=24;i++) { CANMessageSet(CAN_BASE, i, (void *)&sTXCANMessage, MSG_OBJ_TYPE_TX); // add some delay here if needed }
此致、
约瑟
亲爱的约瑟夫
1、函数"void BSPCANTxDataBuffInByteAlterDlc (u8 CANNum、u8 DLC、u32 ID、u8* Data)"和"void BSPCANTxDataBuffInDWordAlterDlc (u8 CANNum、u8 DLC、u32 ID、u32 DWord0、u32 DWord1)"是两个 CAN 通道外部发送消息帧的接口函数。
2、我使用这个循环的原因是因为我已经为发送消息配置了消息对象1-24、但是每个邮箱在不同的时间段可能处于忙或空闲状态。 因此、我需要搜索要发送的空闲邮箱、此时不能使用忙邮箱。 这样做的目的是为了最大程度地利用24个报文对象、避免浪费时间和延迟传输效率。根据您刚才所说的、代码存在问题、但是按照我的设计理念、应该如何校正代码呢?
3 μ s、我按照您的说明 在函数"CANMessageSet (CAN_BASE、I、(void *)&sTXCANMessage、MSG_OBJ_TYPE_TX);"后添加一些延迟。 这可能会影响项目的整体运行、因为我当前的项目以时隙方式运行。 在此处添加延迟将影响其他任务的执行时序。
谢谢。
尊敬的 Gabriel:
感谢您的讲解。 现在、我了解您正在尝试在 for 循环中实现什么。 您还可以尝试轮询 寄存器 CAN_TXRQ_21来查看哪个对象不忙于发送请求。
还有一些问题-您为波特率设置了什么速度以及 调用 BSPCANTxDataBuffInByteAlterDlc ()/ BSPCANTxDataBuffInDWordAlterDlc ()函数的频率如何?
谢谢。
约瑟
尊敬的 Gabriel:
在250kbps 的速率下、 平均帧(包含8个字节的数据、控制位、节点 ID、CRC 和填充位-总共约为125位)发送至少需要0.5ms。 对于每1ms 发送一个帧的 CAN 总线来说、这可能没有问题、但如果接收帧或连续帧时接收通道出现问题。 可能会导致一些问题。 如果当前发送帧到总线的另一节点赢得仲裁、CAN 协议仍会尝试重新发送一个尚未确认的帧、或者当前发送的帧挂起。
您是否可以尝试将波特率增加到500kbps 以查看这是否有助于改善帧接收?
谢谢。
约瑟
尊敬的 Gabriel:
看起来有些消息可能未进行传输、或者由于收发频率的原因而丢失。 首先确保不要禁用自动重发送、以便在没有确认节点已接收帧时可以继续重新传输该帧。
如果您使用监控 CAN 总线是否存在任何已发送帧的 CAN 分析仪(峰值 CAN 或任何 CAN 分析工具)、调试可能会有所帮助。 将 CAN 分析仪置于侦听模式、以便不会出现任何确认。 您可能希望看到由节点发送的任何帧确实正在传输到 CAN 总线。 如果您可以确认发送的每个帧都使其到达 CAN 总线、那么我们可以开始调试为什么没有接收到该帧。
在报文 RAM 的内容被传输到接口寄存器后、可以在 CAN_IFxMCTL 寄存器中检查一位、看看报文是否丢失。 您可以在接收节点中监视该寄存器、该位是 MsgLst (位14)。
查看您是否可以使用上述建议的步骤跟踪问题的来源(传输期间或接收期间)。
谢谢。
约瑟