你好,我最近遇到一个关于sk148 EnterFreezeMode等不到FRZACK,执行softreset之后,MCR寄存器异常的问题。代码如下:
你们帖子回复是有字节限制嘛?我回复了复现步骤,版本代码各种信息,发了七八遍,一发出来就被自动删除
你们这个网站一直自动删我的回复帖子,我真的服了,发不出来
Hi@MrYin
麻烦你告知我你所使用的SDK的版本,并且提供复现问题的步骤以及工程,我首先要复现你的问题我才能提供建议。
trace_log_done.txt:
EnterFMode_in counts[00]: MCR:0x5980000F, steps:1. EnterFMode_in
EBUG_POINT2 counts[00]: MCR:0x5980000F, steps:2. DEBUG_POINT2
EBUG_POINT3 counts[00]: MCR:0x5980000F, steps:3. DEBUG_POINT3
EBUG_POINT4 counts[00]: MCR:0x5980000F, steps:4. DEBUG_POINT4
nterFMode_out counts[00]: MCR:0x5980000F, steps:5. EnterFMode_out
nterFMode_in counts[01]: MCR:0x0080000F, steps:6. EnterFMode_in
EBUG_POINT2 counts[01]: MCR:0x5080000F, steps:7. DEBUG_POINT2
EBUG_POINT3 counts[01]: MCR:0x5080000F, steps:8. DEBUG_POINT3
EBUG_POINT4 counts[01]: MCR:0x5980000F, steps:9. DEBUG_POINT4
EnterFMode_out counts[01]: MCR:0x5980000F, steps:10. EnterFMode_out
EnterFMode_in counts[02]: MCR:0x2002101F, steps:11. EnterFMode_in
DEBUG_POINT2 counts[02]: MCR:0x7002101F, steps:12. DEBUG_POINT2
DEBUG_POINT3 counts[02]: MCR:0x7002101F, steps:13. DEBUG_POINT3
DEBUG_POINT4 counts[02]: MCR:0x7902101F, steps:14. DEBUG_POINT4
EnterFMode_out counts[02]: MCR:0x7902101F, steps:15. EnterFMode_out
EnterFMode_in counts[03]: MCR:0x2022101F, steps:16. EnterFMode_in
DEBUG_POINT2 counts[03]: MCR:0x2022101F, steps:17. DEBUG_POINT2
DEBUG_POINT3 counts[03]: MCR:0x2022101F, steps:18. DEBUG_POINT3
DEBUG_POINT4 counts[03]: MCR:0x2022101F, steps:19. DEBUG_POINT4
EnterFMode_out counts[03]: MCR:0x2022101F, steps:20. EnterFMode_out
EnterFMode_in counts[04]: MCR:0x2022101F, steps:21. EnterFMode_in
DEBUG_POINT2 counts[04]: MCR:0x2022101F, steps:22. DEBUG_POINT2
DEBUG_POINT3 counts[04]: MCR:0x2022101F, steps:23. DEBUG_POINT3
DEBUG_POINT4 counts[04]: MCR:0x2022101F, steps:24. DEBUG_POINT4
EnterFMode_out counts[04]: MCR:0x2022101F, steps:25. EnterFMode_out
EnterFMode_in counts[05]: MCR:0x2022101F, steps:26. EnterFMode_in
DEBUG_POINT2 counts[05]: MCR:0x7022101F, steps:27. DEBUG_POINT2
DEBUG_POINT3 counts[05]: MCR:0x7022101F, steps:28. DEBUG_POINT3
DEBUG_POINT4 counts[05]: MCR:0x7922101F, steps:29. DEBUG_POINT4
EnterFMode_out counts[05]: MCR:0x7922101F, steps:30. EnterFMode_out
EnterFMode_in counts[06]: MCR:0x2022101F, steps:31. EnterFMode_in
DEBUG_POINT2 counts[06]: MCR:0x2022101F, steps:32. DEBUG_POINT2
DEBUG_POINT3 counts[06]: MCR:0x2022101F, steps:33. DEBUG_POINT3
DEBUG_POINT4 counts[06]: MCR:0x2022101F, steps:34. DEBUG_POINT4
EnterFMode_out counts[06]: MCR:0x2022101F, steps:35. EnterFMode_out
EnterFMode_in counts[07]: MCR:0x2022101F, steps:36. EnterFMode_in
DEBUG_POINT2 counts[07]: MCR:0x7022101F, steps:37. DEBUG_POINT2
DEBUG_POINT3 counts[07]: MCR:0x7022101F, steps:38. DEBUG_POINT3
DEBUG_POINT4 counts[07]: MCR:0x7922101F, steps:39. DEBUG_POINT4
EnterFMode_out counts[07]: MCR:0x7922101F, steps:40. EnterFMode_out
EnterFMode_in counts[08]: MCR:0x2022101F, steps:41. EnterFMode_in
DEBUG_POINT2 counts[08]: MCR:0x7022101F, steps:42. DEBUG_POINT2
DEBUG_POINT3 counts[08]: MCR:0x7022101F, steps:43. DEBUG_POINT3
DEBUG_POINT4 counts[08]: MCR:0x7922101F, steps:44. DEBUG_POINT4
EnterFMode_out counts[08]: MCR:0x7922101F, steps:45. EnterFMode_out
EnterFMode_in counts[09]: MCR:0x2022101F, steps:46. EnterFMode_in
DEBUG_POINT2 counts[09]: MCR:0x2022101F, steps:47. DEBUG_POINT2
DEBUG_POINT3 counts[09]: MCR:0x2022101F, steps:48. DEBUG_POINT3
DEBUG_POINT4 counts[09]: MCR:0x2022101F, steps:49. DEBUG_POINT4
EnterFMode_out counts[09]: MCR:0x2022101F, steps:50. EnterFMode_out
EnterFMode_in counts[10]: MCR:0x2022101F, steps:51. EnterFMode_in
DEBUG_POINT2 counts[10]: MCR:0x2022101F, steps:52. DEBUG_POINT2
DEBUG_POINT3 counts[10]: MCR:0x2022101F, steps:53. DEBUG_POINT3
DEBUG_POINT4 counts[10]: MCR:0x2022101F, steps:54. DEBUG_POINT4
EnterFMode_out counts[10]: MCR:0x2022101F, steps:55. EnterFMode_out
EnterFMode_in counts[11]: MCR:0x2022101F, steps:56. EnterFMode_in
DEBUG_POINT2 counts[11]: MCR:0x7022101F, steps:57. DEBUG_POINT2
DEBUG_POINT3 counts[11]: MCR:0x7022101F, steps:58. DEBUG_POINT3
DEBUG_POINT4 counts[11]: MCR:0x7922101F, steps:59. DEBUG_POINT4
EnterFMode_out counts[11]: MCR:0x7922101F, steps:60. EnterFMode_out
EnterFMode_in counts[12]: MCR:0x2022101F, steps:61. EnterFMode_in
DEBUG_POINT2 counts[12]: MCR:0x2022101F, steps:62. DEBUG_POINT2
DEBUG_POINT3 counts[12]: MCR:0x2022101F, steps:63. DEBUG_POINT3
DEBUG_POINT4 counts[12]: MCR:0x2022101F, steps:64. DEBUG_POINT4
EnterFMode_out counts[12]: MCR:0x2022101F, steps:65. EnterFMode_out
EnterFMode_in counts[13]: MCR:0x2022101F, steps:66. EnterFMode_in
DEBUG_POINT2 counts[13]: MCR:0x7022101F, steps:67. DEBUG_POINT2
DEBUG_POINT3 counts[13]: MCR:0x7022101F, steps:68. DEBUG_POINT3
DEBUG_POINT4 counts[13]: MCR:0x7022101F, steps:69. DEBUG_POINT4
DEBUG_POINT5 counts[00]: MCR:0x7022101F, steps:70. DEBUG_POINT5
DEBUG_POINT6 counts[00]: MCR:0x5280000F, steps:71. DEBUG_POINT6
DEBUG_POINT7 counts[00]: MCR:0x5980000F, steps:72. DEBUG_POINT7
EnterFMode_out counts[13]: MCR:0x5980000F, steps:73. EnterFMode_out
EnterFMode_in counts[14]: MCR:0x0080000F, steps:74. EnterFMode_in
DEBUG_POINT2 counts[14]: MCR:0x5080000F, steps:75. DEBUG_POINT2
DEBUG_POINT3 counts[14]: MCR:0x5080000F, steps:76. DEBUG_POINT3
DEBUG_POINT4 counts[14]: MCR:0x5980000F, steps:77. DEBUG_POINT4
EnterFMode_out counts[14]: MCR:0x5980000F, steps:78. EnterFMode_out
EnterFMode_in counts[15]: MCR:0x0000000F, steps:79. EnterFMode_in
DEBUG_POINT2 counts[15]: MCR:0x0000000F, steps:80. DEBUG_POINT2
DEBUG_POINT3 counts[15]: MCR:0x0000000F, steps:81. DEBUG_POINT3
DEBUG_POINT4 counts[15]: MCR:0x0000000F, steps:82. DEBUG_POINT4
EnterFMode_out counts[15]: MCR:0x0000000F, steps:83. EnterFMode_out
DEBUG_POINT11 counts[00]: MCR:0x0000000F, steps:84. DEBUG_POINT11
DEBUG_POINT12 counts[00]: MCR:0x0000000F, steps:85. DEBUG_POINT12
EnterFMode_in counts[16]: MCR:0x0000000F, steps:86. EnterFMode_in
DEBUG_POINT2 counts[16]: MCR:0x5000000F, steps:87. DEBUG_POINT2
DEBUG_POINT3 counts[16]: MCR:0x5000000F, steps:88. DEBUG_POINT3
DEBUG_POINT4 counts[16]: MCR:0x5900000F, steps:89. DEBUG_POINT4
EnterFMode_out counts[16]: MCR:0x5900000F, steps:90. EnterFMode_out
EnterFMode_in counts[17]: MCR:0x0000000F, steps:91. EnterFMode_in
DEBUG_POINT2 counts[17]: MCR:0x5000000F, steps:92. DEBUG_POINT2
DEBUG_POINT3 counts[17]: MCR:0x5000000F, steps:93. DEBUG_POINT3
DEBUG_POINT4 counts[17]: MCR:0x5900000F, steps:94. DEBUG_POINT4
EnterFMode_out counts[17]: MCR:0x5900000F, steps:95. EnterFMode_out
EnterFMode_in counts[18]: MCR:0x0000000F, steps:96. EnterFMode_in
DEBUG_POINT2 counts[18]: MCR:0x5000000F, steps:97. DEBUG_POINT2
DEBUG_POINT3 counts[18]: MCR:0x5000000F, steps:98. DEBUG_POINT3
DEBUG_POINT4 counts[18]: MCR:0x5900000F, steps:99. DEBUG_POINT4
EnterFMode_out counts[18]: MCR:0x5900000F, steps:100. EnterFMode_out
/*FUNCTION**********************************************************************
*
* Function Name : FLEXCAN_EnterFreezeMode
* Description : Enter the freeze mode.
*
*END**************************************************************************/
void FLEXCAN_EnterFreezeMode(CAN_Type * base)
{
bool enabled = false;
DEBUG_TRACE_POINT(1);
base->MCR = (base->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U);
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
DEBUG_TRACE_POINT(2);
if (((base->MCR & CAN_MCR_MDIS_MASK) >> CAN_MCR_MDIS_SHIFT) == 0U)
{
enabled = true;
DEBUG_TRACE_POINT(3);
}
else
{
base->MCR &= ~CAN_MCR_MDIS_MASK;
}
#ifdef ERRATA_E9595
/* Check Low-Power Mode Acknowledge Cleared */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 1U) {}
/* Check if is a Bus-Off Error corresponding to 1x */
if ((((base->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT) & 2U) != 0U)
{
/* Save registers before Soft Reset */
!!!!!!!!!!
uint32_t tempIMSK[2],tempMCR;
tempIMSK[0] = base->IMASK1;
tempIMSK[1] = base->IMASK2;
tempMCR = base->MCR;
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) == 0U) {}
/* Restore registers after Soft Reset */
base->IMASK1 = tempIMSK[0];
base->IMASK2 = tempIMSK[1];
base->MCR = tempMCR;
}
else
{
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
}
#endif
base->TIMER = 0U;
uint32_t aux = 0U;
#if FEATURE_CAN_HAS_FD
/* MCR[FDEN] was reset to 0, wait for timeout */
if (!FLEXCAN_IsFDEnabled(base))
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
else
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 730U))
{
/* Wait until finish counting 730 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
#else
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
#error
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
#endif /* FEATURE_CAN_HAS_FD */
DEBUG_TRACE_POINT(4);
if (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U)
{
DEBUG_TRACE_POINT(5);
/* Save registers before Soft Reset */
volatile uint32_t tempIMSK1, tempMCR;
/* Save IMASK1 value */
tempIMSK1 = base->IMASK1;
/* Save MCR value */
tempMCR = base->MCR;
//memcpy(&tempBase,base,sizeof(tempBase));
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
DEBUG_TRACE_POINT(6);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
/* Restore IMASK1 value */
base->IMASK1 = tempIMSK1;
/* Restore MCR value */
base->MCR = tempMCR;
DEBUG_TRACE_POINT(7);
}
if (false == enabled)
{
base->MCR |= CAN_MCR_MDIS_MASK;
DEBUG_TRACE_POINT(8);
/* Wait until disable mode acknowledged */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 0U) {}
DEBUG_TRACE_POINT(9);
}
DEBUG_TRACE_POINT(10);
}
以下是我对你们SDK代码的修改,实测在设置reset之后必须加几微秒的延时,才能解决这个问题。
if (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U)
{
/* Save registers before Soft Reset */
uint32_t tempIMSK1, tempMCR;
/* Save IMASK1 value */
tempIMSK1 = base->IMASK1;
/* Save MCR value */
tempMCR = base->MCR;
//memcpy(&tempBase,base,sizeof(tempBase));
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
/* Wait for 3 us to ensure that the reset is completed */
S32_WaitUs(3);
/* Restore IMASK1 value */
base->IMASK1 = tempIMSK1;
/* Restore MCR value */
base->MCR = tempMCR;
}以下是我对你们SDK代码的修改,实测在设置reset之后必须加几微秒的延时,才能解决这个问题。
if (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U)
{
/* Save registers before Soft Reset */
uint32_t tempIMSK1, tempMCR;
/* Save IMASK1 value */
tempIMSK1 = base->IMASK1;
/* Save MCR value */
tempMCR = base->MCR;
//memcpy(&tempBase,base,sizeof(tempBase));
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
/* Wait for 3 us to ensure that the reset is completed */
S32_WaitUs(3);
/* Restore IMASK1 value */
base->IMASK1 = tempIMSK1;
/* Restore MCR value */
base->MCR = tempMCR;
}trace_log_done.txt:
EnterFMode_in counts[00]: MCR:0x5980000F, steps:1. EnterFMode_in
EBUG_POINT2 counts[00]: MCR:0x5980000F, steps:2. DEBUG_POINT2
EBUG_POINT3 counts[00]: MCR:0x5980000F, steps:3. DEBUG_POINT3
EBUG_POINT4 counts[00]: MCR:0x5980000F, steps:4. DEBUG_POINT4
nterFMode_out counts[00]: MCR:0x5980000F, steps:5. EnterFMode_out
nterFMode_in counts[01]: MCR:0x0080000F, steps:6. EnterFMode_in
EBUG_POINT2 counts[01]: MCR:0x5080000F, steps:7. DEBUG_POINT2
EBUG_POINT3 counts[01]: MCR:0x5080000F, steps:8. DEBUG_POINT3
EBUG_POINT4 counts[01]: MCR:0x5980000F, steps:9. DEBUG_POINT4
EnterFMode_out counts[01]: MCR:0x5980000F, steps:10. EnterFMode_out
EnterFMode_in counts[02]: MCR:0x2002101F, steps:11. EnterFMode_in
DEBUG_POINT2 counts[02]: MCR:0x7002101F, steps:12. DEBUG_POINT2
DEBUG_POINT3 counts[02]: MCR:0x7002101F, steps:13. DEBUG_POINT3
DEBUG_POINT4 counts[02]: MCR:0x7902101F, steps:14. DEBUG_POINT4
EnterFMode_out counts[02]: MCR:0x7902101F, steps:15. EnterFMode_out
EnterFMode_in counts[03]: MCR:0x2022101F, steps:16. EnterFMode_in
DEBUG_POINT2 counts[03]: MCR:0x2022101F, steps:17. DEBUG_POINT2
DEBUG_POINT3 counts[03]: MCR:0x2022101F, steps:18. DEBUG_POINT3
DEBUG_POINT4 counts[03]: MCR:0x2022101F, steps:19. DEBUG_POINT4
EnterFMode_out counts[03]: MCR:0x2022101F, steps:20. EnterFMode_out
EnterFMode_in counts[04]: MCR:0x2022101F, steps:21. EnterFMode_in
DEBUG_POINT2 counts[04]: MCR:0x2022101F, steps:22. DEBUG_POINT2
DEBUG_POINT3 counts[04]: MCR:0x2022101F, steps:23. DEBUG_POINT3
DEBUG_POINT4 counts[04]: MCR:0x2022101F, steps:24. DEBUG_POINT4
EnterFMode_out counts[04]: MCR:0x2022101F, steps:25. EnterFMode_out
EnterFMode_in counts[05]: MCR:0x2022101F, steps:26. EnterFMode_in
DEBUG_POINT2 counts[05]: MCR:0x7022101F, steps:27. DEBUG_POINT2
DEBUG_POINT3 counts[05]: MCR:0x7022101F, steps:28. DEBUG_POINT3
DEBUG_POINT4 counts[05]: MCR:0x7922101F, steps:29. DEBUG_POINT4
EnterFMode_out counts[05]: MCR:0x7922101F, steps:30. EnterFMode_out
EnterFMode_in counts[06]: MCR:0x2022101F, steps:31. EnterFMode_in
DEBUG_POINT2 counts[06]: MCR:0x2022101F, steps:32. DEBUG_POINT2
DEBUG_POINT3 counts[06]: MCR:0x2022101F, steps:33. DEBUG_POINT3
DEBUG_POINT4 counts[06]: MCR:0x2022101F, steps:34. DEBUG_POINT4
EnterFMode_out counts[06]: MCR:0x2022101F, steps:35. EnterFMode_out
EnterFMode_in counts[07]: MCR:0x2022101F, steps:36. EnterFMode_in
DEBUG_POINT2 counts[07]: MCR:0x7022101F, steps:37. DEBUG_POINT2
DEBUG_POINT3 counts[07]: MCR:0x7022101F, steps:38. DEBUG_POINT3
DEBUG_POINT4 counts[07]: MCR:0x7922101F, steps:39. DEBUG_POINT4
EnterFMode_out counts[07]: MCR:0x7922101F, steps:40. EnterFMode_out
EnterFMode_in counts[08]: MCR:0x2022101F, steps:41. EnterFMode_in
DEBUG_POINT2 counts[08]: MCR:0x7022101F, steps:42. DEBUG_POINT2
DEBUG_POINT3 counts[08]: MCR:0x7022101F, steps:43. DEBUG_POINT3
DEBUG_POINT4 counts[08]: MCR:0x7922101F, steps:44. DEBUG_POINT4
EnterFMode_out counts[08]: MCR:0x7922101F, steps:45. EnterFMode_out
EnterFMode_in counts[09]: MCR:0x2022101F, steps:46. EnterFMode_in
DEBUG_POINT2 counts[09]: MCR:0x2022101F, steps:47. DEBUG_POINT2
DEBUG_POINT3 counts[09]: MCR:0x2022101F, steps:48. DEBUG_POINT3
DEBUG_POINT4 counts[09]: MCR:0x2022101F, steps:49. DEBUG_POINT4
EnterFMode_out counts[09]: MCR:0x2022101F, steps:50. EnterFMode_out
EnterFMode_in counts[10]: MCR:0x2022101F, steps:51. EnterFMode_in
DEBUG_POINT2 counts[10]: MCR:0x2022101F, steps:52. DEBUG_POINT2
DEBUG_POINT3 counts[10]: MCR:0x2022101F, steps:53. DEBUG_POINT3
DEBUG_POINT4 counts[10]: MCR:0x2022101F, steps:54. DEBUG_POINT4
EnterFMode_out counts[10]: MCR:0x2022101F, steps:55. EnterFMode_out
EnterFMode_in counts[11]: MCR:0x2022101F, steps:56. EnterFMode_in
DEBUG_POINT2 counts[11]: MCR:0x7022101F, steps:57. DEBUG_POINT2
DEBUG_POINT3 counts[11]: MCR:0x7022101F, steps:58. DEBUG_POINT3
DEBUG_POINT4 counts[11]: MCR:0x7922101F, steps:59. DEBUG_POINT4
EnterFMode_out counts[11]: MCR:0x7922101F, steps:60. EnterFMode_out
EnterFMode_in counts[12]: MCR:0x2022101F, steps:61. EnterFMode_in
DEBUG_POINT2 counts[12]: MCR:0x2022101F, steps:62. DEBUG_POINT2
DEBUG_POINT3 counts[12]: MCR:0x2022101F, steps:63. DEBUG_POINT3
DEBUG_POINT4 counts[12]: MCR:0x2022101F, steps:64. DEBUG_POINT4
EnterFMode_out counts[12]: MCR:0x2022101F, steps:65. EnterFMode_out
EnterFMode_in counts[13]: MCR:0x2022101F, steps:66. EnterFMode_in
DEBUG_POINT2 counts[13]: MCR:0x7022101F, steps:67. DEBUG_POINT2
DEBUG_POINT3 counts[13]: MCR:0x7022101F, steps:68. DEBUG_POINT3
DEBUG_POINT4 counts[13]: MCR:0x7022101F, steps:69. DEBUG_POINT4
DEBUG_POINT5 counts[00]: MCR:0x7022101F, steps:70. DEBUG_POINT5
DEBUG_POINT6 counts[00]: MCR:0x5280000F, steps:71. DEBUG_POINT6
DEBUG_POINT7 counts[00]: MCR:0x5980000F, steps:72. DEBUG_POINT7
EnterFMode_out counts[13]: MCR:0x5980000F, steps:73. EnterFMode_out
EnterFMode_in counts[14]: MCR:0x0080000F, steps:74. EnterFMode_in
DEBUG_POINT2 counts[14]: MCR:0x5080000F, steps:75. DEBUG_POINT2
DEBUG_POINT3 counts[14]: MCR:0x5080000F, steps:76. DEBUG_POINT3
DEBUG_POINT4 counts[14]: MCR:0x5980000F, steps:77. DEBUG_POINT4
EnterFMode_out counts[14]: MCR:0x5980000F, steps:78. EnterFMode_out
EnterFMode_in counts[15]: MCR:0x0000000F, steps:79. EnterFMode_in
DEBUG_POINT2 counts[15]: MCR:0x0000000F, steps:80. DEBUG_POINT2
DEBUG_POINT3 counts[15]: MCR:0x0000000F, steps:81. DEBUG_POINT3
DEBUG_POINT4 counts[15]: MCR:0x0000000F, steps:82. DEBUG_POINT4
EnterFMode_out counts[15]: MCR:0x0000000F, steps:83. EnterFMode_out
DEBUG_POINT11 counts[00]: MCR:0x0000000F, steps:84. DEBUG_POINT11
DEBUG_POINT12 counts[00]: MCR:0x0000000F, steps:85. DEBUG_POINT12
EnterFMode_in counts[16]: MCR:0x0000000F, steps:86. EnterFMode_in
DEBUG_POINT2 counts[16]: MCR:0x5000000F, steps:87. DEBUG_POINT2
DEBUG_POINT3 counts[16]: MCR:0x5000000F, steps:88. DEBUG_POINT3
DEBUG_POINT4 counts[16]: MCR:0x5900000F, steps:89. DEBUG_POINT4
EnterFMode_out counts[16]: MCR:0x5900000F, steps:90. EnterFMode_out
EnterFMode_in counts[17]: MCR:0x0000000F, steps:91. EnterFMode_in
DEBUG_POINT2 counts[17]: MCR:0x5000000F, steps:92. DEBUG_POINT2
DEBUG_POINT3 counts[17]: MCR:0x5000000F, steps:93. DEBUG_POINT3
DEBUG_POINT4 counts[17]: MCR:0x5900000F, steps:94. DEBUG_POINT4
EnterFMode_out counts[17]: MCR:0x5900000F, steps:95. EnterFMode_out
EnterFMode_in counts[18]: MCR:0x0000000F, steps:96. EnterFMode_in
DEBUG_POINT2 counts[18]: MCR:0x5000000F, steps:97. DEBUG_POINT2
DEBUG_POINT3 counts[18]: MCR:0x5000000F, steps:98. DEBUG_POINT3
DEBUG_POINT4 counts[18]: MCR:0x5900000F, steps:99. DEBUG_POINT4
EnterFMode_out counts[18]: MCR:0x5900000F, steps:100. EnterFMode_out/*FUNCTION**********************************************************************
*
* Function Name : FLEXCAN_EnterFreezeMode
* Description : Enter the freeze mode.
*
*END**************************************************************************/
void FLEXCAN_EnterFreezeMode(CAN_Type * base)
{
bool enabled = false;
DEBUG_TRACE_POINT(1);
base->MCR = (base->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U);
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
DEBUG_TRACE_POINT(2);
if (((base->MCR & CAN_MCR_MDIS_MASK) >> CAN_MCR_MDIS_SHIFT) == 0U)
{
enabled = true;
DEBUG_TRACE_POINT(3);
}
else
{
base->MCR &= ~CAN_MCR_MDIS_MASK;
}
#ifdef ERRATA_E9595
/* Check Low-Power Mode Acknowledge Cleared */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 1U) {}
/* Check if is a Bus-Off Error corresponding to 1x */
if ((((base->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT) & 2U) != 0U)
{
/* Save registers before Soft Reset */
!!!!!!!!!!
uint32_t tempIMSK[2],tempMCR;
tempIMSK[0] = base->IMASK1;
tempIMSK[1] = base->IMASK2;
tempMCR = base->MCR;
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) == 0U) {}
/* Restore registers after Soft Reset */
base->IMASK1 = tempIMSK[0];
base->IMASK2 = tempIMSK[1];
base->MCR = tempMCR;
}
else
{
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
}
#endif
base->TIMER = 0U;
uint32_t aux = 0U;
#if FEATURE_CAN_HAS_FD
/* MCR[FDEN] was reset to 0, wait for timeout */
if (!FLEXCAN_IsFDEnabled(base))
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
else
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 730U))
{
/* Wait until finish counting 730 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
#else
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
#error
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
#endif /* FEATURE_CAN_HAS_FD */
DEBUG_TRACE_POINT(4);
if (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U)
{
DEBUG_TRACE_POINT(5);
/* Save registers before Soft Reset */
volatile uint32_t tempIMSK1, tempMCR;
/* Save IMASK1 value */
tempIMSK1 = base->IMASK1;
/* Save MCR value */
tempMCR = base->MCR;
//memcpy(&tempBase,base,sizeof(tempBase));
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
DEBUG_TRACE_POINT(6);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
/* Restore IMASK1 value */
base->IMASK1 = tempIMSK1;
/* Restore MCR value */
base->MCR = tempMCR;
DEBUG_TRACE_POINT(7);
}
if (false == enabled)
{
base->MCR |= CAN_MCR_MDIS_MASK;
DEBUG_TRACE_POINT(8);
/* Wait until disable mode acknowledged */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 0U) {}
DEBUG_TRACE_POINT(9);
}
DEBUG_TRACE_POINT(10);
}我不知道如何添加工程附件发送给你,我只能文字描述一下
1.当前我们工程的SDK版本是S32K1xx RTM SDK 3.0.0
2. 问题描述如下:
环境:MCU型号:nxp sk148
调试手段:加日志、变量监控
复现步骤:我们的产品,两块相同的使用SK148作为主控MCU的单板A和B,烧录同一版本软件。AB板将同一路CAN连接到一起。A板先上电,间隔时间t(可能是0~1000ms的任意值)后,B板上电。继电器双通道自动步进1ms轮询0~1000ms范围间隔时间t,先后控制A、B板上下电,自动化测试环境,低概率会出现上电过程中,后上电的B板的felxcan模块初始化失败,导致can功能异常。我定位到异常时刻, FLEXCAN_EnterFreezeMode 走到了异常分支(DEBUG_POINT5、6、7),可以确实每次出问题都是走了你们新加的flexcan的softreset分支,在这之后flexcan模块的MCR寄存器的值被异常篡改成0x000000f,会导致can模块彻底死机无法使用。
我的定位结论:你们的“寄存器的描述,该位具有“同步”的机制,肯定是成功了之后该位才会置零。”并不如预期,事实上该位并不是真正同步的,设置softreset之后需要等待3~5个can时钟周期,硬件寄存器才能真正完成复位,在硬件寄存器没有真正复位之前,操作寄存器会导致异常。
“trace_log_done.txt”是我采用变量打点保存寄存器的方式,观察到问题时刻MCR寄存器的值的变化过程(其中EnterFMode_in代表DEBUG_POINT1,EnterFMode_out代表DEBUG_POINT10),setps表示函数调用的先后顺序,counts表示程序第几次走到这里,每次走到这里的MCR寄存器值我都会采用绝对地址访问读取并保存下来。
trace_log_done.txt:
EnterFMode_in counts[00]: MCR:0x5980000F, steps:1. EnterFMode_in
EBUG_POINT2 counts[00]: MCR:0x5980000F, steps:2. DEBUG_POINT2
EBUG_POINT3 counts[00]: MCR:0x5980000F, steps:3. DEBUG_POINT3
EBUG_POINT4 counts[00]: MCR:0x5980000F, steps:4. DEBUG_POINT4
nterFMode_out counts[00]: MCR:0x5980000F, steps:5. EnterFMode_out
nterFMode_in counts[01]: MCR:0x0080000F, steps:6. EnterFMode_in
EBUG_POINT2 counts[01]: MCR:0x5080000F, steps:7. DEBUG_POINT2
EBUG_POINT3 counts[01]: MCR:0x5080000F, steps:8. DEBUG_POINT3
EBUG_POINT4 counts[01]: MCR:0x5980000F, steps:9. DEBUG_POINT4
EnterFMode_out counts[01]: MCR:0x5980000F, steps:10. EnterFMode_out
EnterFMode_in counts[02]: MCR:0x2002101F, steps:11. EnterFMode_in
DEBUG_POINT2 counts[02]: MCR:0x7002101F, steps:12. DEBUG_POINT2
DEBUG_POINT3 counts[02]: MCR:0x7002101F, steps:13. DEBUG_POINT3
DEBUG_POINT4 counts[02]: MCR:0x7902101F, steps:14. DEBUG_POINT4
EnterFMode_out counts[02]: MCR:0x7902101F, steps:15. EnterFMode_out
EnterFMode_in counts[03]: MCR:0x2022101F, steps:16. EnterFMode_in
DEBUG_POINT2 counts[03]: MCR:0x2022101F, steps:17. DEBUG_POINT2
DEBUG_POINT3 counts[03]: MCR:0x2022101F, steps:18. DEBUG_POINT3
DEBUG_POINT4 counts[03]: MCR:0x2022101F, steps:19. DEBUG_POINT4
EnterFMode_out counts[03]: MCR:0x2022101F, steps:20. EnterFMode_out
EnterFMode_in counts[04]: MCR:0x2022101F, steps:21. EnterFMode_in
DEBUG_POINT2 counts[04]: MCR:0x2022101F, steps:22. DEBUG_POINT2
DEBUG_POINT3 counts[04]: MCR:0x2022101F, steps:23. DEBUG_POINT3
DEBUG_POINT4 counts[04]: MCR:0x2022101F, steps:24. DEBUG_POINT4
EnterFMode_out counts[04]: MCR:0x2022101F, steps:25. EnterFMode_out
EnterFMode_in counts[05]: MCR:0x2022101F, steps:26. EnterFMode_in
DEBUG_POINT2 counts[05]: MCR:0x7022101F, steps:27. DEBUG_POINT2
DEBUG_POINT3 counts[05]: MCR:0x7022101F, steps:28. DEBUG_POINT3
DEBUG_POINT4 counts[05]: MCR:0x7922101F, steps:29. DEBUG_POINT4
EnterFMode_out counts[05]: MCR:0x7922101F, steps:30. EnterFMode_out
EnterFMode_in counts[06]: MCR:0x2022101F, steps:31. EnterFMode_in
DEBUG_POINT2 counts[06]: MCR:0x2022101F, steps:32. DEBUG_POINT2
DEBUG_POINT3 counts[06]: MCR:0x2022101F, steps:33. DEBUG_POINT3
DEBUG_POINT4 counts[06]: MCR:0x2022101F, steps:34. DEBUG_POINT4
EnterFMode_out counts[06]: MCR:0x2022101F, steps:35. EnterFMode_out
EnterFMode_in counts[07]: MCR:0x2022101F, steps:36. EnterFMode_in
DEBUG_POINT2 counts[07]: MCR:0x7022101F, steps:37. DEBUG_POINT2
DEBUG_POINT3 counts[07]: MCR:0x7022101F, steps:38. DEBUG_POINT3
DEBUG_POINT4 counts[07]: MCR:0x7922101F, steps:39. DEBUG_POINT4
EnterFMode_out counts[07]: MCR:0x7922101F, steps:40. EnterFMode_out
EnterFMode_in counts[08]: MCR:0x2022101F, steps:41. EnterFMode_in
DEBUG_POINT2 counts[08]: MCR:0x7022101F, steps:42. DEBUG_POINT2
DEBUG_POINT3 counts[08]: MCR:0x7022101F, steps:43. DEBUG_POINT3
DEBUG_POINT4 counts[08]: MCR:0x7922101F, steps:44. DEBUG_POINT4
EnterFMode_out counts[08]: MCR:0x7922101F, steps:45. EnterFMode_out
EnterFMode_in counts[09]: MCR:0x2022101F, steps:46. EnterFMode_in
DEBUG_POINT2 counts[09]: MCR:0x2022101F, steps:47. DEBUG_POINT2
DEBUG_POINT3 counts[09]: MCR:0x2022101F, steps:48. DEBUG_POINT3
DEBUG_POINT4 counts[09]: MCR:0x2022101F, steps:49. DEBUG_POINT4
EnterFMode_out counts[09]: MCR:0x2022101F, steps:50. EnterFMode_out
EnterFMode_in counts[10]: MCR:0x2022101F, steps:51. EnterFMode_in
DEBUG_POINT2 counts[10]: MCR:0x2022101F, steps:52. DEBUG_POINT2
DEBUG_POINT3 counts[10]: MCR:0x2022101F, steps:53. DEBUG_POINT3
DEBUG_POINT4 counts[10]: MCR:0x2022101F, steps:54. DEBUG_POINT4
EnterFMode_out counts[10]: MCR:0x2022101F, steps:55. EnterFMode_out
EnterFMode_in counts[11]: MCR:0x2022101F, steps:56. EnterFMode_in
DEBUG_POINT2 counts[11]: MCR:0x7022101F, steps:57. DEBUG_POINT2
DEBUG_POINT3 counts[11]: MCR:0x7022101F, steps:58. DEBUG_POINT3
DEBUG_POINT4 counts[11]: MCR:0x7922101F, steps:59. DEBUG_POINT4
EnterFMode_out counts[11]: MCR:0x7922101F, steps:60. EnterFMode_out
EnterFMode_in counts[12]: MCR:0x2022101F, steps:61. EnterFMode_in
DEBUG_POINT2 counts[12]: MCR:0x2022101F, steps:62. DEBUG_POINT2
DEBUG_POINT3 counts[12]: MCR:0x2022101F, steps:63. DEBUG_POINT3
DEBUG_POINT4 counts[12]: MCR:0x2022101F, steps:64. DEBUG_POINT4
EnterFMode_out counts[12]: MCR:0x2022101F, steps:65. EnterFMode_out
EnterFMode_in counts[13]: MCR:0x2022101F, steps:66. EnterFMode_in
DEBUG_POINT2 counts[13]: MCR:0x7022101F, steps:67. DEBUG_POINT2
DEBUG_POINT3 counts[13]: MCR:0x7022101F, steps:68. DEBUG_POINT3
DEBUG_POINT4 counts[13]: MCR:0x7022101F, steps:69. DEBUG_POINT4
DEBUG_POINT5 counts[00]: MCR:0x7022101F, steps:70. DEBUG_POINT5
DEBUG_POINT6 counts[00]: MCR:0x5280000F, steps:71. DEBUG_POINT6
DEBUG_POINT7 counts[00]: MCR:0x5980000F, steps:72. DEBUG_POINT7
EnterFMode_out counts[13]: MCR:0x5980000F, steps:73. EnterFMode_out
EnterFMode_in counts[14]: MCR:0x0080000F, steps:74. EnterFMode_in
DEBUG_POINT2 counts[14]: MCR:0x5080000F, steps:75. DEBUG_POINT2
DEBUG_POINT3 counts[14]: MCR:0x5080000F, steps:76. DEBUG_POINT3
DEBUG_POINT4 counts[14]: MCR:0x5980000F, steps:77. DEBUG_POINT4
EnterFMode_out counts[14]: MCR:0x5980000F, steps:78. EnterFMode_out
EnterFMode_in counts[15]: MCR:0x0000000F, steps:79. EnterFMode_in
DEBUG_POINT2 counts[15]: MCR:0x0000000F, steps:80. DEBUG_POINT2
DEBUG_POINT3 counts[15]: MCR:0x0000000F, steps:81. DEBUG_POINT3
DEBUG_POINT4 counts[15]: MCR:0x0000000F, steps:82. DEBUG_POINT4
EnterFMode_out counts[15]: MCR:0x0000000F, steps:83. EnterFMode_out
DEBUG_POINT11 counts[00]: MCR:0x0000000F, steps:84. DEBUG_POINT11
DEBUG_POINT12 counts[00]: MCR:0x0000000F, steps:85. DEBUG_POINT12
EnterFMode_in counts[16]: MCR:0x0000000F, steps:86. EnterFMode_in
DEBUG_POINT2 counts[16]: MCR:0x5000000F, steps:87. DEBUG_POINT2
DEBUG_POINT3 counts[16]: MCR:0x5000000F, steps:88. DEBUG_POINT3
DEBUG_POINT4 counts[16]: MCR:0x5900000F, steps:89. DEBUG_POINT4
EnterFMode_out counts[16]: MCR:0x5900000F, steps:90. EnterFMode_out
EnterFMode_in counts[17]: MCR:0x0000000F, steps:91. EnterFMode_in
DEBUG_POINT2 counts[17]: MCR:0x5000000F, steps:92. DEBUG_POINT2
DEBUG_POINT3 counts[17]: MCR:0x5000000F, steps:93. DEBUG_POINT3
DEBUG_POINT4 counts[17]: MCR:0x5900000F, steps:94. DEBUG_POINT4
EnterFMode_out counts[17]: MCR:0x5900000F, steps:95. EnterFMode_out
EnterFMode_in counts[18]: MCR:0x0000000F, steps:96. EnterFMode_in
DEBUG_POINT2 counts[18]: MCR:0x5000000F, steps:97. DEBUG_POINT2
DEBUG_POINT3 counts[18]: MCR:0x5000000F, steps:98. DEBUG_POINT3
DEBUG_POINT4 counts[18]: MCR:0x5900000F, steps:99. DEBUG_POINT4
EnterFMode_out counts[18]: MCR:0x5900000F, steps:100. EnterFMode_out/*FUNCTION**********************************************************************
*
* Function Name : FLEXCAN_EnterFreezeMode
* Description : Enter the freeze mode.
*
*END**************************************************************************/
void FLEXCAN_EnterFreezeMode(CAN_Type * base)
{
bool enabled = false;
DEBUG_TRACE_POINT(1);
base->MCR = (base->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U);
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
DEBUG_TRACE_POINT(2);
if (((base->MCR & CAN_MCR_MDIS_MASK) >> CAN_MCR_MDIS_SHIFT) == 0U)
{
enabled = true;
DEBUG_TRACE_POINT(3);
}
else
{
base->MCR &= ~CAN_MCR_MDIS_MASK;
}
#ifdef ERRATA_E9595
/* Check Low-Power Mode Acknowledge Cleared */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 1U) {}
/* Check if is a Bus-Off Error corresponding to 1x */
if ((((base->ESR1 & CAN_ESR1_FLTCONF_MASK) >> CAN_ESR1_FLTCONF_SHIFT) & 2U) != 0U)
{
/* Save registers before Soft Reset */
!!!!!!!!!!
uint32_t tempIMSK[2],tempMCR;
tempIMSK[0] = base->IMASK1;
tempIMSK[1] = base->IMASK2;
tempMCR = base->MCR;
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) == 0U) {}
/* Restore registers after Soft Reset */
base->IMASK1 = tempIMSK[0];
base->IMASK2 = tempIMSK[1];
base->MCR = tempMCR;
}
else
{
base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
}
#endif
base->TIMER = 0U;
uint32_t aux = 0U;
#if FEATURE_CAN_HAS_FD
/* MCR[FDEN] was reset to 0, wait for timeout */
if (!FLEXCAN_IsFDEnabled(base))
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
else
{
while (!FLEXCAN_GetFreezeMode(base) && (aux < 730U))
{
/* Wait until finish counting 730 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
}
#else
while (!FLEXCAN_GetFreezeMode(base) && (aux < 180U))
{
#error
/* Wait until finish counting 180 bit times and exit*/
aux = (uint32_t)base->TIMER;
}
#endif /* FEATURE_CAN_HAS_FD */
DEBUG_TRACE_POINT(4);
if (((base->MCR & CAN_MCR_FRZACK_MASK) >> CAN_MCR_FRZACK_SHIFT) == 0U)
{
DEBUG_TRACE_POINT(5);
/* Save registers before Soft Reset */
volatile uint32_t tempIMSK1, tempMCR;
/* Save IMASK1 value */
tempIMSK1 = base->IMASK1;
/* Save MCR value */
tempMCR = base->MCR;
//memcpy(&tempBase,base,sizeof(tempBase));
/* Soft Reset FlexCan */
base->MCR |= CAN_MCR_SOFTRST(1U);
DEBUG_TRACE_POINT(6);
while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}
/* Restore IMASK1 value */
base->IMASK1 = tempIMSK1;
/* Restore MCR value */
base->MCR = tempMCR;
DEBUG_TRACE_POINT(7);
}
if (false == enabled)
{
base->MCR |= CAN_MCR_MDIS_MASK;
DEBUG_TRACE_POINT(8);
/* Wait until disable mode acknowledged */
while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) == 0U) {}
DEBUG_TRACE_POINT(9);
}
DEBUG_TRACE_POINT(10);
}你可以告知我你当前所使用的SDK版本是什么?因为我并不确定你遇到的问题是否和我所说的是一个相同的问题。
如果不是RTM 4.0.1及其之后的版本,你可以尝试更新至RTM 4.0.1及之后的版本进行尝试,是否改更新能够
解决你当前的问题。
“void FLEXCAN_EnterFreezeMode(CAN_Type * base)”这个api的实现步骤是
1.请求进入freeze mode
2.等待超时,进入失败之后才会去执行flexcan的复位。在旧版本中是没有超时判断的。
3.即使进入flexcan的复位,理论上也不会出现你说的这种状况,按该寄存器的描述,该位具有“同步”的机制,肯定是成功了之后该位才会置零。
不过如果不是我所猜测的这种状况,你可以提供你的工程给我,告知我如何复现你的问题,这样我才好是否有类似的bug,是否可以被认定为一个未知的bug。
感谢你的回复。根据你的信息描述来看,你说的这个问题和我的这个问题并不是一个问题,你说的是超时之后会执行can soft reset,我说的问题是执行完reset后必须等一段时间等硬件真正执行完reset后才能给MCR寄存器赋值,麻烦重新审视一下我的问题描述,谢谢!
Hi@MrYin
是的,这是一个已知且修复的问题。
你应该用的是RTM 4.0.0和其之前的版本,在RTM 4.0.1及之后的版本中已经进行了修改。
新版本中针对CAN 和CAN FD 添加了不同的延时判断。