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.
工具与软件:
您好!
我正在尝试使用 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:
我对迟交的答复表示歉意。
根据我的理解、此条件检查是否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。 我将记下此问题、我们将在以后的修订版中更正此问题。
[/quote]问题在于、我本该使用了 sl_SelfTest_SCI ()函数、但此函数导致了错误、原因是检查了 SCI 寄存器(基地址为 FFF7 E500h)、而且配置了 SCI/LIN 模块的寄存器(基地址为 FFF7 E400h)、检查 SCI 模块的复位状态将自然失败。 函数返回FALSE
.[/quote][/quote]此外、我发现 SDL 不提供对组合 SCI/LIN 模块执行模拟环回测试的特定函数。 如果需要此类功能、则可能需要通过为环回模式配置相关寄存器并验证结果来手动实现。[/QUOT]您完全正确。
该控制器中有两个 SCI 实例。
一个是从基址0xFFFFE500开始的独立 SCI
另一个在基地址0xFFFFE400上与 LIN 模块复用
您的回答完全正确、该多路复用 SCI 没有可用的 SCI 自检功能、只有对独立 SCI 进行测试。
当前、您只需在此 SCI 自检功能中手动再添加一个案例来测试多路复用 SCI。
您可以使用下面突出显示的宏来实现此目的。
——
谢谢、此致、
Jagadish。
尊敬的 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。