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