项目介绍、
本次项目使用到的板卡是得捷与EEPW提供的S32K144EVB-Q100开发板和一块自备的MCXN947与LCD。
项目使用到了S32K144的ADC模块采集旋转电位计的电压与板载的一个参考电压值,之后把数据打包到id为0x55的CAN报文中,并通过FlexCAN模块发送。
接收方是恩智浦的MCXN947搭配一个使用Gui Guider设计的图形界面,使用到了FreeRTOS,LVGL和FlexCAN模块。
项目实现了通过旋转电位计来控制图形界面指针变化的效果,实现了数据采集、CAN发送与接收和LVGL图形动态展示的全过程。
系统框图、
简易系统框图如下所示:
运行流程图、
S32K144程序:
首先进行各模块初始化:
/*! * Initialization: * ======================= */ WDOG_disable(); /* Disable WDOG */ SOSC_init_8MHz(); /* Initialize system oscillator for 8 MHz xtal */ SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */ NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */ FLEXCAN0_init(); /* Init FlexCAN0 */ PORT_init(); /* Configure ports */ ADC_init(); /* Init ADC resolution 12 bit
打包ADC数据:
void FLEXCAN0_transmit_msg_ADCValues(uint32_t Val_1, uint32_t Val_2) { /*! Assumption: * ================================= * Message buffer CODE is INACTIVE */ CAN0->IFLAG1 = 0x00000001; /* Clear CAN 0 MB 0 flag without clearing others*/ CAN0->RAMn[ 0*4 + 0] = 0x0C400000 | 8 << CAN_WMBn_CS_DLC_SHIFT; /* MB0 word 0: */ /* EDL,BRS,ESI=0: CANFD not used */ /* CODE=0xC: Activate msg buf to transmit */ /* IDE=0: Standard ID */ /* SRR=1 Tx frame (not req'd for std ID) */ /* RTR = 0: data, not remote tx request frame */ /* DLC = 8 bytes */ CAN0->RAMn[ 0*4 + 1] = 0x15540000; /* MB0 word 1: Tx msg with STD ID 0x555 */ CAN0->RAMn[ 0*4 + 2] = Val_1; /* MB0 word 2: data word 0 */ CAN0->RAMn[ 0*4 + 3] = Val_2; /* MB0 word 3: data word 1 */ }
循环发送:
for(;;){ convertAdcChan(12); /* Convert Channel AD12 to pot on EVB */ while(adc_complete()==0){} /* Wait for conversion complete flag */ adcResultInMv = read_adc_chx(); /* Get channel's conversion results in mv */ if (adcResultInMv > 3750) { /* If result > 3.75V */ PTD->PSOR |= 1<<PTD0 | 1<<PTD16; /* turn off blue, green LEDs */ PTD->PCOR |= 1<<PTD15; /* turn on red LED */ } else if (adcResultInMv > 2500) { /* If result > 2.50V */ PTD->PSOR |= 1<<PTD0 | 1<<PTD15; /* turn off blue, red LEDs */ PTD->PCOR |= 1<<PTD16; /* turn on green LED */ } else if (adcResultInMv >1250) { /* If result > 1.25V */ PTD->PSOR |= 1<<PTD15 | 1<<PTD16; /* turn off red, green LEDs */ PTD->PCOR |= 1<<PTD0; /* turn on blue LED */ } else { PTD->PSOR |= 1<<PTD0 | 1<< PTD15 | 1<<PTD16; /* Turn off all LEDs */ } convertAdcChan(29); /* Convert chan 29, Vrefsh */ while(adc_complete()==0){} /* Wait for conversion complete flag */ adcResultInMvVref = read_adc_chx(); /* Get channel's conversion results in mv */ FLEXCAN0_transmit_msg_ADCValues(adcResultInMv, adcResultInMvVref); delayCycles(0xEFFFFF); }
在开发过程中,S32K144发送到CAN报文先用USB-CAN工具接收一下,查看通信是否正常。
MCXN947程序:
这部分的细节可以参考帖子:【S32K144EVB-Q100评测】-CAN报文接收方GUI设计 https://forum.eepw.com.cn/thread/390387/1
设计了两个任务,一个用于跑gui,一个用于接收can报文。优先级设计的是flexcan的优先级要高。
/* Init smartdma. */ BOARD_InitSmartDMA(); stat = xTaskCreate(AppTask, "lvgl", configMINIMAL_STACK_SIZE + 800, NULL, tskIDLE_PRIORITY + 2, NULL); if (pdPASS != stat) { PRINTF("Failed to create lvgl task"); while (1) ; } stat = xTaskCreate(AppFlexCan, "flexcan", configMINIMAL_STACK_SIZE + 200, NULL, tskIDLE_PRIORITY + 1, NULL); if (pdPASS != stat) { PRINTF("Failed to create flexcan task"); while (1) ; }else{ PRINTF("Good, success to create flexcan task"); } vTaskStartScheduler();
成果实物图
系统中黄色的开发板上本次测评的S32K144EVB-Q100,黑色开发板为MCXN947搭配一个LCD屏幕。
两块主控板都是挂载到CAN总线上。
项目视频链接:优酷 https://v.youku.com/video?vid=XNjQ1ODYyMTA5Ng%3D%3D
附往期帖子:
【S32K144EVB-Q100评测】-开箱贴 https://forum.eepw.com.cn/thread/390329/1
【S32K144EVB-Q100评测】-开发环境搭建 https://forum.eepw.com.cn/thread/390330/1
【S32K144EVB-Q100评测】-CAN测试 https://forum.eepw.com.cn/thread/390379/1
【S32K144EVB-Q100评测】-CAN报文接收方GUI设计 https://forum.eepw.com.cn/thread/390387/1