S32K358 EVK 板 CAN 总线无法工作 你好, 我尝试运行代码来使用 S32K3x8EV8 板的 CAN0 或 CAN1,但我无法做到。但是 CAN 完全不起作用,我正在尝试通过 Waveshare USB-CAN-A 读取 CAN 消息。 代码也粘贴好了,附上CAN配置截图 /* * 版权所有 2019 NXP * * ALL RIGHTS RESERVED. * * 本软件由 NXP“按原样”提供,且不提供任何明示或暗示的保证。 * 默示担保,包括但不限于默示担保 * 不保证其适销性和适用于特定用途。 * 在任何情况下,NXP 或其贡献者均不对任何直接、 * 间接的、附带的、特殊的、惩罚性的或后果性的损害赔偿 *(包括但不限于采购替代商品或 * 服务;使用损失、数据丢失或利润损失;或业务中断) 无论何种原因造成,也无论基于何种责任理论,无论是合同责任, * 严格责任或侵权行为(包括过失或其他) 即使已被告知,也不得以任何方式退出本软件的使用。 * 发生此类损害的可能性。 */ /* ################################################################### ******************************************************************************** 文件:main.c * 所有者:彼得·斯坦西克 * 版本:1.0 * 日期: 2024年10月22日 * 分类:一般商业信息 * 简介:FlexCAN TX/RX ISR 测试 * ******************************************************************************** ******************************************************************************** 此演示应用程序的目的是向您展示 FlexCAN 模块的用法。 配置为使用 S32 RTD API 的 CAN FD。 - 此演示应用程序需要两块板,或者使用 CAN 工具连接一块板。 - CAN FD 已启用,比特率为500/2000 kbps - 它配置 FlexCAN0 模块及其收发器 (TJA1153)。 - MB0 用于传输 CANFD STD. ID - MB1 配置为接收任何 STD ID - 回调函数也用于处理 MB 中的 TX 和 RX 过程。收到的 ID 为 回声响起。 - 调用 setupCanXCVR 函数初始化连接到板上 FlexCAN0 的 TJA1153。 它期望收发器处于 Vanilla 状态,并将 TPL 设置为传递所有STD和扩展ID。 不要屏蔽来自总线的任何消息。最后退出配置模式 无需写入非易失性存储器,也无需锁定收发器。 * * ------------------------------------------------------------------------------ * 测试硬件:S32K3X8EVB-Q289 rev B2 * MCU:P32K358HVS 0P14E * 编译器:S32DS.ARM.3.5 * SDK 版本:S32K3_RTD_4.0.0_D2311 * 调试器: Lauterbach * 目标:内部闪存 * ******************************************************************************** 修订记录: 1.0 2024年10月22日Petr Stancik初始版本,基于 RTD FlexCAN_Ip_example *******************************************************************************/ /* 包括必要的配置文件。*/ #include "Mcal.h" #include "Clock_Ip.h" #include "FlexCAN_Ip.h" #include "IntCtrl_Ip.h" #include "Siul2_Port_Ip_Cfg.h" #include "Siul2_Dio_Ip_Cfg.h" #include "Siul2_Dio_Ip.h" #include "Siul2_Port_Ip.h" #include "OsIf.h" #define MSG_ID 20u #define RX_MB_IDX 1U #define TX_MB_IDX 0U volatile int exit_code = 0 ; /* 用户包含 */ Flexcan_Ip_DataInfoType tx_info = { .msg_id_type = FLEXCAN_MSG_ID_STD , . data_length = 1u , .fd_enable = FALSE , .fd_padding = FALSE , .enable_brs = FALSE , is_polling = FALSE , is_remote = FALSE } ; Flexcan_Ip_DataInfoType rx_info = { .msg_id_type = FLEXCAN_MSG_ID_STD , . data_length = 1u , .fd_enable = FALSE , .fd_padding = FALSE , .enable_brs = FALSE , is_polling = FALSE , is_remote = FALSE } ; Flexcan_Ip_MsgBuffType rxData ; uint8 dummyData [ 8 ] ; volatile uint32 g_canErrorStatus = 0 ; /* 用于调试器监视的实时 ESR1 快照 */ volatile Flexcan_Ip_StatusType g_tja1153Status [ 3 ] ; /* [0]=自动波特率,[1]=FEC白名单,[2]=退出配置*/ /*! \brief 项目的主要功能。 详细信息:启动初始化顺序如下: * - 启动汇编例程 * - 主要的() */ extern void CAN0_ORED_0_31_MB_IRQHandler ( void ) ; void setupCanXCVR_TJA1153 ( void ) ; static void CAN_DelayMs ( uint32 ms ) { uint32 ticks = OsIf_MicrosToTicks ( ms * 1000 U , FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ; uint32 start = OsIf_GetCounter ( FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ; uint32 elapsed = 0 U ; 当(经过时间<刻度) { elapsed += OsIf_GetElapsed ( & start , FLEXCAN_IP_SERVICE_TIMEOUT_TYPE ) ; } } void flexcan0_Callback ( uint8 instance , Flexcan_Ip_EventType eventType , uint32 buffIdx , const Flexcan_Ip_StateType * flexcanState ) { ( void ) flexcanState ; ( void )实例; 切换(事件类型) { case FLEXCAN_EVENT_RX_COMPLETE : dummyData [ 0 ] ++; 如果( buffIdx == 1 ) // 已接收 MB1 { FlexCAN_Ip_Send ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , rxData . msgId ,( uint8 * ) & dummyData ) ; FlexCAN_Ip_Receive ( INST_FLEXCAN_0 , RX_MB_IDX , & rxData , false ) ; } 休息; case FLEXCAN_EVENT_RXFIFO_COMPLETE : 休息; case FLEXCAN_EVENT_TX_COMPLETE : 休息; case FLEXCAN_EVENT_ENHANCED_RXFIFO_COMPLETE : 休息; case FLEXCAN_EVENT_ENHANCED_RXFIFO_WATERMARK : 休息; 默认: 休息; } } void setupCanXCVR_TJA1153 ( void ) { /** * 与大多数 CAN 收发器不同,TJA1153 收发器并非即插即用。 如果之前没有配置过,则初始时进入配置模式。 * 在此初始状态下,它已准备好接收额外的网络安全 例如 TPL/BBL 之类的装置。 * * 在此示例中,它将 TPL 设置为传递所有标准和扩展ID,并且不阻止任何消息。 * 下总线。最后退出配置模式,未写入非易失性数据。 * 既不锁定收发器,也不存储内存。 * * 有关更多详细信息,请参阅 NXP 的 TJA1153 数据手册。 * */ #define TJA1153_START_ID (uint32_t)(0x555u) #define TJA1153_CONFIG_ID (uint32_t)(0x18DA00F1u) uint8 sendData [ 8 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; uint32_t错误; /* 允许通过 TXD 引脚从本地主机配置 CAN0 收发器,STB = 0 (PTC20) */ Siul2_Dio_Ip_WritePin ( PTC_H_HALF , 4 , 0 U ) ; CAN_DelayMs ( 1000 ) ; /* 自动比特率检测初始 CAN Classic 帧,ID 为 0x555,适用于 CAN0 */ tx_info.is_polling = TRUE ; tx_info.msg_id_type = FLEXCAN_MSG_ID_STD ; tx_info.data_length = 8 ; g_tja1153Status [ 0 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , TJA1153_START_ID , sendData , 1000 ) ; /* 用于设置传输白名单的滤波器元件配置 (FEC) 帧。 * 注意:ID_TX 是 NXP 参考示例的占位符 (0xC0FFEE),而不是 MSG_ID - * 此操作仅将该单个扩展 ID列入白名单。请先确认此基本方法有效。 然后根据 TJA1153数据手册,根据您的实际 ID 调整 ID_TX/Extended_Filter_Config。 { uint32_t ID_Stinger = TJA1153_CONFIG_ID ; uint32_t PAYLOAD_FEC [ 2 ] ; uint8_t COMMAND_BYTE_FEC = 0x10 ; uint8_t Filter_Element_Index_0 = 0 ; uint8_t Filter_Element_Type = 1 ; uint8_t Extended_Filter_Config = 3 ; /* TWL 和 BBL 都适用 */ uint32_t ID_TX = 0xC0FFEE ; uint32_t Filter_Element_Contents = ( Extended_Filter_Config << 29 ) | ID_TX ; PAYLOAD_FEC [ 0 ] = ( COMMAND_BYTE_FEC << 24 ) | ( Filter_Element_Index_0 << 16 ) | (筛选元素类型<< 15 ) | (筛选元素内容>> 16 ) PAYLOAD_FEC [ 1 ] = ( Filter_Element_Contents & 0xFFFF ) << 16 ; sendData [ 0 ] = ( uint8 )( ( PAYLOAD_FEC [ 0 ] >> 24 ) & 0xFFU ) ; sendData [ 1 ] = ( uint8 )( ( PAYLOAD_FEC [ 0 ] >> 16 ) & 0xFFU ) ; sendData [ 2 ] = ( uint8 )(( PAYLOAD_FEC [ 0 ] >> 8 ) & 0xFF U ) ; sendData [ 3 ] = ( uint8 ) ( PAYLOAD_FEC [ 0 ] & 0xFFU ) ; sendData [ 4 ] = ( uint8 )( ( PAYLOAD_FEC [ 1 ] >> 24 ) & 0xFFU ) ; sendData [ 5 ] = ( uint8 )(( PAYLOAD_FEC [ 1 ] >> 16 ) & 0xFF U ) ; tx_info.msg_id_type = FLEXCAN_MSG_ID_EXT ; tx_info.data_length = 6 ; g_tja1153Status [ 1 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , ID_Stinger , sendData , 1000 ) ; CAN_DelayMs ( 5 ) ; } /* 退出配置模式的最后一个命令帧,无需写入非易失性存储器或非 * 锁定收发器,即开发模式*/ sendData [ 0 ] = 0x71 ; // 命令字节 sendData [ 1 ] = 0x2 ; sendData [ 2 ] = 0x3 ; sendData [ 3 ] = 0x4 ; sendData [ 4 ] = 0x5 ; sendData [ 5 ] = 0x6 ; sendData [ 6 ] = 0x7 ; sendData [ 7 ] = 0x8 ; tx_info.msg_id_type = FLEXCAN_MSG_ID_EXT ; tx_info.data_length = 8 ; g_tja1153Status [ 2 ] = FlexCAN_Ip_SendBlocking ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , TJA1153_CONFIG_ID , sendData , 1000 ) ; /* 最后一帧结束后,收发器退出配置模式并进入待机模式,退出 * 将 CAN0 收发器的 STB 引脚设置为高电平(引脚反接)即可切换到正常工作模式 */ Siul2_Dio_Ip_WritePin ( PTC_H_HALF , 4 , 1 U ) ; CAN_DelayMs ( 1000 ) ; errors = FlexCAN_Ip_GetErrorStatus ( INST_FLEXCAN_0 ) ; FlexCAN_Ip_ClearErrorStatus ( INST_FLEXCAN_0 , errors ) ; } int main ( void ) { /* 在这里编写你的代码 */ Clock_Ip_Init ( & Clock_Ip_aClockConfig [ 0 ]) ; Siul2_Port_Ip_Init ( NUM_OF_CONFIGURED_PINS0 , g_pin_mux_InitConfigArr0 ) ; IntCtrl_Ip_EnableIrq ( FlexCAN0_1_IRQn ) ; IntCtrl_Ip_InstallHandler ( FlexCAN0_1_IRQn , CAN0_ORED_0_31_MB_IRQHandler , NULL_PTR ) ; FlexCAN_Ip_Init ( INST_FLEXCAN_0 , & FlexCAN_State0 , & FlexCAN_Config0 ) ; FlexCAN_Ip_SetRxMaskType_Privileged ( INST_FLEXCAN_0 , FLEXCAN_RX_MASK_INDIVIDUAL ) ; FlexCAN_Ip_SetRxIndividualMask_Privileged(INST_FLEXCAN_0,RX_MB_IDX,0x0<<18); // 清除掩码寄存器以允许接收所有STDID FlexCAN_Ip_SetStartMode ( INST_FLEXCAN_0 ) ; setupCanXCVR_TJA1153 () ; tx_info.is_polling = FALSE ; tx_info.msg_id_type = FLEXCAN_MSG_ID_STD ; tx_info.data_length = 8 ; tx_info.fd_enable = false ; tx_info.enable_brs = false ; FlexCAN_Ip_ConfigRxMb ( INST_FLEXCAN_0 , RX_MB_IDX , & rx_info , MSG_ID ) ; FlexCAN_Ip_Receive ( INST_FLEXCAN_0 , RX_MB_IDX , & rxData , false ) ; FlexCAN_Ip_Send ( INST_FLEXCAN_0 , TX_MB_IDX , & tx_info , MSG_ID , ( uint8 * ) & dummyData ) ; 当( 1 ) { g_canErrorStatus = FlexCAN_Ip_GetErrorStatus ( INST_FLEXCAN_0 ) ; } 返回0 ; } /* 主程序结束 */ /*! ** @} */ Re: S32K358 EVK board CAN not working 你好@ Yash2530 附件包含我对 RTD 版本 3.0.0 进行的测试。您可以参考 P07。 Re: S32K358 EVK board CAN not working 嗨Senlent , Can 传输 TX 工作正常,我能够从 NXP 接收数据到 Waveshare USB CAN 设备,但 RX 似乎无法工作。 我发送的 id 为 0x001,数据为 01 01 01 01 01 01 01 01。 我是不是漏掉了什么?或者您提供的代码只适用于TX?
View full article