summaryrefslogtreecommitdiff
path: root/bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_can.h
blob: 6a239c84b3cc1fdf201be40f5eccd3d6c1832ec3 (plain)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#ifndef __SWM320_CAN_H__
#define __SWM320_CAN_H__

#define CAN_FRAME_STD   0
#define CAN_FRAME_EXT   1

typedef struct
{
    uint8_t  Mode;          //CAN_MODE_NORMAL��CAN_MODE_LISTEN��CAN_MODE_SELFTEST
    uint8_t  CAN_BS1;       //CAN_BS1_1tq��CAN_BS1_2tq��... ... ��CAN_BS1_16tq
    uint8_t  CAN_BS2;       //CAN_BS2_1tq��CAN_BS2_2tq��... ... ��CAN_BS2_8tq
    uint8_t  CAN_SJW;       //CAN_SJW_1tq��CAN_SJW_2tq��CAN_SJW_3tq��CAN_SJW_4tq
    uint32_t Baudrate;      //�����ʣ���λ�������ʣ�ȡֵ1--1000000
    uint8_t  FilterMode;    //CAN_FILTER_16b��CAN_FILTER_32b
    union
    {
        uint32_t FilterMask32b;     //FilterCheck & (~FilterMask) == ID & (~FilterMask)��Messageͨ������
        struct                      // 0 must match    1 don't care
        {
            uint16_t FilterMask16b1;
            uint16_t FilterMask16b2;
        };
    };
    union
    {
        uint32_t FilterCheck32b;
        struct
        {
            uint16_t FilterCheck16b1;
            uint16_t FilterCheck16b2;
        };
    };
    uint8_t  RXNotEmptyIEn;     //����FIFO�ǿգ������ݿɶ�
    uint8_t  RXOverflowIEn;     //����FIFO����������ݶ�ʧ
    uint8_t  ArbitrLostIEn;     //��������ʧ�ٲñ�ɽ��շ�
    uint8_t  ErrPassiveIEn;     //����/���ʹ������ֵ�ﵽ127
} CAN_InitStructure;

#define CAN_MODE_NORMAL     0   //����ģʽ
#define CAN_MODE_LISTEN     1   //����ģʽ
#define CAN_MODE_SELFTEST   2   //�Բ�ģʽ

#define CAN_BS1_1tq         0
#define CAN_BS1_2tq         1
#define CAN_BS1_3tq         2
#define CAN_BS1_4tq         3
#define CAN_BS1_5tq         4
#define CAN_BS1_6tq         5
#define CAN_BS1_7tq         6
#define CAN_BS1_8tq         7
#define CAN_BS1_9tq         8
#define CAN_BS1_10tq        9
#define CAN_BS1_11tq        10
#define CAN_BS1_12tq        11
#define CAN_BS1_13tq        12
#define CAN_BS1_14tq        13
#define CAN_BS1_15tq        14
#define CAN_BS1_16tq        15

#define CAN_BS2_1tq         0
#define CAN_BS2_2tq         1
#define CAN_BS2_3tq         2
#define CAN_BS2_4tq         3
#define CAN_BS2_5tq         4
#define CAN_BS2_6tq         5
#define CAN_BS2_7tq         6
#define CAN_BS2_8tq         7

#define CAN_SJW_1tq         0
#define CAN_SJW_2tq         1
#define CAN_SJW_3tq         2
#define CAN_SJW_4tq         3

#define CAN_FILTER_16b      0   //����16�����
#define CAN_FILTER_32b      1   //һ��32λ������

typedef struct
{
    uint32_t id;        //��ϢID
    uint8_t  remote;    //��Ϣ�Ƿ�ΪԶ��֡
    uint8_t  data[8];   //���յ�������
    uint8_t  size;      //���յ������ݸ���
} CAN_RXMessage;


void CAN_Init(CAN_TypeDef *CANx, CAN_InitStructure *initStruct);
void CAN_Open(CAN_TypeDef *CANx);
void CAN_Close(CAN_TypeDef *CANx);

void CAN_Transmit(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
void CAN_TransmitRequest(CAN_TypeDef *CANx, uint32_t format, uint32_t id, uint32_t once);
void CAN_Receive(CAN_TypeDef *CANx, CAN_RXMessage *msg);

uint32_t CAN_TXComplete(CAN_TypeDef *CANx);
uint32_t CAN_TXSuccess(CAN_TypeDef *CANx);

void CAN_AbortTransmit(CAN_TypeDef *CANx);

uint32_t CAN_TXBufferReady(CAN_TypeDef *CANx);
uint32_t CAN_RXDataAvailable(CAN_TypeDef *CANx);

void CAN_SetBaudrate(CAN_TypeDef *CANx, uint32_t baudrate, uint32_t CAN_BS1, uint32_t CAN_BS2, uint32_t CAN_SJW);

void CAN_SetFilter32b(CAN_TypeDef *CANx, uint32_t check, uint32_t mask);
void CAN_SetFilter16b(CAN_TypeDef *CANx, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);


void CAN_INTRXNotEmptyEn(CAN_TypeDef *CANx);
void CAN_INTRXNotEmptyDis(CAN_TypeDef *CANx);
uint32_t CAN_INTRXNotEmptyStat(CAN_TypeDef *CANx);

void CAN_INTTXBufEmptyEn(CAN_TypeDef *CANx);
void CAN_INTTXBufEmptyDis(CAN_TypeDef *CANx);
uint32_t CAN_INTTXBufEmptyStat(CAN_TypeDef *CANx);

void CAN_INTErrWarningEn(CAN_TypeDef *CANx);
void CAN_INTErrWarningDis(CAN_TypeDef *CANx);
uint32_t CAN_INTErrWarningStat(CAN_TypeDef *CANx);

void CAN_INTRXOverflowEn(CAN_TypeDef *CANx);
void CAN_INTRXOverflowDis(CAN_TypeDef *CANx);
uint32_t CAN_INTRXOverflowStat(CAN_TypeDef *CANx);
void CAN_INTRXOverflowClear(CAN_TypeDef *CANx);

void CAN_INTWakeupEn(CAN_TypeDef *CANx);
void CAN_INTWakeupDis(CAN_TypeDef *CANx);
uint32_t CAN_INTWakeupStat(CAN_TypeDef *CANx);

void CAN_INTErrPassiveEn(CAN_TypeDef *CANx);
void CAN_INTErrPassiveDis(CAN_TypeDef *CANx);
uint32_t CAN_INTErrPassiveStat(CAN_TypeDef *CANx);

void CAN_INTArbitrLostEn(CAN_TypeDef *CANx);
void CAN_INTArbitrLostDis(CAN_TypeDef *CANx);
uint32_t CAN_INTArbitrLostStat(CAN_TypeDef *CANx);

void CAN_INTBusErrorEn(CAN_TypeDef *CANx);
void CAN_INTBusErrorDis(CAN_TypeDef *CANx);
uint32_t CAN_INTBusErrorStat(CAN_TypeDef *CANx);

#endif //__SWM320_CAN_H__