tao_z
2022-06-01 0ff91e66071237834a1501c78648729c8c32f67a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
 * @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);
}