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