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.

[参考译文] CCS/TMS570LC4357:安全库 HALCOGEN 示例不启动 CAN 控制器的自检

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605395/ccs-tms570lc4357-safety-library-halcogen-example-do-not-start-selftest-of-can-controller

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:Code Composer Studio

大家好、我对 halcogen 的 sfety lib 示例有一些问题。

我按照说明进行了操作、得到了正确的构建。 在我将其加载到 MCU 后、我的程序 开始。 但是、在程序 尝试启动第一个 CAN 控制 器的自检后、它从函数调用中获得一个负响应、并在以下 while (1)指令中结束。   

        if (sl_SelfTest_CAN (CAN_ECC_TEST_MODE_1BIT、SL_DCAN1)= false)
        {
         while (1);   //此处的 progam 结束

我看了一下功能、然后图示了、问题是什么。 该函数在 sl_selftest.c 中定义 程序会检查 CANREG1->CTL 寄存器中的 INIT 位是否被置位。 如果是、则该函数返回 false。 在我的情况下、该位被置位、因此我在上面的 while (1)指令中结束。

 if ((布尔值) sl_canREG)
   {
       /*SAFETYMCUSW 134 S MR:12.2 备注_5*/
    if (((uint32) CAN_init_bit =(sl_canREG->CTL 和 CAN_init_bit)){
           SL_Log_Error (FUNC_ID_ST_CAN、ERR_TYPEE_INTURE_CON、3U);
           RetVal = false;
           返回 RetVal;
       }

问题是、该位在 MCU 重新启动后始终置位。 之前没有将该位复位的指令。 之前有一个函数、用于初始化 CAN_RAM。

SL_Init_Memory (RAMTYPE_DMA_RAM    |
         RAMTYPE_NHET1      |
         RAMTYPE_HET_TU1|     
         RAMTYPE_NHET2      |
         RAMTYPE_HET_TU2    |
         RAMTYPE_DCAN1_RAM  |
         RAMTYPE_DCAN2_RAM  |
         RAMTYPE_DCAN3_RAM  |
         RAMTYPE_DCAN4_RAM  |
                 RAMTYPE_MIBSPI1_RAM |
                 RAMTYPE_MIBSPI2_RAM |
                 RAMTYPE_MIBSPI3_RAM |
                 RAMTYPE_MIBSPI4_RAM |
                 RAMTYPE_MIBSPI5_RAM |
                 RAMTYPE_MIBADC1_RAM |
                 RAMTYPE_MIBADC2_RAM );

但是这个函数不会清除 CAN 模块的控制寄存器。 因此、我添加了4条额外的线路、在开始自检之前、我手动复位所有 CAN-regs 的位。

 canREG1->CTL =(0 << 0);
 canREG2->CTL =(0 << 0);
 canREG3->CTL =(0 << 0);
 canREF4->CTL =(0 << 0);

添加此项后、我的程序将运行而不会出现任何问题。 我不知道、这是不是正确的方式。 可以有人确认一下吗?

在我看来,对这一点的检验有一个特殊的原因,我不知道,我对这一程序进行了管理,这是不好的。 因此、可能是 STH。 我的设置有问题吗? 或者、当我启动自检功能时、为什么该位始终置位?

非常感谢您的参与。

  

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

    您认为 INIT 位应该在任何类型的自检之前清零。 我检查了 main()函数,在调用 sl_SelfTest_CAN (..)之前调用了 canInit(),因此应清除 init 位。 请仔细检查 canInit()是否被调用。

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

    我使用 HALCOGEN 安全库示例中的 sys_startup 文件、因此在 main 之前的 sys_startup 中调用自检函数。 当然,我在 main 中调用 canInit(),但这对于 sys_startup 中的自检来说太晚了。 在 sys_startup 中不调用 init 函数、这就是我使用上述变通办法的原因。 我还可以在 sys_startup 中使用 canInit()指令,这也会运行(感谢提示),但前提是我为所有 CAN 启用 ECC-RAM (1-4)。 默认情况下、在 HALCOGEN 中将其禁用。

    奇怪的是、这样一个基本示例不起作用。 我遵循了 HALCOGEN 示例中的指令、但如您所见、如果没有添加内容、它将无法正常工作。 在我看来,HALCOGEN 示例中的文档或文件不完整,或者我不够聪明,不能处理它;)或者这可能是不同软件版本的问题。 我使用 HALCOGEN 4.06.01和 CCS 6.2。

    我在 HALCOGEN 的这个安全库示例中发现的另一个问题是、当我将一个新的程序代码闪存到 MCU 时、我有时会得到一个 nERROR 标志。 调试器似乎会导致 CCM 故障、同时启动与 MCU 的连接。 将程序加载到 MCU 后、不会重置 nERROR 标志。 如果我信任 TRM、则仅在 PORRST 之后重新发送此标志。 我想、调试器不会进行 PORRST、只进行调试复位、这就是为什么标志仍然处于活动状态的原因、对吧? 它有点类似于勘误器件#56、但我激活了除勘误表中所述之外的其他 ESM 通道。
    在本例中、我的自检函数(例如 sl_select_PBIST (...)) 也请勿启动、因为它们会检查 nERROR 标志。
    因此、我使用了另一种权变措施、并在 PORRST、DEBUG 和外部复位之后每次清除 ESM:

    sl_set_nError();
    sl_clear_nError();
    while (sl_ESM_nError_Active ()=true);

    然后重新布置 Flag、程序运行良好。 这种情况是否正常、或者我应该小心地重置 ESM?

    我想知道,为什么其他人也没有同样的问题。

    提前感谢。

    此致
    Marcus