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**** 1996415 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。 这是执行复位状态检查的代码片段:

Fullscreen
1
status = SL_SelfTest_LIN(LIN_ANALOG_LOOPBACK_TEST, SL_LIN1);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
/*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;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

谢谢、此致、

Ilija

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

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

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

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

     

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

    尊敬的  Ilija:

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

    根据我的理解、此条件检查是否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。