NXP MCU 技术论坛
直播中

李霞

8年用户 1341经验值
私信 关注
[问答]

在LPC54606J512 MCU上配置CAN 1,传输数据时遇到错误“kStatus_MCAN_ErrorStatus”怎么解决?

我正在使用 LPC54606J512 MCU 并尝试使用 CAN 1。我已经配置了 CAN_TD 和 CAN_RD 引脚,但在传输数据时遇到错误“kStatus_MCAN_ErrorStatus”。以下是我为 CAN 1 更改的配置:
#define USE_IMPROVED_tiMING_CONFIG (1U)#define EXAMPLE_MCAN_IRQHandler CAN1_IRQ0_IRQHandler#define EXAMPLE_MCAN_IRQn CAN1_IRQ0_IRQn#define EXAMPLE_MCAN CAN1#define MCAN_CLK_FREQ CLOCK_GetMCanClkFreq(1U)
时钟频率设置为 12 MHz,配置如下:
config->baudRateA = 500000U;config->baudRateD = 2000000U;config->enableCanfdNormal = false;config->enableCanfdSwitch = false;config->enableLoopBackInt = false;config->enableLoopBackExt = false;config->enableBusMon = false;/* Default protocol timing configuration, time quantum is 16. */config->timingConfig.seg1 = 0xAU;config->timingConfig.seg2 = 0x3U;config->timingConfig.rJumpwidth = 0x3U;您能否指导我解决此问题。

回帖(1)

李丽

2025-3-26 17:59:27

在LPC54606J512 MCU上解决CAN 1传输错误“kStatus_MCAN_ErrorStatus”的步骤如下:


1. 检查引脚配置



  • 复用功能:确认CAN_TDCAN_RD引脚已正确映射到MCAN1的物理引脚(如P3_8和P3_9),并设置正确的IOMUXC配置。

  • 引脚方向:确保CAN_TD配置为输出,CAN_RD为输入。

  • 冲突检查:排除其他外设占用相同引脚的可能性。


2. 验证时钟配置



  • 时钟源:确认CLOCK_GetMCanClkFreq(1U)返回12 MHz。检查MCAN时钟树配置,确保主时钟分频正确。

  • 波特率计算

    • 500kbps (Arbitration):

      位时间 = 1 / 500e3 = 2 μs

      时间份额 = 12e6 Hz / (Prescaler) → 例如,Prescaler=12 → 时间份额周期=1 μs。

      总时间份额数 = 2 μs / 1 μs = 20 → Sync_Seg(1) + Prop_Seg(5) + Phase_Seg1(6) + Phase_Seg2(8) = 20。

    • 2Mbps (Data):

      类似计算,调整Prescaler和段长度。



3. 分析错误状态寄存器



  • 在调试中读取MCAN_PSR(协议状态寄存器)和MCAN_ECR(错误计数器寄存器):
     uint32_t psr = MCAN_GetProtocolStatus(EXAMPLE_MCAN);
    uint32_t ecr = MCAN_GetErrorCounters(EXAMPLE_MCAN);

  • 根据寄存器值判断错误类型(如ACK错误、位错误等),并针对性解决。


4. 物理层检查



  • 终端电阻:确保CAN总线两端接有120Ω电阻。

  • 收发器状态:检查收发器电源、使能引脚和信号线连接。用示波器检测CANH/CANL差分信号。


5. 软件配置优化



  • 位时间配置:使用NXP官方工具(如MCAN Timing Calculator)验证参数:
     config->nominalPrescaler = 12;   // 12 MHz / 12 = 1 MHz → 1时间份额=1 μs
    config->nominalSyncJumpWidth = 1;
    config->nominalTimeSeg1 = 5 + 6; // Prop_Seg + Phase_Seg1
    config->nominalTimeSeg2 = 8;

  • 错误中断处理:在中断服务程序(ISR)中清除错误标志:
     void EXAMPLE_MCAN_IRQHandler(void) {
         if (MCAN_GetStatusFlags(EXAMPLE_MCAN) & kMCAN_ErrorStatusFlag) {
             MCAN_ClearStatusFlags(EXAMPLE_MCAN, kMCAN_ErrorStatusFlag);
             // 处理错误(如重初始化、日志记录)
         }
    }


6. 代码示例修正


   // 确保初始化顺序正确
   CLOCK_EnableClock(kCLOCK_Mcan1);  // 使能MCAN1时钟
   CLOCK_SetMCanClockSource(1, kCLOCK_MCanSrcMainClk); // 设置时钟源
   RESET_PeripheralReset(kMCAN1_RST_SHIFT_RSTn); // 复位MCAN1

   // 配置引脚
   IOMUXC_SetPinMux(IOMUXC_GPIO_SD_08_FLEXCAN1_TD, 1U);
   IOMUXC_SetPinMux(IOMUXC_GPIO_SD_09_FLEXCAN1_RD, 1U);
   IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_08_FLEXCAN1_TD, 0x10A0U);
   IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_09_FLEXCAN1_RD, 0x10A0U);

   // 初始化MCAN
   MCAN_Init(EXAMPLE_MCAN, &config, MCAN_CLK_FREQ);

   // 启用中断
   EnableIRQ(EXAMPLE_MCAN_IRQn);
   MCAN_EnableInterrupts(EXAMPLE_MCAN, kMCAN_ErrorStatusInterrupt);

7. 硬件工具验证



  • 示波器:观察CAN_TD信号是否有波形输出,确认信号幅值和时间符合预期。

  • CAN分析仪:使用工具(如PCAN-USB)监听总线,确认报文是否正常发送。


8. 其他注意事项



  • 双节点测试:至少连接两个CAN节点,避免ACK缺失。

  • 静电和干扰:检查环境干扰,必要时增加屏蔽或滤波电容。


通过以上步骤逐步排查,通常可定位并解决“kStatus_MCAN_ErrorStatus”错误。若问题仍存在,建议参考NXP官方论坛或提交技术支持请求。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分