NXP MCU 技术william hill官网
直播中

王磊

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

如何从传统的CAN用法中设置CAN-FD?

您好 NXP:
我们在 s32k312 平台中使用了经典的 CAN 总线(2.0/固定 8 字节数据),现在我们想升级
CAN-FD 格式。我设置了 CAN-FD 参数(经典 CAN 500Kbit/CAN-FD 2Mbit)并连接到 PCAN 设备,但是
我不知道如何将项目修改为 CAN-FD 环回,请帮助我们,谢谢。

回帖(1)

贺服窍

2025-4-16 18:11:39

在S32K312平台上从经典CAN升级到CAN-FD并配置环回模式,需要以下关键步骤:




1. 硬件与时钟配置



  • 确认硬件支持:确保使用的S32K312芯片及外围威廉希尔官方网站 支持CAN-FD。

  • 时钟设置

    • CAN-FD数据段波特率(如2Mbps)需要更高的时钟频率,调整内核时钟或CAN模块时钟分频器。

    • MC_CGMSCG模块中配置PLL,确保时钟源满足波特率要求。





2. FlexCAN模块配置


启用CAN-FD模式


CAN_CTRL2寄存器中设置:


CAN_CTRL2 |= (1 << FDOE_MB) | (1 << BRS_MB); // 启用FD和波特率切换

配置波特率参数



  • 仲裁段(500kbps)
    CAN_CBT = (prescaler_arb << 16) | (tseg1_arb << 8) | tseg2_arb;

  • 数据段(2Mbps)
    CAN_FDCBT = (prescaler_data << 16) | (tseg1_data << 8) | tseg2_data;

    注:需根据时钟频率计算prescalertseg1/2,确保波特率误差 < 1%。



配置环回模式


CAN_CTRL1寄存器中启用内部环回:


CAN_CTRL1 |= (1 << LOM) | (1 << LBACK); // 环回模式 + 自接收



3. 消息缓冲区(MB)配置



  • 发送MB
    CAN_MB[tx_mb].CS = CAN_CS_FDF | CAN_CS_BRS; // 标记为FD帧并启用波特率切换
    CAN_MB[tx_mb].ID = 0x123;                   // 帧ID
    CAN_MB[tx_mb].DATA[0..63] = ...;            // 数据(最多64字节)

  • 接收MB
    CAN_MB[rx_mb].CS = CAN_CS_FDF;              // 匹配FD帧
    CAN_MB[rx_mb].ID = 0x123;                   // 同一ID




4. 中断与轮询配置



  • 启用接收中断(可选):
    CAN_IMASK1 |= (1 << rx_mb);                 // 使能对应MB中断
    NVIC_EnableIRQ(CAN_IRQn);                   // 全局中断使能

  • 轮询发送
    CAN_MB[tx_mb].CS |= CAN_CS_CODE_TX;         // 触发发送
    while (!(CAN_MB[tx_mb].CS & CAN_CS_CODE_TX_INACTIVE)); // 等待发送完成




5. PCAN工具配置



  • 设置PCAN为CAN-FD模式

    • 在PCAN-View或PCAN-Explorer中选择CAN FD协议。

    • 配置仲裁段500kbps,数据段2Mbps。


  • 监控环回数据

    • 发送FD帧后,检查是否收到相同ID和数据。





6. 调试建议



  • 寄存器检查:使用调试器确认CAN_CTRL1/2CBT/FDCBT寄存器值正确。

  • 示波器验证:测量CAN总线波形,确认仲裁段和数据段波特率是否符合预期。

  • 错误处理:检查CAN_ESR寄存器,排查ACK错误、格式错误等。




示例代码片段(基于S32 SDK)


// 初始化FlexCAN为FD环回
flexcan_fd_config_t config;
FLEXCAN_FD_GetDefaultConfig(&config);
config.baudRateA = 500000;       // 仲裁段500kbps
config.baudRateD = 2000000;      // 数据段2Mbps
config.enableLoopback = true;    // 启用环回模式
FLEXCAN_FD_Init(CAN0, &config, CLOCK_GetFreq(kCLOCK_CoreClk));

// 配置发送MB
flexcan_fd_tx_frame_t txFrame;
txFrame.id = 0x123;
txFrame.fd_enable = true;        // 启用FD
txFrame.brs = true;              // 启用波特率切换
txFrame.dataLength = 64;          // 64字节数据
memset(txFrame.data, 0xAA, 64);
FLEXCAN_FD_WriteTxMb(CAN0, TX_MB_IDX, &txFrame);

// 接收处理
flexcan_fd_rx_frame_t rxFrame;
if (FLEXCAN_FD_ReadRxMb(CAN0, RX_MB_IDX, &rxFrame)) {
    // 验证接收数据是否与发送一致
}



常见问题排查



  • 无法进入FD模式:检查FDOE_MBBRS_MB是否配置正确。

  • 波特率不匹配:重新计算CBTFDCBT参数。

  • 环回无数据:确认LOMLBACK位已置位,或检查MB的过滤器配置。


通过以上步骤,应能成功实现CAN-FD环回通信。如需进一步调试,可提供具体代码片段或寄存器截图以深入分析。

举报
×
20
完善资料,
赚取积分