#ifndef CAN_H #define CAN_H /***************************************************************************** * Simple CAN Library * * #define CAN_INTERRUPT 1 // set this to enable interrupt driven * // and buffering version * #define CAN_RX_BUFFER_SIZE 2 // only used for Interrupt * #define CAN_TX_BUFFER_SIZE 2 // only used for Interrupt */ /***************************************************************************** * Types */ #include typedef unsigned char can_addr_t; typedef unsigned char can_port_t; typedef uint16_t can_channel_t; typedef uint8_t can_subchannel_t; typedef struct { uint32_t id; uint8_t dlc; uint8_t data[8]; } can_message_raw; typedef struct { can_addr_t addr_src; can_addr_t addr_dst; can_port_t port_src; can_port_t port_dst; unsigned char dlc; unsigned char data[8]; } can_message; typedef struct { can_channel_t channel; can_subchannel_t subchannel; can_addr_t addr_src; can_addr_t addr_dst; uint8_t dlc; uint8_t data[8]; } can_message_v2; typedef enum { normal, mode_sleep, loopback, listenonly, config } can_mode_t; /***************************************************************************** * Global variables */ #ifdef CAN_HANDLEERROR extern unsigned char can_error; #endif /***************************************************************************** * Management */ void can_init(); void can_setfilter(); void can_setmode( can_mode_t); void can_setled(unsigned char led, unsigned char state); /***************************************************************************** * Sending */ can_message * can_buffer_get(); void can_transmit(can_message *msg); /***************************************************************************** * Receiving */ can_message *can_get(); can_message *can_get_nb(); // this is only needed for Interrupt driven Version #ifndef CAN_INTERRUPT // # define can_free(m) void can_free(can_message * msg); #else void can_free(can_message * msg); #endif /***************************************************************************** * Sending */ can_message_raw * can_buffer_get_raw(); void can_transmit_raw(can_message_raw *msg); /***************************************************************************** * Receiving */ can_message_raw *can_get_raw(); can_message_raw *can_get_raw_nb(); // this is only needed for Interrupt driven Version #ifndef CAN_INTERRUPT // # define can_free(m) void can_free_raw(can_message_raw * msg); #else void can_free_raw(can_message_raw * msg); #endif /***************************************************************************** * Sending */ void can_transmit_v2(can_message_v2 *msg); /***************************************************************************** * Receiving */ can_message_v2 *can_get_v2_nb(); void can_free_v2(can_message_v2 *msg); #endif