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.

[参考译文] TMS320F28377S:无法进入 CAN 接收中断。

Guru**** 2395875 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1215738/tms320f28377s-can-cannot-enter-the-can-receiving-interrupt

器件型号:TMS320F28377S

尊敬的先生

当 CAN 端口用于发送和接收数据时、CAN 接收 DSP 本身的数据很少见。 此时、CAN 发送 DSP 本身的数据是正常的。 当详细检查软件时、发现软件无法进入 CAN 接收中断。

这种情况的可能原因是什么、您可以尝试哪些解决方案?

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

    您是否认为发送器已正确传输数据、但复制到报文对象中的数据不正确? 您是如何验证数据是否正确传输的? 您是否使用总线分析仪监控总线? 这种情况不太可能发生、因为消息 RAM 受到奇偶校验保护。 如果消息 RAM 确实损坏、则会标记奇偶校验错误。 接收中断没有被触发这一事实表明实际上还没有接收到帧。

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

    Gabriel、

    当接收到的数据异常时、您还可以查看 CAN_ES 寄存器的内容吗?  CAN_ES 将报告最后一次发生的错误。

    此致、

    约瑟

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

    亲爱的约瑟夫

    可通过 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之间的差异。

    谢谢。

    约瑟

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

    亲爱的约瑟夫

    DSP1和 DSP2都是 F28377D 器件。 DSP1和 DSP2配置了不同的节点 ID。 此外、软件配置相同、没有任何差异。 附件是我的代码。 我希望您能帮助我了解是否有 errors.e2e.ti.com/.../BspECan.c

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

    尊敬的 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 位清零来启用重传。

    此致、

    约瑟

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

    亲爱的约瑟夫

    今天,我做了你说,如下:

    HWREG (CANB_BASE + CAN_O_CTL)&&~CAN_CTL_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 ()函数的频率如何?

    谢谢。

    约瑟

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

    亲爱的约瑟夫

    1 μ s 波特率、为250kbps。

    2 μ s 在大多数、下、每1ms 发送一帧数据、但在某些情况下、可以在一个位置发送两个或三个数据帧。

     

    3、您能为我提供一个正常的例程、以便通过多个消息对象发送和接收数据以供我参考吗? 如有可能,我将不胜感激。

     

    谢谢

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

    尊敬的 Gabriel:

    在250kbps 的速率下、 平均帧(包含8个字节的数据、控制位、节点 ID、CRC 和填充位-总共约为125位)发送至少需要0.5ms。  对于每1ms 发送一个帧的 CAN 总线来说、这可能没有问题、但如果接收帧或连续帧时接收通道出现问题。  可能会导致一些问题。  如果当前发送帧到总线的另一节点赢得仲裁、CAN 协议仍会尝试重新发送一个尚未确认的帧、或者当前发送的帧挂起。

    您是否可以尝试将波特率增加到500kbps 以查看这是否有助于改善帧接收?

    谢谢。

    约瑟  

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

    亲爱的约瑟夫

    今天、我尝试将波特率增加到500kbps 以进行测试、这样可以更好地接收帧、但仍然偶尔出现无法进入接收中断的问题。

     

    谢谢

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

    尊敬的 Gabriel:

    看起来有些消息可能未进行传输、或者由于收发频率的原因而丢失。  首先确保不要禁用自动重发送、以便在没有确认节点已接收帧时可以继续重新传输该帧。

    如果您使用监控 CAN 总线是否存在任何已发送帧的 CAN 分析仪(峰值 CAN 或任何 CAN 分析工具)、调试可能会有所帮助。   将 CAN 分析仪置于侦听模式、以便不会出现任何确认。  您可能希望看到由节点发送的任何帧确实正在传输到 CAN 总线。  如果您可以确认发送的每个帧都使其到达 CAN 总线、那么我们可以开始调试为什么没有接收到该帧。

    在报文 RAM 的内容被传输到接口寄存器后、可以在 CAN_IFxMCTL 寄存器中检查一位、看看报文是否丢失。  您可以在接收节点中监视该寄存器、该位是 MsgLst (位14)。

    查看您是否可以使用上述建议的步骤跟踪问题的来源(传输期间或接收期间)。

    谢谢。

    约瑟