项目介绍、
本次项目使用到的板卡是得捷与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
我要赚赏金
