和田地区网站建设_网站建设公司_加载速度优化_seo优化
2026/3/2 17:12:06 网站建设 项目流程

一、MCMCAN介绍

fSYN is supplied from fMCANH and fASYN is supplied from fMCAN from CCU. fSYN is used as the clock source for Register and RAM interface,fASYN is used to generate the nominal and fast CAN FD baudrates. It is recommended to use fASYN as 80, 40, 20 MHz from the Peripheral clock or also from fOSC , in order to achieve commonly used nominal and fast CAN FD baudrates. The condition that fSYN >= fASYN is essential for proper functioning of MCMCAN.

借用TC387的例程,但例程中未设置波特率,未变更CAN引脚,使用的是默认配500K和1M的波特器应该是CANFD测试使用的。需增加如下代码才能设置波特以及变更引脚

1、假如使用P02.0和P02.1引脚用为CAN引脚,先定义引脚如下,后面会调用。

IFX_CONST IfxCan_Can_Pins can02_pins = { &IfxCan_TXD00_P02_0_OUT, IfxPort_OutputMode_pushPull, &IfxCan_RXD00A_P02_1_IN, IfxPort_InputMode_pullUp, IfxPort_PadDriver_cmosAutomotiveSpeed4 };

2、初始化中调用引脚,以及设置波特率

g_mcmcan.canNodeConfig.baudRate.baudrate = 250000; //250KBaud即设置波特率

g_mcmcan.canNodeConfig.pins = &can02_pins;//即更换CAN引脚

void initCAN0(void) { /*******CAN module configuration and initialization*******/ IfxCan_Can_initModuleConfig(&g_mcmcan.canConfig, &MODULE_CAN0); IfxCan_Can_initModule(&g_mcmcan.canModule, &g_mcmcan.canConfig); /*******CAN00 node configuration and initialization*******/ IfxCan_Can_initNodeConfig(&g_mcmcan.canNodeConfig, &g_mcmcan.canModule); g_mcmcan.canNodeConfig.nodeId = IfxCan_NodeId_0; g_mcmcan.canNodeConfig.clockSource = IfxCan_ClockSource_both; g_mcmcan.canNodeConfig.frame.type = IfxCan_FrameType_transmitAndReceive; g_mcmcan.canNodeConfig.frame.mode = IfxCan_FrameMode_standard; //Classic CAN g_mcmcan.canNodeConfig.txConfig.txMode = IfxCan_TxMode_dedicatedBuffers;//IfxCan_MessageIdLength_extended;//IfxCan_TxMode_dedicatedBuffers; g_mcmcan.canNodeConfig.txConfig.dedicatedTxBuffersNumber = 255; g_mcmcan.canNodeConfig.txConfig.txBufferDataFieldSize = IfxCan_DataFieldSize_8; g_mcmcan.canNodeConfig.rxConfig.rxMode = IfxCan_RxMode_dedicatedBuffers; g_mcmcan.canNodeConfig.rxConfig.rxBufferDataFieldSize = IfxCan_DataFieldSize_8; g_mcmcan.canNodeConfig.filterConfig.extendedListSize = 255; //Extended Frame g_mcmcan.canNodeConfig.filterConfig.messageIdLength = IfxCan_MessageIdLength_extended; g_mcmcan.canNodeConfig.messageRAM.extendedFilterListStartAddress = 0x100; //Extended Frame g_mcmcan.canNodeConfig.messageRAM.rxBuffersStartAddress = 0x200; g_mcmcan.canNodeConfig.messageRAM.txBuffersStartAddress = 0x400; g_mcmcan.canNodeConfig.messageRAM.baseAddress = MODULE_CAN0_RAM + NODE0_RAM_OFFSET; g_mcmcan.canNodeConfig.baudRate.baudrate = 250000; //250KBaud //transmit interrupt g_mcmcan.canNodeConfig.interruptConfig.transmissionCompletedEnabled = TRUE; g_mcmcan.canNodeConfig.interruptConfig.traco.priority = ISR_PRIORITY_CAN_TX; g_mcmcan.canNodeConfig.interruptConfig.traco.interruptLine = IfxCan_InterruptLine_0; g_mcmcan.canNodeConfig.interruptConfig.traco.typeOfService = IfxSrc_Tos_cpu0; //receive interrupt g_mcmcan.canNodeConfig.interruptConfig.messageStoredToDedicatedRxBufferEnabled = TRUE; g_mcmcan.canNodeConfig.interruptConfig.reint.priority = ISR_PRIORITY_CAN_RX; g_mcmcan.canNodeConfig.interruptConfig.reint.interruptLine = IfxCan_InterruptLine_1; g_mcmcan.canNodeConfig.interruptConfig.reint.typeOfService = IfxSrc_Tos_cpu0; //binding pin g_mcmcan.canNodeConfig.pins = &can02_pins; IfxCan_Can_initNode(&g_mcmcan.can00Node, &g_mcmcan.canNodeConfig); /*******CAN filter configuration and initialization*******/ g_mcmcan.canFilter.number = 0; g_mcmcan.canFilter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxBuffer; g_mcmcan.canFilter.id1 = 0x18ff1101; g_mcmcan.canFilter.rxBufferOffset = IfxCan_RxBufferId_0; IfxCan_Can_setExtendedFilter(&g_mcmcan.can00Node, &g_mcmcan.canFilter); g_mcmcan.canFilter.number = 1; g_mcmcan.canFilter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxBuffer; g_mcmcan.canFilter.id1 = 0x18FF1102; g_mcmcan.canFilter.rxBufferOffset = IfxCan_RxBufferId_0; IfxCan_Can_setExtendedFilter(&g_mcmcan.can00Node, &g_mcmcan.canFilter); g_mcmcan.canFilter.number = 2; g_mcmcan.canFilter.elementConfiguration = IfxCan_FilterElementConfiguration_storeInRxBuffer; g_mcmcan.canFilter.id1 = 0x18FF1103; g_mcmcan.canFilter.rxBufferOffset = IfxCan_RxBufferId_0; IfxCan_Can_setExtendedFilter(&g_mcmcan.can00Node, &g_mcmcan.canFilter); }

其中发送函数中需注意:

txData是32位的,所以只需要两组即可发送所有数据。

IfxCan_Can_initMessage(&g_mcmcan.txMsg); g_mcmcan.txMsg.dataLengthCode = IfxCan_DataLengthCode_8;//8 bytes g_mcmcan.txMsg.frameMode = IfxCan_FrameMode_standard; //Classic CAN g_mcmcan.txMsg.bufferNumber = 0; g_mcmcan.txMsg.messageId = 0x0C1E1507; g_mcmcan.txData[0]= RCU_Message1.Engine_Total_Hours; g_mcmcan.txData[1] =(RCU_Message1.Engine_coolant_temperature + 40)| ((RCU_Message1.Engine_Speed*1000/125)<<8) | ((RCU_Message1.Engine_Oil_Pressure/4)<<24); g_mcmcan.txMsg.messageIdLength=IfxCan_MessageIdLength_extended; //Extended Frame while(IfxCan_Status_notSentBusy == IfxCan_Can_sendMessage(&g_mcmcan.can00Node, &g_mcmcan.txMsg, &g_mcmcan.txData[0]) );

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询