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.

[参考译文] TMS570LC4357:通过PCR关闭DCAN的问题

Guru**** 2468240 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1079313/tms570lc4357-problems-with-dcan-shutdown-by-pcr

部件号:TMS570LC4357

我们未能按照TRM中所述关闭DCAN外围设备:

27.11 1进入全局断电模式。

DCAN等待,直到识别出总线空闲状态。 然后,它将自动设置初始位,以指示已进入全局断电模式。

在关闭总线时 ,总线不空闲 -其他一些设备正在驱动CAN总线。 我们的DCAN刚刚完成了一些自检,并已重置为初始化状态。

但 我们确实需要单独禁用此设备,因为CAN总线不处于空闲状态。  

即使进入并确认本地断电模式,问题仍然存在:

27.12 1进入本地断电模式,

通过设置PDA位,DCAN模块会指示已 进入本地断电模式

只要CAN总线不空闲(即相应PSPWRDWNSET位的设置失败),DCAN仍经常无法进入全局断电模式。

我们碰巧遇到了一种解决问题的方法,但这是一些未记录的行为。

如果我们只在DCAN CTL寄存器中设置SWR位,而不设置初始化位,那么即使在CAN总线不空闲的情况下,我们也可以可靠地进入全局断电模式。

这种现象可能解释为DCAN处于强制重置状态(因为初始化位没有提供出的方法)。

但是,我们想知道当总线上有流量时,如何正确进入全局断电模式,或者我们的解决方法是否合法。

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

    CAN总线空闲后是否设置了DCAN CTL的初始位?

    如果CAN模块(例如DCAN1)断电, 时钟将被门控至DCAN1模块,并且不会为DCAN1模块计时。 但是,如果CPU对它们进行访问,则会为单次访问临时计时,但在访问后再次对它们进行门控。

    设置初始化后,将0x1写入SWR位将重置CAN模块,这意味着所有CAN寄存器都将重置为其默认值,但DCAN模块仍会计时。

    我的意思是,PowerDown与SWR不同。  

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

    初始化位是在出现问题时设置的,但是CAN总线在这段时间内不会空闲。

    • CAN总线连接到测试节点,该节点正在尝试发送初始化消息,由于还没有其他节点来确认消息,因此它将持续重新传输消息,因此CAN总线在连续11位的时间内不会处于空闲状态。

    我们所做的是在系统启动时执行DCAN ECC自检(SPNU540A安全手册中的CAN15功能)。

    最后,我们成功执行DCAN软件重置,如下所示:

    CTL =初始
    CTL = CTL | SWR
    (如果CTL != 0x0.1401万),则在SW重置后//期望值
    错误
    endif 

    之后我们要关闭DCAN,但设置未能在PCR->PSPWRDWNSET1 (对于DCAN1 A DCAN2)或PCR->PSPWRDWNSET0 (对于DCAN3和DCAN4)中设置断电位。

    当总线空闲时,它不会失败;当总线不空闲时,它在每次启动时都会发生大约一个DCAN的故障。

    我们不理解的一个解决方法是将SWR位设置为如下所示:

    CTL = SWR // PCR中断电前的可疑解决方法 

    因此,CTL的值为0x00,即使总线未空闲,也可以通过PCR可靠地进入全局断电模式。

    当我们的总线不空闲时,关闭DCAN的正确方法是什么?

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

    写入 PCR->PSPWRDWNSET寄存器是关闭或禁用设备外围设备时钟的唯一方法。  

    在传输EOF文件位(7位)后,两次传输之间的CAN总线变为空闲。

    我们399.725万我们不理解的解决方法,但似乎只是设置了位SWR]

    如何确定设置SWR位后CAN模块已关闭?

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

    我们主要想解决PCR->PSPWRDWNSET位的设置问题,因为TI安全手册(SPNU540A)- 5.13  6-7软件写配置的回读中强烈建议使用此设置,所以我们希望能够成功执行。

    我们需要满足哪些条件才能将PCR->PSPWRDWNSET位设置为不依赖于总线状态?

     

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

     PCR->PSPWRDWNSET位 只能在特权模式下写入。 如果在用户模式下,您需要清除PCR->PPROTSET寄存器中的相应位。

    如果应用程序中未使用这些模块,则可以在启动过程中使其处于非活动状态。 您可以修改 periphInit(void)的代码:

    PcrREG3->PSPWRDWNCLR0 = 0xFFFFU;
    PcrREG3->PSPWRDWNCLR1 = 0xFFFFFFF00U;
    PcrREG3->PSPWRDWNCLR2 = 0xFFFFU;
    PcrREG3->PSPWRDWNCLR3 = 0xFFFFU;
     

    默认值为非活动。

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

    在使用PCR时,我们处于特权模式,在决定在我们的应用中进一步使用DCAN之前,我们使用DCAN模块执行安全手册(SPNU540A:CAN15)中建议的ECC自检。

    我们所做的是在没有交通问题的情况下工作。 我们仍然没有找到答案的是,是什么阻止我们使用  总线上的TRAFIC设置PCR->PSPWRDWNSET位。

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

    如TRM中所述:

    27.11 1进入全局断电模式
    通过在 PCR模块中设置适当的外设断电设置位(PSPWRDWNSETx),请求DCAN的全局断电模式。
    然后,DCAN完成消息对象的所有传输请求。 完成所有请求后,DCAN会等待,直到识别出总线空闲状态。 然后,它将自动设置初始位,以指示已进入全局断电模式。

    当总线空闲时,模块将自动断电。 两个CAN帧之间的CAN总线变为空闲状态。

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

    别误会,我几乎可以复述这一章。 如果我要看这一章,我们的问题是:

     PCR模块中设置适当的外设断电设置位(PSPWRDWNSETx)。

    由于TI安全手册(SPNU540A)- 5.13 6-7软件强烈推荐,请读回书面配置。  我们无法检查位是否已设置。

    即使等待超过100毫秒-经过许多帧后很长一段时间,如果不重复设置,该位也不会被设置。

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

    我知道你引用了这一章。 我刚刚在LC43x HDK上进行了测试, 并设置了DCAN2的PSP断电位。 这是我的测试代码。

    1. DCAN1和DCAN2已连接:2个节点可以联网

    2. DCAN1使用邮箱1传输数据,消息ID为0x1

    3. DCAN2使用mailbox1接收数据,消息ID为18 (不同于DCAN1的消息ID)

    4. RTI compare0每500毫秒中断一次。 在RTI ISR中,为DCAN2模块设置断电位: pcrREG3->PSPWRDWNSET1 |= 0x0.0004万U;

      并读回此寄存器的值  

    5.运行代码并确保示波器上的波形正确,DCAN1将继续重新传输此消息(ID=1)

    6.在ASM(" nop")处添加断点;此时代码执行将暂停,请检查回读值

    e2e.ti.com/.../6254.HL_5F00_sys_5F00_main.c e2e.ti.com/.../8780.TMS570LC43x_5F00_rtIBlinky.hcge2e.ti.com/.../3058.TMS570LC43x_5F00_rtIBlinky.dil</s>3058.

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

    感谢您排除故障并设置测试。 让我的测试更接近您的测试,结果更具体。

    总线上的通信似乎正在清除pcrREG3->PSPWRDWNSET1位,回读值问题是在设置期间发生的结果。

    我的测试步骤现在如下所示:

    1. DCAN1和DCAN2已物理连接
    2. 验证DCAN2是否已关闭电源(已设置pcrREG3->PSPWRDWNSET1 & 0x04)。
      重复执行时记录:
    3. 在100 % 负载下从DCAN1 -> CAN总线开始传输,由ACK OFF强制执行,并由CAN探测器确认:

    4. 即使DCAN2未通电,也未设置PcrREG3->PSPWRDWNSET1 & 0x04。 如果设置失败,则回读大约每4次1次。
      重复执行时记录:

    5. 断开连接DCAN1和DCAN2的电缆并重复步骤4后,该位保持设置
      重复执行时记录:

    C

    switch(test->step)
    {
      case 2u:
      {
        print("pcrREG3->PSPWRDWNSET1 & 0x04: %d", pcrREG3->PSPWRDWNSET1 & 0x04);
        break;
      }
      case 3u:
        saej1939_apiInitIfaceName(J1939_IFACE_DCAN1, J1939_BITRATE_250, CAN1_NODE, can1IfaceName);
        break;
      case 4u:
      {
        print("pcrREG3->PSPWRDWNSET1 & 0x04: %d", pcrREG3->PSPWRDWNSET1 & 0x04);
        print("setting PSPWRDWNSET1");
        pcrREG3->PSPWRDWNSET1 = 0x00000004U; // writing zeros has no effect
    print("pcrREG3->PSPWRDWNSET1 & 0x04: %d", pcrREG3->PSPWRDWNSET1 & 0x04); break; } }

     测试中进行设置之前,请尝试阅读“pcrREG3->PSPWRDWNSET1 & 0x04”吗?

    设置PSPWRDWNSET1时,是否可以验证总线是否在100 % 负载下也许在您的示例中删除第118-119行。

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

    有新消息吗? 它尚未解决。

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

    如果CAN总线处于活动状态(节点正在传输或刚刚完成传输),则不会执行断电请求,也不会设置CAN控制寄存器的初始位。