Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
240 andfri 1
#ifndef CAN_H_
2
#define CAN_H_
3
 
4
/*-----------------------------------------------------------------------------
5
 * Includes
6
 *---------------------------------------------------------------------------*/
7
#include <inttypes.h>
8
 
9
 
10
/*-----------------------------------------------------------------------------
11
 * Type Definitions
12
 *---------------------------------------------------------------------------*/
13
 
14
 
15
/**
16
 * CAN Return Type. Most CAN functions return one of these.
17
 */
18
typedef enum {
19
    CAN_FAIL = -1,                  /* The function failed */
20
    CAN_OK = 1,                     /* The function succeeded */
21
 
22
    CAN_MSG_AVAILABLE = 2,          /* Messsages are available */
23
    CAN_NO_MSG_AVAILABLE = -2,      /* Messages are NOT available */
24
 
25
    //CAN_CTRLERROR = -4
26
} Can_Return_t;
27
 
28
 
29
/**
30
 * CAN Message Type. Stores a complete CAN frame.
31
 */
32
typedef struct {
33
    /*
34
     * ID section. Contains either 29bit ID or 11bit ID (depending on ExtendedFlag).
35
     */
36
    uint32_t Id;
37
 
38
    /*
39
     * DLC section. Contains the data length expressed in number of bytes. Range [0,8].
40
     */
41
    uint8_t DataLength;
42
 
43
    /**
44
     * Extended frame flag. Set to 1 if the ID is 29bit, or 0 if it is 11bit.
45
     */
46
    uint8_t ExtendedFlag;
47
 
48
    /**
49
     * Remote frame flag. Set to 1 if the frame is a remote frame. 0 otherwise.
50
     */
51
    uint8_t RemoteFlag;
52
 
53
    /*
54
     * DATA section. Contains the 8 data bytes.
55
     */
56
    union {
57
        /* read as 8bit unsigned data */
58
        uint8_t bytes[8];
59
 
60
        /* read as 16bit unsigned data */
61
        uint16_t words[4];
62
 
63
        /* read as 32bit unsigned data */
64
        uint32_t dwords[2];
65
    } Data;
66
} Can_Message_t;
67
 
253 andfri 68
//---------------------------------------------------------------------------
69
// CAN ID definitions
240 andfri 70
 
253 andfri 71
#define CAN_MASK_CLASS      0x1E000000
72
#define CAN_SHIFT_CLASS     25
73
//------------------------------------
74
#define CAN_NMT             0x00UL
75
#define CAN_MASK_NMT_TYPE   0x01F00000
76
#define CAN_SHIFT_NMT_TYPE  20
77
#define CAN_MASK_NMT_NID    0x000F0000
78
#define CAN_SHIFT_NMT_NID   16
79
#define CAN_MASK_NMT_SID    0x0000FF00
80
#define CAN_SHIFT_NMT_SID   8
81
#define CAN_MASK_NMT_RID    0x000000FF
82
#define CAN_SHIFT_NMT_RID   0
83
#define CAN_NMT_RESET       0x00UL
84
#define CAN_NMT_BIOS_START  0x01UL  //D0: VER7:0, D1:VER15:8, D2: 0 if no app, >0 if app
85
#define CAN_NMT_PGM_START   0x02UL  //D0: ADR7:0, D1:ADR15:8, D2:ADR23:16, D3:ADR31:24
86
#define CAN_NMT_PGM_DATA    0x03UL  //D0: OFS7:0, D1: OFS15:8, D(n+2): DATAn7:0 [n=0..x] [x=0..5]
87
#define CAN_NMT_PGM_END     0x04UL  //D0: CRC7:0, D1: CRC15:8
88
#define CAN_NMT_PGM_ACK     0x05UL  //D0: OFS7:0, D1: OFS15:8
89
#define CAN_NMT_PGM_NACK    0x06UL  //D0: OFS7:0, D1: OFS15:8
90
#define CAN_NMT_START_APP   0x07UL
91
#define CAN_NMT_APP_START   0x08UL  //D0: ID7:0, D1:ID15:8, D2: VER7:0, D3:VER15:8
92
#define CAN_NMT_HEARTBEAT   0x09UL
93
//------------------------------------
94
#define CAN_SNS             0x02UL
95
#define CAN_MASK_SNS_FUNCC  0x01FF8000
96
#define CAN_SHIFT_SNS_FUNCC 15
97
#define CAN_MASK_SNS_NID    0x00007E00
98
#define CAN_SHIFT_SNS_NID   9
99
#define CAN_MASK_SNS_SID    0x000001FF
100
#define CAN_SHIFT_SNS_SID   0
101
//------------------------------------
102
#define CAN_PKT             0x0c000000
103
//------------------------------------
104
#define CAN_CON             0x10000000
105
//------------------------------------
106
#define CAN_TST             0x1E000000
107
//------------------------------------
240 andfri 108
 
109
#endif