1 #ifndef __SWM341_CAN_H__
2 #define __SWM341_CAN_H__
3 
4 
5 typedef struct {
6     uint8_t  Mode;              //CAN_MODE_NORMAL、CAN_MODE_LISTEN、CAN_MODE_SELFTEST
7     uint8_t  CAN_bs1;           //CAN_BS1_1tq、CAN_BS1_2tq、... ... 、CAN_BS1_16tq
8     uint8_t  CAN_bs2;           //CAN_BS2_1tq、CAN_BS2_2tq、... ... 、CAN_BS2_8tq
9     uint8_t  CAN_sjw;           //CAN_SJW_1tq、CAN_SJW_2tq、CAN_SJW_3tq、CAN_SJW_4tq
10     uint32_t Baudrate;          //波特率,即位传输速率,取值1--1000000
11     uint8_t  RXNotEmptyIEn;     //接收FIFO非空,有数据可读
12     uint8_t  ArbitrLostIEn;     //控制器丢失仲裁变成接收方
13     uint8_t  ErrPassiveIEn;     //接收/发送错误计数值达到127
14 } CAN_InitStructure;
15 
16 
17 #define CAN_MODE_NORMAL     0   //常规模式
18 #define CAN_MODE_LISTEN     1   //监听模式
19 #define CAN_MODE_SELFTEST   2   //自测模式
20 
21 #define CAN_BS1_1tq         0
22 #define CAN_BS1_2tq         1
23 #define CAN_BS1_3tq         2
24 #define CAN_BS1_4tq         3
25 #define CAN_BS1_5tq         4
26 #define CAN_BS1_6tq         5
27 #define CAN_BS1_7tq         6
28 #define CAN_BS1_8tq         7
29 #define CAN_BS1_9tq         8
30 #define CAN_BS1_10tq        9
31 #define CAN_BS1_11tq        10
32 #define CAN_BS1_12tq        11
33 #define CAN_BS1_13tq        12
34 #define CAN_BS1_14tq        13
35 #define CAN_BS1_15tq        14
36 #define CAN_BS1_16tq        15
37 
38 #define CAN_BS2_1tq         0
39 #define CAN_BS2_2tq         1
40 #define CAN_BS2_3tq         2
41 #define CAN_BS2_4tq         3
42 #define CAN_BS2_5tq         4
43 #define CAN_BS2_6tq         5
44 #define CAN_BS2_7tq         6
45 #define CAN_BS2_8tq         7
46 
47 #define CAN_SJW_1tq         0
48 #define CAN_SJW_2tq         1
49 #define CAN_SJW_3tq         2
50 #define CAN_SJW_4tq         3
51 
52 #define CAN_FRAME_STD       0
53 #define CAN_FRAME_EXT       1
54 
55 #define CAN_FILTER_1        0
56 #define CAN_FILTER_2        1
57 #define CAN_FILTER_3        2
58 #define CAN_FILTER_4        3
59 #define CAN_FILTER_5        4
60 #define CAN_FILTER_6        5
61 #define CAN_FILTER_7        6
62 #define CAN_FILTER_8        7
63 #define CAN_FILTER_9        8
64 #define CAN_FILTER_10       9
65 #define CAN_FILTER_11       10
66 #define CAN_FILTER_12       11
67 #define CAN_FILTER_13       12
68 #define CAN_FILTER_14       13
69 #define CAN_FILTER_15       14
70 #define CAN_FILTER_16       15
71 
72 
73 /* Interrupt Type */
74 #define CAN_IT_RX_NOTEMPTY  (0x01 << 0)     //RX Buffer Not Empty
75 #define CAN_IT_RX_OVERFLOW  (0x01 << 3)     //RX Buffer Overflow
76 #define CAN_IT_TX_EMPTY     (0x01 << 1)     //TX Buffer Empty
77 #define CAN_IT_ARBLOST      (0x01 << 6)     //Arbitration lost
78 #define CAN_IT_ERR          (0x01 << 7)
79 #define CAN_IT_ERR_WARN     (0x01 << 2)     //TXERR/RXERR计数值达到Error Warning Limit
80 #define CAN_IT_ERR_PASS     (0x01 << 5)     //TXERR/RXERR计数值达到127
81 #define CAN_IT_WAKEUP       (0x01 << 4)
82 
83 
84 
85 typedef struct {
86     uint32_t id;        //消息ID
87     uint8_t  format;    //帧格式:CAN_FRAME_STD、CAN_FRAME_EXT
88     uint8_t  remote;    //消息是否为远程帧
89     uint8_t  size;      //接收到的数据个数
90     uint8_t  data[8];   //接收到的数据
91 } CAN_RXMessage;
92 
93 
94 void CAN_Init(CAN_TypeDef * CANx, CAN_InitStructure * initStruct);
95 void CAN_Open(CAN_TypeDef * CANx);
96 void CAN_Close(CAN_TypeDef * CANx);
97 
98 void CAN_Transmit(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint8_t data[], uint32_t size, uint32_t once);
99 void CAN_TransmitRequest(CAN_TypeDef * CANx, uint32_t format, uint32_t id, uint32_t once);
100 void CAN_Receive(CAN_TypeDef * CANx, CAN_RXMessage *msg);
101 
102 uint32_t CAN_TXComplete(CAN_TypeDef * CANx);
103 uint32_t CAN_TXSuccess(CAN_TypeDef * CANx);
104 
105 void CAN_AbortTransmit(CAN_TypeDef * CANx);
106 
107 uint32_t CAN_TXBufferReady(CAN_TypeDef * CANx);
108 uint32_t CAN_RXDataAvailable(CAN_TypeDef * CANx);
109 
110 void CAN_SetBaudrate(CAN_TypeDef * CANx, uint32_t baudrate, uint32_t CAN_bs1, uint32_t CAN_bs2, uint32_t CAN_sjw);
111 
112 void CAN_SetFilter32b(CAN_TypeDef * CANx, uint32_t filter, uint32_t check, uint32_t mask);
113 void CAN_SetFilter16b(CAN_TypeDef * CANx, uint32_t filter, uint16_t check1, uint16_t mask1, uint16_t check2, uint16_t mask2);
114 
115 void CAN_INTEn(CAN_TypeDef * CANx, uint32_t it);
116 void CAN_INTDis(CAN_TypeDef * CANx, uint32_t it);
117 void CAN_INTClr(CAN_TypeDef * CANx, uint32_t it);
118 uint32_t CAN_INTStat(CAN_TypeDef * CANx);
119 
120 
121 #endif //__SWM341_CAN_H__
122