2149884_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2149884_zh-CN

2149884_zh-CN

FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

你好,我最近遇到一个关于sk148 EnterFreezeMode等不到FRZACK,执行softreset之后,MCR寄存器异常的问题。代码如下:

            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) {}
       
                /* Restore IMASK1 value */
                base->IMASK1 = tempIMSK1;
       
                /* Restore MCR value */
                base->MCR = tempMCR;
            }
以上是你们的sdk代码,它存在问题:
              /* Soft Reset FlexCan */
                base->MCR |= CAN_MCR_SOFTRST(1U);
                while (((base->MCR & CAN_MCR_SOFTRST_MASK) >> CAN_MCR_SOFTRST_SHIFT) != 0U) {}执行后,flexcan并没有真正完成复位,导致后续对MCR寄存器赋值操作失效。必须要在softreset之后delay一下才没有问题。
1.请问是否是已知问题?
2.如果是已知问题,为什么我在你们公开的errata文件中并没有找到关于这个问题的描述
盼望回复,谢谢!
 
Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

你们帖子回复是有字节限制嘛?我回复了复现步骤,版本代码各种信息,发了七八遍,一发出来就被自动删除

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常
我不知道如何添加工程附件发送给你,我只能文字描述一下
 
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);
}

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

你们这个网站一直自动删我的回复帖子,我真的服了,发不出来

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

Hi@MrYin

麻烦你告知我你所使用的SDK的版本,并且提供复现问题的步骤以及工程,我首先要复现你的问题我才能提供建议。

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常
我不知道如何添加工程附件发送给你,我只能文字描述一下
 
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代码的修改,实测在设置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;
			}​

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

以下是我对你们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;
			}

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常
我不知道如何添加工程附件发送给你,我只能文字描述一下
 
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);
}

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

我不知道如何添加工程附件发送给你,我只能文字描述一下

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);
}

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

Hi@MrYin

你可以告知我你当前所使用的SDK版本是什么?因为我并不确定你遇到的问题是否和我所说的是一个相同的问题。

如果不是RTM 4.0.1及其之后的版本,你可以尝试更新至RTM 4.0.1及之后的版本进行尝试,是否改更新能够

解决你当前的问题。

“void FLEXCAN_EnterFreezeMode(CAN_Type * base)”这个api的实现步骤是

1.请求进入freeze mode

2.等待超时,进入失败之后才会去执行flexcan的复位。在旧版本中是没有超时判断的。

3.即使进入flexcan的复位,理论上也不会出现你说的这种状况,按该寄存器的描述,该位具有“同步”的机制,肯定是成功了之后该位才会置零。

Senlent_0-1754978849917.png


不过如果不是我所猜测的这种状况,你可以提供你的工程给我,告知我如何复现你的问题,这样我才好是否有类似的bug,是否可以被认定为一个未知的bug。


Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

感谢你的回复。根据你的信息描述来看,你说的这个问题和我的这个问题并不是一个问题,你说的是超时之后会执行can soft reset,我说的问题是执行完reset后必须等一段时间等硬件真正执行完reset后才能给MCR寄存器赋值,麻烦重新审视一下我的问题描述,谢谢!

Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常感谢你的回复。根据你的信息描述来看,你说的这个问题和我的这个问题并不是一个问题,你说的是超时之后会执行can soft reset,我说的问题是执行完reset后必须等一段时间等硬件真正执行完reset后才能给MCR寄存器赋值,麻烦重新审视一下我的问题描述,谢谢!Re: FLEXCAN_EnterFreezeMode等不到MCR_FRZACK之后,执行复位,执行完复位之后CAN模块MCR寄存器异常

Hi@MrYin

是的,这是一个已知且修复的问题。

你应该用的是RTM 4.0.0和其之前的版本,在RTM 4.0.1及之后的版本中已经进行了修改。

新版本中针对CAN 和CAN FD 添加了不同的延时判断。

Senlent_0-1754964885201.png


Tags (1)
No ratings
Version history
Last update:
‎11-20-2025 03:12 PM
Updated by: