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.

[参考译文] RM44L920:验证 LIN 是否未处于复位状态时、LIN_ANALOOPEN_TEST 失败

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1449616/rm44l920-lin_analog_loopback_test-fail-at-verifying-if-lin-is-not-in-reset-state

器件型号:RM44L920

工具与软件:

您好!

我正在尝试使用 SafeTI 诊断库对 LIN 模块执行模拟环回测试。 当我SL_SelfTest_LIN()为此目的调用此函数时、在验证 LIN 模块是否脱离复位状态的步骤会失败。 返回值retVal设置为FALSE。 这是执行复位状态检查的代码片段:

status = SL_SelfTest_LIN(LIN_ANALOG_LOOPBACK_TEST, SL_LIN1);

/*verify LIN is not in reset state */
    /*SAFETYMCUSW 439 S MR:11.3 <APPROVED> Comment_4*/
    if(sl_linREG != NULL)
    {
        /*SAFETYMCUSW 134 S MR: 12.2 <APPROVED> Comment_5*/
        if((LIN_GCR0_RESET_BIT|LIN_GCR1_SWRST_BIT) != (sl_linREG->GCR0 & (LIN_GCR0_RESET_BIT|LIN_GCR1_SWRST_BIT)))
        {
#if (FUNC_ENTRY_COND_CHECK_LOG_ENABLED !=0)
            SL_Log_Error(FUNC_ID_ST_LIN, ERR_TYPE_ENTRY_CON, 1u);
#endif
            retVal =  FALSE;
            return retVal;
        }

正如我所理解的、此条件检查是否sl_linREG->GCR0有值0x81。 然而、GCR0寄存器不能具有这个值、这使我想知道这是 SafeTI 诊断库中的错误。

这里是 LIN 模块的初始化函数

void sciInit(UartInit_t* Uart_init_struct)
{
/* USER CODE BEGIN (2) */
/* USER CODE END */


    /** @b initialize @b SCILIN */

    /** - bring SCI out of reset */
    scilinREG->GCR0 = 0U;
    scilinREG->GCR0 = 1U;

    /** - Disable all interrupts */
    scilinREG->CLEARINT    = 0xFFFFFFFFU;
    scilinREG->CLEARINTLVL = 0xFFFFFFFFU;

    /** - global control 1 */
    scilinREG->GCR1 = (uint32)((uint32)1U << 25U)  /* enable transmit */
                    | (uint32)((uint32)1U << 24U)  /* enable receive */
                    | (uint32)((uint32)1U << 5U)   /* internal clock (device has no clock pin) */
                    | (uint32)((uint32)(Uart_init_struct->stop_bits-1U) << 4U)  /* number of stop bits */
                    | (uint32)((uint32)Uart_init_struct->parity_even << 3U)  /* even parity, otherwise odd */
                    | (uint32)((uint32)Uart_init_struct->parity_enable << 2U)  /* enable parity */
                    | (uint32)((uint32)1U << 1U);  /* asynchronous timing mode */
                    
    /** - set baudrate */
    sciSetBaudrate(scilinREG,(uint32) Uart_init_struct->baud_rate );

    /** - transmission length */
    scilinREG->FORMAT = 8U - 1U;  /* length */

    /** - set SCI pins functional mode */
    scilinREG->PIO0 = (uint32)((uint32)1U << 2U)  /* tx pin */
                    | (uint32)((uint32)1U << 1U); /* rx pin */


    /** - set SCI pins default output value */
    scilinREG->PIO3 = (uint32)((uint32)0U << 2U)  /* tx pin */
                    | (uint32)((uint32)0U << 1U); /* rx pin */


    /** - set SCI pins output direction */
    scilinREG->PIO1 = (uint32)((uint32)0U << 2U)  /* tx pin */
                    | (uint32)((uint32)0U << 1U); /* rx pin */


    /** - set SCI pins open drain enable */
    scilinREG->PIO6 = (uint32)((uint32)0U << 2U)  /* tx pin */
                    | (uint32)((uint32)0U << 1U); /* rx pin */


    /** - set SCI pins pullup/pulldown enable */
    scilinREG->PIO7 = (uint32)((uint32)0U << 2U)  /* tx pin */
                    | (uint32)((uint32)0U << 1U); /* rx pin */


    /** - set SCI pins pullup/pulldown select */
    scilinREG->PIO8 = (uint32)((uint32)1U << 2U)  /* tx pin */
                    | (uint32)((uint32)1U << 1U); /* rx pin */


    /** - set interrupt level */
    scilinREG->SETINTLVL = (uint32)((uint32)0U << 26U)  /* Framing error */
                         | (uint32)((uint32)0U << 25U)  /* Overrun error */
                         | (uint32)((uint32)0U << 24U)  /* Parity error */
                         | (uint32)((uint32)0U << 9U)  /* Receive */
                         | (uint32)((uint32)0U << 8U)  /* Transmit */
                         | (uint32)((uint32)0U << 1U)  /* Wakeup */
                         | (uint32)((uint32)0U);  /* Break detect */

    /** - set interrupt enable */
    scilinREG->SETINT = (uint32)((uint32)0U << 26U)  /* Framing error */
                      | (uint32)((uint32)0U << 25U)  /* Overrun error */
                      | (uint32)((uint32)0U << 24U)  /* Parity error */
                      | (uint32)((uint32)1U << 9U)  /* Receive */
                      | (uint32)((uint32)0U << 1U)  /* Wakeup */
                      | (uint32)((uint32)0U);  /* Break detect */

    /** - initialize global transfer variables */
    g_sciTransfer_t[1U].mode   = (uint32)1U << 8U;
    g_sciTransfer_t[1U].tx_length = 0U;
	g_sciTransfer_t[1U].rx_length = 0U;

    /** - Finaly start SCILIN */
    scilinREG->GCR1 |= 0x80U;

/* USER CODE BEGIN (3) */
/* USER CODE END */
}

GCR0 寄存器设置为1、这意味着该模块已结束复位 GCR1 设置为0x80。

这是库中的软件错误吗、还是我这边存在配置问题?

谢谢、此致、

Ilija

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

    SL_SelfTest_LIN()在进行一些彻底的调试后、我能够确定导致函数失败的问题。

    问题是我应该使用 sl_SelfTest_SCI ()函数、但此函数导致错误、因为它检查的是 SCI 寄存器(基址为 FFF7 E500h)、而且由于我配置了 SCI/LIN 模块的寄存器(基址为 FFF7 E400h)、对 SCI 模块复位状态的检查自然失败、函数返回FALSE

    此外、我发现 SDL 没有提供特定的功能来为组合的 SCI/LIN 模块执行模拟环回测试。 如果需要此类功能、可能需要通过配置环回模式的相关寄存器并验证结果来手动实现。

     

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

    尊敬的  Ilija:

    我对迟交的答复表示歉意。

    Unknown 说:
    根据我的理解、此条件检查是否sl_linREG->GCR0有值0x81。 但是、GCR0寄存器不能具有该值、这使我想知道这是否是 SafeTI 诊断库中的错误。[/报价]
    GCR0 寄存器设置为1、这意味着该模块已结束复位 GCR1 设置为0x80。[/报价]

    您完全正确、他们不应检查 GCR0中  sl_SelfTest_LIN 函数的0x81。

    他们应该检查 GCR0中的0x01、如果这个位为 1表示 LIN 退出复位。  

    同样、他们应该检查 GCR1中的0x80、如果该位为1表示 LIN 处于就绪状态。

    在这里、对于 LIN 模块、它们仅在 GCR0上错误地检查0x81。 我将记下此问题、我们将在以后的修订版中更正此问题。

    问题在于、我本该使用了 sl_SelfTest_SCI ()函数、但此函数导致了错误、原因是检查了 SCI 寄存器(基地址为 FFF7 E500h)、而且配置了 SCI/LIN 模块的寄存器(基地址为 FFF7 E400h)、检查 SCI 模块的复位状态将自然失败。 函数返回FALSE.
    [/quote]
    此外、我发现 SDL 不提供对组合 SCI/LIN 模块执行模拟环回测试的特定函数。 如果需要此类功能、则可能需要通过为环回模式配置相关寄存器并验证结果来手动实现。[/QUOT]

    您完全正确。

    该控制器中有两个 SCI 实例。

    一个是从基址0xFFFFE500开始的独立 SCI

    另一个在基地址0xFFFFE400上与 LIN 模块复用

    您的回答完全正确、该多路复用 SCI 没有可用的 SCI 自检功能、只有对独立 SCI 进行测试。

    当前、您只需在此 SCI 自检功能中手动再添加一个案例来测试多路复用 SCI。

    您可以使用下面突出显示的宏来实现此目的。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    感谢您的答复。 我实现了一个用于 SCI/LIN 模拟环回测试的自定义功能、确保它检查相应的寄存器。 执行工作似乎符合预期。

    但是、我不确定修改 SDL 功能是否是一个好做法。 您能否确认进行此类更改是否可取?

    此外、我有一个关于 SDL 库中 SCI 环回函数的问题。 我注意到、在功能结束时、GCR1寄存器的第16位(环回使能位)未被清除以禁用环回模式。 这是否有具体的原因、或者是否应在函数中显式处理?

    谢谢、此致、

    Ilija

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

    尊敬的  Ilija:

    然而、我不确定修改 SDL 函数是否是一个好做法。 您能否确认进行此类更改是否可取?

    可以修改项目中包含的 SDL 代码。 有些客户只会使用 SDL 的一部分、有些需要测试、因此可以为您的项目定制 SDL。

    此外、我有关于 SDL 库中 SCI 环回函数的问题。 我注意到、在功能结束时、GCR1寄存器的第16位(环回使能位)未被清除以禁用环回模式。 这是否有具体原因、或者是否应在函数中明确处理?

    实际上、  执行回送测试后、应在 sl_SelfTest_SCI 自身中禁用回送。

    以前有一位客户还报告了此问题:

    (+) SafeTI 诊断库 HAL 层与 HalCoGen 生成的代码不同-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    我会注意到这个问题、并对下一个版本采取行动。 因此可以手动添加环回禁用代码。

    ——
    谢谢、此致、
    Jagadish。