主题中讨论的其他器件:MSP-EXP432E401Y
我关于此主题的第一个主题已锁定、但此问题未解决。
我已经使用从 CCS 应用商店下载的“cangpioxrx”示例程序在 MSP-EXP432E401Y Launchpad 板上重现了该问题。
CAN 驱动程序是 SimpleLink SDK 中的库存驱动程序、我们未对其进行修改。
我已修改此示例应用以将 UART7用于控制台。
连接到引脚 PC4和 PC5的 RS-232转换器的逻辑电平提供串行输出。
这样做的原因是需要多次循环电源以捕获故障模式、而这种循环电源会断开调试器串行端口。
固态常闭继电器用于循环供电。
如果程序可以将其添加到 GPIO_WRITE 行(CONFIG_GPIO_CYCLEPOWER、1);
它不在故障模式下,然后重新启动电源。
PA7 GPIO 控制继电器输入。
继电器为 Crydom MPDCD3-B、它会中断我断开的 USB 电缆中的5V 线路。
在故障模式下、它会一直卡在 CAN_open 中、如下面的调用堆栈所示。 CAN0PDS 为4。
在3458引导时、故障模式发生5次、故障率为0.145%。
调试器中的“系统重置”不会清除故障模式。 就我所能说的、只有循环通电才能实现这一目的。
终端输出:
==按 USR_SW1发送消息=
CAN0PDS 值@1 00000004
CAN0PDS 值@2 00000004
CAN0PDS 值@3 0000003F
==按 USR_SW1发送消息=
CAN0PDS 值@1 00000004
CAN0PDS 值@2 00000004
CAN0PDS 值@3 0000003F
==按 USR_SW1发送消息=
CAN0PDS 值@1 00000004
CAN0PDS 值@2 00000004
显示故障模式的方法不是将其设为“CAN0PDS Value @3 0000003F”
电源保持开启状态、因为它卡在 CAN_open 中、如图所示。
void * mainThread (void * arg0) { pthread_t 线程0; pthread_attr_t attrs; struct sched_param primParam; 内部 REC; 内部 detachState; 内部32_t 状态; /*跟踪发送的帧*/ 帧 Sent = 0; /*调用驱动程序初始化函数*/ GPIO_init(); // CAN_init(); display_init(); /* *打开 CAN 实例。 * CAN_PARAMS filterID 和 filterMask 决定要接收的消息。 * // GEHC JCP 稍后移动此文件,使其不会在故障模式下挂起 // CAN_Params canParams; // CAN_Params_init (&canParams); // canParams.filterID = 0x001; // canParams.filterMask = 0x001; // CAN = CAN_open (CONFIG_CAN_0、&canParams); /*打开 UART 的显示实例*/ Display_Params displayParams; Display_Params_init (&displayParams); Display = Display_open (Display_Type_UART、&displayParams); display_print0 (display、0、0、"==按 USR_SW1发送消息=""); /*配置 LED 和按钮引脚*/ GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH); GPIO_setConfig (CONFIG_GPIO_button_1、 GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING); /* *创建同步信标;TX 显示将在此等待 *信号量、直到按下 GPIO 按钮。 * 状态= SEM_INIT (&txSem、0、0); if (status!= 0){ Display_printf (display、0、0、"创建 txSem\n"Error); while (1); } /*安装按钮回调*/ GPIO_setCallback (CONFIG_GPIO_button_1、gpioButtonFxn); /*启用中断*/ GPIO_enableInt (CONFIG_GPIO_button_1); /*创建应用程序线程*/ pthread_attr_init (atttrs); priParam.sched_priority = 1; pthread_attr_setschedparam (&attrs、&priParam); detachState = pthread_create_detached; retc = pthread_attr_setdetachstate (&attrs、detachState); retc |= pthread_attr_setstacksize (&attrs、THREADSTACKSIZE); retc |= pthread_create (&thread0、&attrs、txThread、NULL); 如果(retc!= 0){ /* pthread_create()失败*/ while (1); } /* *每次接收到 CAN 帧时切换 Board_GPIO_LED0。 *还将接收到的 CAN 帧 ID 打印出到 UART 显示屏。 * CAN_Params filterID、filterMask 控制 CAN_Read 完成的频率。 * CAN_Frame canFrame ={0}; // GEHC JCP char jpstr[64]; unsigned long CAN0PDS =*(unsigned long*)(0x400FE298)); // TI 没有此寄存器的定义 sprintf (jpstr、"CAN0PDS 值@1 %08X"、CAN0PDS); display_print0 (display、0、0、jpstr); CAN_init(); CAN0PDS =*((unsigned long*)(0x400FE298)); sprintf (jpstr、"CAN0PDS 值@2 %08X"、CAN0PDS); display_print0 (display、0、0、jpstr); CAN_Params 和 CANParams; CAN_Params_init (&canParams); canParams.filterID = 0x001; canParams.filterMask = 0x001; CAN = CAN_OPEN (CONFIG_CAN_0、&CANParams); CAN0PDS =*((unsigned long*)(0x400FE298)); //不会使其处于故障模式 sprintf (jpstr、"CAN0PDS 值@3 %08X"、CAN0PDS); display_print0 (display、0、0、jpstr); Task_sleep (1000); GPIO_WRITE (CONFIG_GPIO_CYCLEPOWER、1); //\ GEHC JCP while (1){ CAN_Read (CAN、&canFrame、sizeof (canFrame)); Display_Print1 (显示、0、0、 "消息已接收。 接收到的帧 ID:0x%3x"、 canFrame.id); GPIO_TOGGLE (CONFIG_GPIO_LED_0); } }
