/**
|
* @file main.c
|
* @author Ethan Tao (tzj0429@163.com)
|
* @brief
|
* @version 0.1
|
* @date 2021-12-12
|
*
|
* @copyright Copyright (c) 2021 Äþ²¨ÕýÀÊÆû³µÁ㲿¼þÓÐÏÞ¹«Ë¾
|
*
|
*/
|
#include <string.h>
|
#include <xl_gpio.h>
|
#include <xl_uart.h>
|
#include <xl_mcan.h>
|
#include <xl_sim.h>
|
#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);
|
}
|