NXP MCU 技术论坛
直播中

李丹

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

s32k37x_s32k39x_can_receive_s32ct在S32K396-BGA-DC1评估板上无法正常工作怎么解决?

我尝试在 S32K396-BGA-DC1 评估板上接收 CAN 消息。
我成功运行了s32k37x_s32k39x_can_transmit_ebt示例,因此我可以从电路板接收 CAN 消息。因此,我猜我的硬件设置是正确的。
但是,运行s32k37x_s32k39x_can_receive_s32ct示例时,当我向开发板发送消息时,D33 LED 不亮。
我正在使用两个 Peak PCAN USB 适配器,我的两个 PCAN 都接收了来自电路板的帧。
我发送的帧来自 PCAN,其他 PCAN 可以看到,但电路板看不到。
我确实检查了配置
Rx/Tx 引脚的设置与电路板用户指南相同(PTC23:Rx / PTC21:Tx)

控制器未处于环回模式

我已将一些 CanHardwareObjects 设置为禁用 ID 筛选的接收方(筛选掩码 0 = 接受所有帧)

有人可以帮忙吗?

回帖(1)

刘敏

2025-3-2 13:02:48

针对您在S32K396评估板上运行CAN接收示例时遇到的问题,以下是逐步的解决方案:


1. 验证波特率配置



  • 检查发送和接收的波特率设置:确保评估板的接收示例与PCAN发送端的波特率(如500kbps)完全一致。对比发送示例(已验证正常)和接收示例的波特率配置代码,确认参数(如propSeg, phaseSeg1, phaseSeg2, preDivider)相同。

  • 使用PCAN工具检测波特率:通过PCAN-View的自动检测功能,确认评估板发送的波特率是否与接收示例配置一致。


2. 检查CAN过滤器设置



  • 配置过滤器为接收所有帧:在接收示例中,将过滤器掩码设置为全0以接收所有ID。例如,修改CAN_SetupRxFifo函数中的掩码值:
     filter.idwidth = CAN_ID_STD; // 标准ID
    filter.id = 0x000;          // 接收任意ID
    filter.mask = 0x000;        // 无过滤

  • 确认发送帧的ID类型:确保PCAN发送的帧是标准帧(11位ID)或扩展帧(29位ID),并与过滤器配置匹配。


3. 验证接收中断/轮询逻辑



  • 检查中断配置:在接收示例中,确认已启用接收中断并正确注册中断服务例程(ISR)。例如:
     CAN_EnableEvent(CAN0, CAN_EVENT_RX_FIFO_NEW_MESSAGE, true);

  • 清除中断标志:在ISR中读取接收数据后,清除对应的中断标志,避免阻塞后续中断。

  • 轮询模式检查:如果示例使用轮询方式,确认主循环中定期调用CAN_ReadRxFifo函数并处理接收数据。


4. 添加调试输出



  • 在接收回调中触发其他动作:例如,在接收到消息时翻转另一个LED(如D34)或通过串口打印调试信息:
     void RX_Callback(void) {
         LED_Toggle(LED_D34); // 确保LED函数已初始化
         // 或使用LPUART_WriteString("Received!n");
    }

  • 检查数据是否正确:在接收处理代码中,读取接收缓冲区的ID和数据,确认与发送内容一致。


5. 检查引脚复用配置



  • 使用寄存器查看工具:确认PTC23(CAN0_RX)和PTC21(CAN0_TX)的引脚控制寄存器(PCC)已正确设置为CAN功能(ALT2):
     PCC->PCC_PORTCLK[PTC_INDEX] |= PCC_PCCn_CGC_MASK; // 使能PORT C时钟
    PORTC->PCR[21] = PORT_PCR_MUX(2); // CAN0_TX (ALT2)
    PORTC->PCR[23] = PORT_PCR_MUX(2); // CAN0_RX (ALT2)


6. 检查CAN控制器状态



  • 读取错误状态寄存器:在调试器中查看CAN0->ESR寄存器,确认无错误(如BOFF_INT表示总线关闭)。若存在错误,复位CAN控制器并重新初始化。

  • 确认工作模式:确保CAN控制器处于正常模式而非监听模式:
     CAN_SetMode(CAN0, CAN_NORMAL_MODE);


7. 更新SDK和示例代码



  • 检查SDK版本:确认使用的S32K3xx SDK版本与S32K396兼容。建议使用最新版本(如S32K3 RTM 4.0 或更高)。

  • 重新导入示例:从SDK中重新生成接收示例,避免手动修改导致的配置错误。


8. 硬件交叉验证



  • 更换CAN通道:若评估板支持多路CAN(如CAN1),尝试使用另一路CAN接口进行测试。

  • 检查CAN收发器供电:测量CAN收发器(如TJA1145)的VCC和VIO电压是否正常(通常为5V或3.3V)。


示例代码修改参考


在接收示例的初始化部分,添加以下关键配置:


// 设置过滤器接收所有标准ID
can_fd_filter_t filter;
filter.idwidth = CAN_ID_STD;
filter.id = 0x000;
filter.mask = 0x000;
CAN_SetupRxFifo(CAN0, &filter, 1, 0); // FIFO索引0

// 启用接收中断
CAN_EnableEvent(CAN0, CAN_EVENT_RX_FIFO_NEW_MESSAGE, true);
IntCtrl_InstallIRQHandler(CAN0_ORED_IRQn, CAN0_IRQHandler);
IntCtrl_EnableIRQ(CAN0_ORED_IRQn);

// 在中断处理函数中处理接收
void CAN0_IRQHandler(void) {
    if (CAN_GetEvent(CAN0) & CAN_EVENT_RX_FIFO_NEW_MESSAGE) {
        can_fd_message_t rxMsg;
        CAN_ReadRxFifo(CAN0, 0, &rxMsg); // 读取FIFO0数据
        if (rxMsg.data[0] == 0x01) {     // 假设数据第一个字节控制LED
            LED_Set(LED_D33, true);      // 点亮D33
        }
        CAN_ClearEvent(CAN0, CAN_EVENT_RX_FIFO_NEW_MESSAGE);
    }
}

最终验证步骤



  1. 发送标准测试帧:通过PCAN-View发送ID=0x001,数据=0x01的标准帧。

  2. 监控LED和调试输出:若D33未亮,使用调试器断点检查是否进入中断,并检查rxMsg内容。

  3. 测量CAN信号:用示波器确认CANH/CANL在发送时有差分信号,排除硬件故障。


通过以上步骤,应能定位并解决接收功能失效的问题。如果问题依旧,建议在NXP社区提交案例并提供详细配置截图和逻辑分析仪捕获的CAN波形。

举报

更多回帖

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