#ifndef CAN_H #define CAN_H #include #include #include #include "pinout.h" //---------------------------------------------------------------------------- // CLASS //---------------------------------------------------------------------------- class CANClass { public: typedef struct { uint16_t id; struct { int8_t rtr : 1; uint8_t length : 4; } header; uint8_t data[8]; } msgCAN; void begin(uint16_t speed); uint8_t send(msgCAN *message); uint8_t ReadFromDevice(msgCAN *message); uint8_t CheckNew(void); void SetMode(uint8_t mode); void SetFilters(uint16_t *Filters,uint16_t *Masks); //Buffer void store(msgCAN *message); uint8_t available(void); void read(msgCAN *message); private: uint8_t spi_putc( uint8_t data ); void mcp2515_write_register( uint8_t adress, uint8_t data ); uint8_t mcp2515_read_status(uint8_t type); void mcp2515_bit_modify(uint8_t adress, uint8_t mask, uint8_t data); uint8_t mcp2515_check_free_buffer(void); uint8_t mcp2515_read_register(uint8_t adress); #define RX_CAN_BUFFER_SIZE 10 typedef struct { msgCAN buffer[RX_CAN_BUFFER_SIZE]; uint8_t head; uint8_t tail; }RX_CAN_BUFFER; RX_CAN_BUFFER _CAN_RX_BUFFER; }; //---------------------------------------------------------------------------- // VARIABLES //---------------------------------------------------------------------------- extern CANClass CAN; extern CANClass::msgCAN CAN_TxMsg; extern CANClass::msgCAN CAN_RxMsg; //---------------------------------------------------------------------------- // MACROS //---------------------------------------------------------------------------- #define true 1 #define false 0 #define True 1 #define False 0 #define RESET(x) _XRS(x) #define SET(x) _XS(x) #define TOGGLE(x) _XT(x) #define SET_OUTPUT(x) _XSO(x) #define SET_INPUT(x) _XSI(x) #define IS_SET(x) _XR(x) #define PORT(x) _port2(x) #define DDR(x) _ddr2(x) #define PIN(x) _pin2(x) #define _XRS(x,y) PORT(x) &= ~(1<