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.

[参考译文] TMS570LS1114:TMS570LS 1114 DCAN、为什么在睡眠和唤醒过程中生成脱离总线。

Guru**** 2398695 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672363/tms570ls1114-tms570ls-1114-dcan-why-bus-off-generated-during-sleep-and-wakeup-process

器件型号:TMS570LS1114

您好!

当我们测试 DCAN 驱动器睡眠和唤醒功能时,我们发现在过程中将生成脱离总线,睡眠和唤醒似乎正常唤醒,但当我们连续执行20次休眠唤醒时,脱离总线将在过程中生成至少一次。

那么、为什么会生成脱离总线? 希望您能提出建议。

BR、谢谢

Ming

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

    您好、Ming、

    如果 CAN 控制器发生故障、或者错误(ERRC 寄存器中的 TEC 或 REC)累积得非常严重、则状态转换为 总线关闭 状态。 CAN 控制器与 CAN 总线断开连接。

    CAN 协议定义了5种机制来检测损坏的消息:位监控、格式检查、填充检查、ACK 检查和 CRC 检查。 位监控和 ACK 检查由发送器执行。 接收器执行格式检查、填充检查和 CRC 检查。 每当 TX 错误计数器超过255的值时、它将切换到脱离总线状态。

    这可能是由您的设置、睡眠唤醒序列引起的。 总线关断仅用于休眠唤醒节点还是其他节点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、QJ Wang、
    是的,仅对于休眠唤醒节点,我们只使用 CAN 测试工具测试一个节点。
    我们的睡眠和唤醒代码如下所示:

    睡眠:
    U8 m_ubLoopCnt;
    volatile u32 ulShadowImage;
    /*设置 WUBA 和 PDR 位请求断电模式*/
    CAN_SETREG_BIT (CAN_CONTRAL_REG_ADDR、(CAN_CONTRAL_WUBA_BIT | CAN_CONTRAL_PDR_BIT)、u32);

    /*等待挂起的传输或接收到结束和睡眠模式确认*/
    m_ubLoopCnt = 0U;
    /*等待 PDA 位*/
    操作

    M_UULoopCnt++;
    ulShadowImage = CAN_GETREG_VALUE (CAN_STATUS_REG_ADDR);

    while (((ulShadowImage & CAN_STATUS_PDA_BIT)=0)&&(m_ubLoopCnt < CAN_LOOP_MAX));
    /*一旦 CAN 控制器处于睡眠状态、激活唤醒中断*/
    CAN_WakeUpInterruptEnable (IDXCTRL_void);

    唤醒中断路由:
    if (nCS_TST_bit_set (ulDataValue、CAN_STATUS_WAKEUPPND_BIT、tCanBusSize))

    /*将协议处理程序切换到初始化模式以防止*/
    /*来自 CAN 帧传输和/或接收*/
    CAN_DESACTIVATE ();//设置初始化模式
    CAN_WAKE_UP_IND;


    唤醒后、路由将发送数据。

    该过程中是否存在一些问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ming、

    我看不到问题。 请添加代码以监控错误计数和错误状态。 仅当错误计数达到255时、才进入脱离总线状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当处理总线间关断状态且 Boff = 1时、TEC = 0xf8、REC = 0。   错误状态寄存器的值为000002E7。

    1、为什么 TEC 不是255处于脱离总线状态?

    2、为什么读取错误状态寄存器后 WakeUpPnd 不会复位?

    3、在哪里可以找到一些用于脱离总线和休眠唤醒的 DCAN 演示代码?在 TI websit 中,轮询模式将更好。

    BR、谢谢

    Ming

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

    问得非常好。

    1.我认为在此时发生总线关闭时,TEC 不会因最后一个错误(TEC+=8)而更新
    读取 ES 寄存器将清除 WakeUpPnd 标志、DCAN 可能会将 WakeUpPnd 标志重新置位、并可能发生第二个中断
    不能、我们没有用于生成 DCAN 本地断电和唤醒的示例代码。

    进入本地断电模式:
    1.将 DCAN CTL 寄存器中的 PDR 位置位

    从本地断电唤醒:
    手动清除 PDR 位和 Init 位

    2. CAN 总线消息唤醒代码:应在 DCAN CTL 寄存器中启用 WUBA
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ming、

    请发布您的代码、以便我可以在电路板上进行测试。 我不理解您代码中的 ISR:

    唤醒中断路由:
    if (nCS_TST_bit_set (ulDataValue、CAN_STATUS_WAKEUPPND_BIT、tCanBusSize))

    /*将协议处理程序切换到初始化模式以防止*/
    /*来自 CAN 帧传输和/或接收*/
    CAN_DESACTIVATE ();//设置初始化模式
    CAN_WAKE_UP_IND;


    如果 WUBA 位被置位、主 CAN 总线电平将自动启动唤醒序列。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    是的,我们使用 CAN 总线消息唤醒,设置 WUBA。

    关闭总线和恢复过程、尤其是恢复过程、启用 ABO 时的操作步骤 以及不启用 ABO 的操作步骤、会怎么样?

    谢谢、致以诚挚的问候。

    Ming

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    中断例程:
    void CAN_LLD_AllInterrupts (CTRLIDX_void)

    U16 ISRnb;
    ISRnb =(U16)(CAN_GETREG_VALUE (CAN_INTERRUPT_REG_ADDR)& 0x80FFU);

    /*状态中断*/
    if ((ISRnb & CAN_STATUS_INTERRUPT)== CAN_STATUS_INTERRUPT)

    CAN_ControllerStatusManage (IDXCTRL_void);


    /*邮箱中断*/
    其他

    /* Rx 确认*/
    if (CAN_mailbox_direction (ISRnb-1U)== CAN_mailbox_mode_RX)

    CAN_RxFrameMailbox (IDXCTRL (U16)(ISRnb-1U));


    /* Tx 确认*/
    #if (CAN_TX_MODE = CAN_INTERRUPT_MODE)
    其他

    CAN_TxFrameMailbox (IDXCTRL (U16)(ISRnb-1U));

    #endif


    /*清除 INTERRUPT_REG_//
    ISRnb = CAN_GETREG_VALUE (CAN_INTERRUPT_REG_ADDR);



    NCS_PRI_FCT void CAN_ControllerStatusManage (CTRLIDX_void)

    tCanBusSize ulDataValue;

    /*读取寄存器会清除 IT 标志*/
    ulDataValue = CAN_GETREG_VALUE (CAN_STATUS_REG_ADDR);

    /*总线关闭状态*/
    if (nCS_TST_bit_set (ulDataValue、CAN_STATUS_BOFF_BIT、tCanBusSize))

    /*在脱离总线状态下阻止协议处理程序, *
    /*将协议处理程序置于初始化模式,*/
    /*防止 CAN 帧传输和/或接收*/
    CAN_LLD_Deactivate (IDXCTRL_void);

    /*每个 BusOff 状态仅通知上层一次*/
    /*检查:NOPARSE */
    /* NOCOV 防御型*/
    if (CAN_false =m_ubBusOffNoified)

    /*设置 BusOff 通知标志*/
    m_ubBusOffNotified = CAN_true;

    /*脱离总线指示*/
    CAN_BUS_OFF_IND;

    其他


    /*检查:解析*/


    if (nCS_TST_bit_set (ulDataValue、CAN_STATUS_WAKEUPPND_BIT、tCanBusSize))

    /*将协议处理程序切换到初始化模式以防止*/
    /*来自 CAN 帧传输和/或接收*/
    CAN_DESACTIVATE ();
    CAN_WAKE_UP_IND;



    请仔细检查。 谢谢你。

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

    如果启用了 ABO、将自动启动脱离总线恢复序列。 如果未启用 ABO、模块将保持脱离总线状态、您需要手动设置并复位 CTL 寄存器中的 Init 位。

    当 INIT 位再次被应用程序清零时、模块将等待总线空闲129个事件(129×11个连续隐性位)、然后恢复正常运行。 在脱离总线恢复序列结束时、错误计数器将被复位。

    如果导致脱离总线的问题未得到解决、则会重复脱离总线序列。