/** * @file main.c * @author Ethan Tao (tzj0429@163.com) * @brief * @version 0.1 * @date 2021-12-12 * * @copyright Copyright (c) 2021 Äþ²¨ÕýÀÊÆû³µÁ㲿¼þÓÐÏÞ¹«Ë¾ * */ #include #include #include #include #include #include "Hal_GPIO.h" #define MCAN_SINGLE_FILTER (0) #define MCAN_DUAL_FILTER (1) #define MCAN_STD_FRAME_MODE (0) #define MCAN_EXT_FRAME_MODE (1) #define MCAN_FILT_MODE (MCAN_DUAL_FILTER) // 0: single filter mode #define MCAN_FRAME_MODE (MCAN_STD_FRAME_MODE) // 0: standard mode extern void Hal_CANConfig(void) { MCAN_InitTypeDef MCAN_InitStruct = {0}; MCAN_FilterDef MCAN_FilterStruct; SIM_SCGC_Cmd(SIM_SCGC_MCAN, ENABLE); MCAN_DeInit(MCAN); MCAN_InitStruct.MCAN_BRP = 1; //²¨ÌØÂÊ·ÖÆµ 3 MCAN_InitStruct.MCAN_SJW = MCAN_SJW_2tq; //ͬ²½Ìø×ª¿í¶È MCAN_InitStruct.MCAN_SAMP = MCAN_SAMPLE_1; //²ÉÑù µÄÑù±¾Êý MCAN_InitStruct.MCAN_TSEG1 = MCAN_TSEG1_11tq; //ʱ¶Î1 λʱ¼äÄÚÈ·¶¨ ʱÖÓÖÜÆÚºÍ²ÉÑùµã (1+11)/(1+11+4)=75% MCAN_InitStruct.MCAN_TSEG2 = MCAN_TSEG2_4tq; //ʱ¶Î2 4 λʱ¼ä = £¨1+ʱ¶Î1+ʱ¶Î2) * ·ÖƵ / f [canclk] =(1+11+4)*(1+1)/216MHz =2000ns fcan =fpll/2/2=64/4=16MHz MCAN_Init(MCAN, &MCAN_InitStruct); //ÏȽøÈ븴λģʽ£¬ÅäÖú㬽øÈ빤×÷ģʽ 500KHZ #if (MCAN_FILT_MODE == MCAN_DUAL_FILTER) MCAN_FilterStruct.MCAN_FiltMode = MCAN_Dual_Filter; #else MCAN_FilterStruct.MCAN_FiltMode = MCAN_Single_Filter; #endif #if (MCAN_FRAME_MODE == MCAN_EXT_FRAME_MODE) MCAN_FilterStruct.MCAN_IDMode = MCAN_Extended_Frame; #elif (MCAN_FRAME_MODE == MCAN_STD_FRAME_MODE) MCAN_FilterStruct.MCAN_IDMode = MCAN_Standard_Frame; #else MCAN_FilterStruct.MCAN_IDMode = MCAN_Custom_Frame; #endif MCAN_FilterStruct.MCAN_DIDAR = 0x742; MCAN_FilterStruct.MCAN_DIDMR = 0x0; // receive can msg id>=0x700 MCAN_FilterStruct.MCAN_IDAR = 0x7DF; MCAN_FilterStruct.MCAN_IDMR = 0x0; MCAN_FilterConfig(MCAN, &MCAN_FilterStruct); MCAN_Enable(MCAN, ENABLE); // mcan ʹÄÜ /* set the normal test mode */ MCAN_SetMode(MCAN, MCAN_NORMALMODE); //Õý³£Ä£Ê½ MCAN_NORMALMODE Hal_SetCanNormalMode(); } /** * @brief * * @param frameformat * @param ID */ extern void CAN_Transimit(MCAN_MsgTypeDef *frame) { MCAN_MsgTypeDef TxMessage = {0}; uint16_t trytime = 100; TxMessage.MCAN_FF = frame->MCAN_FF; //Ö¡¸ñʽ SFF£¬EFF TxMessage.MCAN_RTR = frame->MCAN_RTR; //Êý¾ÝÖ¡ Ô¶³ÌÖ¡ TxMessage.MCAN_DLC = frame->MCAN_DLC; //Êý¾Ý³¤¶È TxMessage.MCAN_ID = frame->MCAN_ID; //Ö¡µÄ±êʶ·û ÊýֵԽС£¬ÓÅÏȼ¶Ô½¸ß memcpy((void *)&TxMessage.MCAN_Data[0], (void *)frame->MCAN_Data, 8); // while(!MCAN_GetStatus(MCAN, MCAN_BusStatus)){}; /* CAN be write only when the transmit buffer released SR.2=1*/ while (!MCAN_GetStatus(MCAN, MCAN_TransBufferStatus) && (--trytime)) // 1:buf release 0:buf locked { // in order to avoid block .set trytime }; if (trytime > 0) // transbuf released , so can send can message { /* write the data to the buffer */ MCAN_LoadTransmitData(MCAN, &TxMessage); //Ö¡´«Êä /* set the transmission Request */ MCAN_SetCmd(MCAN, MCAN_TransmissionRequest); //´«ÊäÇëÇó MCAN_TransmissionRequest /* wait SR.5=1*/ while (MCAN_GetStatus(MCAN, MCAN_TransmitStatus)) { }; //·¢ËÍ״̬ 0 } // /* wait transfer completed,the transmit buffer released SR.2=1*/ // while (!MCAN_GetStatus(MCAN, MCAN_TransBufferStatus)) // { // }; //·¢ËÍ»º³åÇø×´Ì¬ 1 // /* wait SR.3=1*/ // while (!MCAN_GetStatus(MCAN, MCAN_TransCompleteStatus)) // { // }; // ´«ÊäÍê³É״̬ 1 } extern void Hal_StopCanTx(void) { MCAN_SetCmd(MCAN, MCAN_AbortTransmission); }