Sample code for Arduino CAN
Dependencies: mbed
arduinoCAN.h@0:6ed8574c6258, 2016-02-29 (annotated)
- Committer:
- jedh
- Date:
- Mon Feb 29 19:33:12 2016 +0000
- Revision:
- 0:6ed8574c6258
Arduino CAN
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jedh | 0:6ed8574c6258 | 1 | /*! \file CAN.h |
jedh | 0:6ed8574c6258 | 2 | \brief Library for managing CAN-bus modules |
jedh | 0:6ed8574c6258 | 3 | |
jedh | 0:6ed8574c6258 | 4 | Copyright (C) 2011 Libelium Comunicaciones Distribuidas S.L. |
jedh | 0:6ed8574c6258 | 5 | http://www.libelium.com |
jedh | 0:6ed8574c6258 | 6 | |
jedh | 0:6ed8574c6258 | 7 | This program is free software: you can redistribute it and/or modify |
jedh | 0:6ed8574c6258 | 8 | it under the terms of the GNU Lesser General Public License as published by |
jedh | 0:6ed8574c6258 | 9 | the Free Software Foundation, either version 2.1 of the License, or |
jedh | 0:6ed8574c6258 | 10 | (at your option) any later version. |
jedh | 0:6ed8574c6258 | 11 | |
jedh | 0:6ed8574c6258 | 12 | This program is distributed in the hope that it will be useful, |
jedh | 0:6ed8574c6258 | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
jedh | 0:6ed8574c6258 | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
jedh | 0:6ed8574c6258 | 15 | GNU Lesser General Public License for more details. |
jedh | 0:6ed8574c6258 | 16 | |
jedh | 0:6ed8574c6258 | 17 | You should have received a copy of the GNU Lesser General Public License |
jedh | 0:6ed8574c6258 | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
jedh | 0:6ed8574c6258 | 19 | |
jedh | 0:6ed8574c6258 | 20 | Version: 0.3 |
jedh | 0:6ed8574c6258 | 21 | Design: David Gascón |
jedh | 0:6ed8574c6258 | 22 | Implementation: Luis Antonio Martín Nuez |
jedh | 0:6ed8574c6258 | 23 | |
jedh | 0:6ed8574c6258 | 24 | */ |
jedh | 0:6ed8574c6258 | 25 | |
jedh | 0:6ed8574c6258 | 26 | /*! \def WaspCAN_h |
jedh | 0:6ed8574c6258 | 27 | \brief The library flag |
jedh | 0:6ed8574c6258 | 28 | */ |
jedh | 0:6ed8574c6258 | 29 | |
jedh | 0:6ed8574c6258 | 30 | #ifndef ARDUINOCAN_h |
jedh | 0:6ed8574c6258 | 31 | #define ARDUINOCAN_h |
jedh | 0:6ed8574c6258 | 32 | |
jedh | 0:6ed8574c6258 | 33 | |
jedh | 0:6ed8574c6258 | 34 | /****************************************************************************** |
jedh | 0:6ed8574c6258 | 35 | * Includes |
jedh | 0:6ed8574c6258 | 36 | ******************************************************************************/ |
jedh | 0:6ed8574c6258 | 37 | |
jedh | 0:6ed8574c6258 | 38 | |
jedh | 0:6ed8574c6258 | 39 | |
jedh | 0:6ed8574c6258 | 40 | /****************************************************************************** |
jedh | 0:6ed8574c6258 | 41 | * Definitions & Declarations |
jedh | 0:6ed8574c6258 | 42 | ******************************************************************************/ |
jedh | 0:6ed8574c6258 | 43 | |
jedh | 0:6ed8574c6258 | 44 | //CAN-bus connection pins |
jedh | 0:6ed8574c6258 | 45 | |
jedh | 0:6ed8574c6258 | 46 | #define CAN_CS 6 |
jedh | 0:6ed8574c6258 | 47 | #define CAN_INT 4 |
jedh | 0:6ed8574c6258 | 48 | |
jedh | 0:6ed8574c6258 | 49 | //MCP2515 Opcodes |
jedh | 0:6ed8574c6258 | 50 | |
jedh | 0:6ed8574c6258 | 51 | #define SPI_RESET 0xC0 |
jedh | 0:6ed8574c6258 | 52 | #define SPI_READ 0x03 |
jedh | 0:6ed8574c6258 | 53 | #define SPI_READ_RX 0x90 |
jedh | 0:6ed8574c6258 | 54 | #define SPI_WRITE 0x02 |
jedh | 0:6ed8574c6258 | 55 | #define SPI_WRITE_TX 0x40 |
jedh | 0:6ed8574c6258 | 56 | #define SPI_RTS 0x80 |
jedh | 0:6ed8574c6258 | 57 | #define SPI_READ_STATUS 0xA0 |
jedh | 0:6ed8574c6258 | 58 | #define SPI_RX_STATUS 0xB0 |
jedh | 0:6ed8574c6258 | 59 | #define SPI_BIT_MODIFY 0x05 |
jedh | 0:6ed8574c6258 | 60 | |
jedh | 0:6ed8574c6258 | 61 | #define LISTEN_ONLY_MODE 0x01 |
jedh | 0:6ed8574c6258 | 62 | #define LOOPBACK_MODE 0x02 |
jedh | 0:6ed8574c6258 | 63 | #define SLEEP_MODE 0x03 |
jedh | 0:6ed8574c6258 | 64 | #define NORMAL_MODE 0x04 |
jedh | 0:6ed8574c6258 | 65 | |
jedh | 0:6ed8574c6258 | 66 | /**************************************************************************** |
jedh | 0:6ed8574c6258 | 67 | MCP2515 REGISTERS |
jedh | 0:6ed8574c6258 | 68 | ****************************************************************************/ |
jedh | 0:6ed8574c6258 | 69 | |
jedh | 0:6ed8574c6258 | 70 | //Message acceptance filters registers - Buffer 0 |
jedh | 0:6ed8574c6258 | 71 | |
jedh | 0:6ed8574c6258 | 72 | #define RXF0SIDH 0x00 |
jedh | 0:6ed8574c6258 | 73 | #define RXF0SIDL 0x01 |
jedh | 0:6ed8574c6258 | 74 | #define RXF0EID8 0x02 |
jedh | 0:6ed8574c6258 | 75 | #define RXF0EID0 0x03 |
jedh | 0:6ed8574c6258 | 76 | #define RXF1SIDH 0x04 |
jedh | 0:6ed8574c6258 | 77 | #define RXF1SIDL 0x05 |
jedh | 0:6ed8574c6258 | 78 | #define RXF1EID8 0x06 |
jedh | 0:6ed8574c6258 | 79 | #define RXF1EID0 0x07 |
jedh | 0:6ed8574c6258 | 80 | #define RXF2SIDH 0x08 |
jedh | 0:6ed8574c6258 | 81 | #define RXF2SIDL 0x09 |
jedh | 0:6ed8574c6258 | 82 | #define RXF2EID8 0x0A |
jedh | 0:6ed8574c6258 | 83 | #define RXF2EID0 0x0B |
jedh | 0:6ed8574c6258 | 84 | |
jedh | 0:6ed8574c6258 | 85 | //Digital outputs/inputs registers |
jedh | 0:6ed8574c6258 | 86 | |
jedh | 0:6ed8574c6258 | 87 | #define BFPCTRL 0x0C |
jedh | 0:6ed8574c6258 | 88 | #define TXRTSCTRL 0x0D |
jedh | 0:6ed8574c6258 | 89 | |
jedh | 0:6ed8574c6258 | 90 | //CAN-bus control and status registers |
jedh | 0:6ed8574c6258 | 91 | |
jedh | 0:6ed8574c6258 | 92 | #define CANSTAT 0x0E |
jedh | 0:6ed8574c6258 | 93 | #define CANCTRL 0x0F |
jedh | 0:6ed8574c6258 | 94 | |
jedh | 0:6ed8574c6258 | 95 | //Message acceptance filters registerts - Buffer 1 |
jedh | 0:6ed8574c6258 | 96 | |
jedh | 0:6ed8574c6258 | 97 | #define RXF3SIDH 0x10 |
jedh | 0:6ed8574c6258 | 98 | #define RXF3SIDL 0x11 |
jedh | 0:6ed8574c6258 | 99 | #define RXF3EID8 0x12 |
jedh | 0:6ed8574c6258 | 100 | #define RXF3EID0 0x13 |
jedh | 0:6ed8574c6258 | 101 | #define RXF4SIDH 0x14 |
jedh | 0:6ed8574c6258 | 102 | #define RXF4SIDL 0x15 |
jedh | 0:6ed8574c6258 | 103 | #define RXF4EID8 0x16 |
jedh | 0:6ed8574c6258 | 104 | #define RXF4EID0 0x17 |
jedh | 0:6ed8574c6258 | 105 | #define RXF5SIDH 0x18 |
jedh | 0:6ed8574c6258 | 106 | #define RXF5SIDL 0x19 |
jedh | 0:6ed8574c6258 | 107 | #define RXF5EID8 0x1A |
jedh | 0:6ed8574c6258 | 108 | #define RXF5EID0 0x1B |
jedh | 0:6ed8574c6258 | 109 | |
jedh | 0:6ed8574c6258 | 110 | //Error counters registers |
jedh | 0:6ed8574c6258 | 111 | |
jedh | 0:6ed8574c6258 | 112 | #define TEC 0x1C |
jedh | 0:6ed8574c6258 | 113 | #define REC 0x1D |
jedh | 0:6ed8574c6258 | 114 | |
jedh | 0:6ed8574c6258 | 115 | //Message acceptance masks registers |
jedh | 0:6ed8574c6258 | 116 | |
jedh | 0:6ed8574c6258 | 117 | #define RXM0SIDH 0x20 |
jedh | 0:6ed8574c6258 | 118 | #define RXM0SIDL 0x21 |
jedh | 0:6ed8574c6258 | 119 | #define RXM0EID8 0x22 |
jedh | 0:6ed8574c6258 | 120 | #define RXM0EID0 0x23 |
jedh | 0:6ed8574c6258 | 121 | #define RXM1SIDH 0x24 |
jedh | 0:6ed8574c6258 | 122 | #define RXM1SIDL 0x25 |
jedh | 0:6ed8574c6258 | 123 | #define RXM1EID8 0x26 |
jedh | 0:6ed8574c6258 | 124 | #define RXM1EID0 0x27 |
jedh | 0:6ed8574c6258 | 125 | |
jedh | 0:6ed8574c6258 | 126 | //Bit timing registers |
jedh | 0:6ed8574c6258 | 127 | |
jedh | 0:6ed8574c6258 | 128 | #define CNF3 0x28 |
jedh | 0:6ed8574c6258 | 129 | #define CNF2 0x29 |
jedh | 0:6ed8574c6258 | 130 | #define CNF1 0x2A |
jedh | 0:6ed8574c6258 | 131 | |
jedh | 0:6ed8574c6258 | 132 | //Interrups registers |
jedh | 0:6ed8574c6258 | 133 | |
jedh | 0:6ed8574c6258 | 134 | #define CANINTE 0x2B |
jedh | 0:6ed8574c6258 | 135 | #define CANINTF 0x2C |
jedh | 0:6ed8574c6258 | 136 | |
jedh | 0:6ed8574c6258 | 137 | //Error flags registers |
jedh | 0:6ed8574c6258 | 138 | |
jedh | 0:6ed8574c6258 | 139 | #define EFLG 0x2D |
jedh | 0:6ed8574c6258 | 140 | |
jedh | 0:6ed8574c6258 | 141 | //Message transmission registers - buffer --> 0 |
jedh | 0:6ed8574c6258 | 142 | |
jedh | 0:6ed8574c6258 | 143 | #define TXB0CTRL 0x30 |
jedh | 0:6ed8574c6258 | 144 | #define TXB0SIDH 0x31 |
jedh | 0:6ed8574c6258 | 145 | #define TXB0SIDL 0x32 |
jedh | 0:6ed8574c6258 | 146 | #define TXB0EID8 0x33 |
jedh | 0:6ed8574c6258 | 147 | #define TXB0EID0 0x34 |
jedh | 0:6ed8574c6258 | 148 | #define TXB0DLC 0x35 |
jedh | 0:6ed8574c6258 | 149 | #define TXB0D0 0x36 |
jedh | 0:6ed8574c6258 | 150 | #define TXB0D1 0x37 |
jedh | 0:6ed8574c6258 | 151 | #define TXB0D2 0x38 |
jedh | 0:6ed8574c6258 | 152 | #define TXB0D3 0x39 |
jedh | 0:6ed8574c6258 | 153 | #define TXB0D4 0x3A |
jedh | 0:6ed8574c6258 | 154 | #define TXB0D5 0x3B |
jedh | 0:6ed8574c6258 | 155 | #define TXB0D6 0x3C |
jedh | 0:6ed8574c6258 | 156 | #define TXB0D7 0x3D |
jedh | 0:6ed8574c6258 | 157 | |
jedh | 0:6ed8574c6258 | 158 | //Message transmission registers - buffer --> 1 |
jedh | 0:6ed8574c6258 | 159 | |
jedh | 0:6ed8574c6258 | 160 | #define TXB1CTRL 0x40 |
jedh | 0:6ed8574c6258 | 161 | #define TXB1SIDH 0x41 |
jedh | 0:6ed8574c6258 | 162 | #define TXB1SIDL 0x42 |
jedh | 0:6ed8574c6258 | 163 | #define TXB1EID8 0x43 |
jedh | 0:6ed8574c6258 | 164 | #define TXB1EID0 0x44 |
jedh | 0:6ed8574c6258 | 165 | #define TXB1DLC 0x45 |
jedh | 0:6ed8574c6258 | 166 | #define TXB1D0 0x46 |
jedh | 0:6ed8574c6258 | 167 | #define TXB1D1 0x47 |
jedh | 0:6ed8574c6258 | 168 | #define TXB1D2 0x48 |
jedh | 0:6ed8574c6258 | 169 | #define TXB1D3 0x49 |
jedh | 0:6ed8574c6258 | 170 | #define TXB1D4 0x4A |
jedh | 0:6ed8574c6258 | 171 | #define TXB1D5 0x4B |
jedh | 0:6ed8574c6258 | 172 | #define TXB1D6 0x4C |
jedh | 0:6ed8574c6258 | 173 | #define TXB1D7 0x4D |
jedh | 0:6ed8574c6258 | 174 | |
jedh | 0:6ed8574c6258 | 175 | //Message transmission registers - buffer --> 2 |
jedh | 0:6ed8574c6258 | 176 | |
jedh | 0:6ed8574c6258 | 177 | #define TXB2CTRL 0x50 |
jedh | 0:6ed8574c6258 | 178 | #define TXB2SIDH 0x51 |
jedh | 0:6ed8574c6258 | 179 | #define TXB2SIDL 0x52 |
jedh | 0:6ed8574c6258 | 180 | #define TXB2EID8 0x53 |
jedh | 0:6ed8574c6258 | 181 | #define TXB2EID0 0x54 |
jedh | 0:6ed8574c6258 | 182 | #define TXB2DLC 0x55 |
jedh | 0:6ed8574c6258 | 183 | #define TXB2D0 0x56 |
jedh | 0:6ed8574c6258 | 184 | #define TXB2D1 0x57 |
jedh | 0:6ed8574c6258 | 185 | #define TXB2D2 0x58 |
jedh | 0:6ed8574c6258 | 186 | #define TXB2D3 0x59 |
jedh | 0:6ed8574c6258 | 187 | #define TXB2D4 0x5A |
jedh | 0:6ed8574c6258 | 188 | #define TXB2D5 0x5B |
jedh | 0:6ed8574c6258 | 189 | #define TXB2D6 0x5C |
jedh | 0:6ed8574c6258 | 190 | #define TXB2D7 0x5D |
jedh | 0:6ed8574c6258 | 191 | |
jedh | 0:6ed8574c6258 | 192 | //Message reception registers - buffer --> 0 |
jedh | 0:6ed8574c6258 | 193 | |
jedh | 0:6ed8574c6258 | 194 | #define RXB0CTRL 0x60 |
jedh | 0:6ed8574c6258 | 195 | #define RXB0SIDH 0x61 |
jedh | 0:6ed8574c6258 | 196 | #define RXB0SIDL 0x62 |
jedh | 0:6ed8574c6258 | 197 | #define RXB0EID8 0x63 |
jedh | 0:6ed8574c6258 | 198 | #define RXB0EID0 0x64 |
jedh | 0:6ed8574c6258 | 199 | #define RXB0DLC 0x65 |
jedh | 0:6ed8574c6258 | 200 | #define RXB0D0 0x66 |
jedh | 0:6ed8574c6258 | 201 | #define RXB0D1 0x67 |
jedh | 0:6ed8574c6258 | 202 | #define RXB0D2 0x68 |
jedh | 0:6ed8574c6258 | 203 | #define RXB0D3 0x69 |
jedh | 0:6ed8574c6258 | 204 | #define RXB0D4 0x6A |
jedh | 0:6ed8574c6258 | 205 | #define RXB0D5 0x6B |
jedh | 0:6ed8574c6258 | 206 | #define RXB0D6 0x6C |
jedh | 0:6ed8574c6258 | 207 | #define RXB0D7 0x6D |
jedh | 0:6ed8574c6258 | 208 | |
jedh | 0:6ed8574c6258 | 209 | //Message reception registers - buffer --> 1 |
jedh | 0:6ed8574c6258 | 210 | |
jedh | 0:6ed8574c6258 | 211 | #define RXB1CTRL 0x70 |
jedh | 0:6ed8574c6258 | 212 | #define RXB1SIDH 0x71 |
jedh | 0:6ed8574c6258 | 213 | #define RXB1SIDL 0x72 |
jedh | 0:6ed8574c6258 | 214 | #define RXB1EID8 0x73 |
jedh | 0:6ed8574c6258 | 215 | #define RXB1EID0 0x74 |
jedh | 0:6ed8574c6258 | 216 | #define RXB1DLC 0x75 |
jedh | 0:6ed8574c6258 | 217 | #define RXB1D0 0x76 |
jedh | 0:6ed8574c6258 | 218 | #define RXB1D1 0x77 |
jedh | 0:6ed8574c6258 | 219 | #define RXB1D2 0x78 |
jedh | 0:6ed8574c6258 | 220 | #define RXB1D3 0x79 |
jedh | 0:6ed8574c6258 | 221 | #define RXB1D4 0x7A |
jedh | 0:6ed8574c6258 | 222 | #define RXB1D5 0x7B |
jedh | 0:6ed8574c6258 | 223 | #define RXB1D6 0x7C |
jedh | 0:6ed8574c6258 | 224 | #define RXB1D7 0x7D |
jedh | 0:6ed8574c6258 | 225 | |
jedh | 0:6ed8574c6258 | 226 | //Control registers |
jedh | 0:6ed8574c6258 | 227 | |
jedh | 0:6ed8574c6258 | 228 | /** BFPCTRL **/ |
jedh | 0:6ed8574c6258 | 229 | #define B1BFS 5 |
jedh | 0:6ed8574c6258 | 230 | #define B0BFS 4 |
jedh | 0:6ed8574c6258 | 231 | #define B1BFE 3 |
jedh | 0:6ed8574c6258 | 232 | #define B0BFE 2 |
jedh | 0:6ed8574c6258 | 233 | #define B1BFM 1 |
jedh | 0:6ed8574c6258 | 234 | #define B0BFM 0 |
jedh | 0:6ed8574c6258 | 235 | |
jedh | 0:6ed8574c6258 | 236 | /** TXRTSCTRL **/ |
jedh | 0:6ed8574c6258 | 237 | #define B2RTS 5 |
jedh | 0:6ed8574c6258 | 238 | #define B1RTS 4 |
jedh | 0:6ed8574c6258 | 239 | #define B0RTS 3 |
jedh | 0:6ed8574c6258 | 240 | #define B2RTSM 2 |
jedh | 0:6ed8574c6258 | 241 | #define B1RTSM 1 |
jedh | 0:6ed8574c6258 | 242 | #define B0RTSM 0 |
jedh | 0:6ed8574c6258 | 243 | |
jedh | 0:6ed8574c6258 | 244 | /** CANSTAT **/ |
jedh | 0:6ed8574c6258 | 245 | #define OPMOD2 7 |
jedh | 0:6ed8574c6258 | 246 | #define OPMOD1 6 |
jedh | 0:6ed8574c6258 | 247 | #define OPMOD0 5 |
jedh | 0:6ed8574c6258 | 248 | #define ICOD2 3 |
jedh | 0:6ed8574c6258 | 249 | #define ICOD1 2 |
jedh | 0:6ed8574c6258 | 250 | #define ICOD0 1 |
jedh | 0:6ed8574c6258 | 251 | |
jedh | 0:6ed8574c6258 | 252 | /** CANCTRL **/ |
jedh | 0:6ed8574c6258 | 253 | #define REQOP2 7 |
jedh | 0:6ed8574c6258 | 254 | #define REQOP1 6 |
jedh | 0:6ed8574c6258 | 255 | #define REQOP0 5 |
jedh | 0:6ed8574c6258 | 256 | #define ABAT 4 |
jedh | 0:6ed8574c6258 | 257 | #define CLKEN 2 |
jedh | 0:6ed8574c6258 | 258 | #define CLKPRE1 1 |
jedh | 0:6ed8574c6258 | 259 | #define CLKPRE0 0 |
jedh | 0:6ed8574c6258 | 260 | |
jedh | 0:6ed8574c6258 | 261 | /** CNF3 **/ |
jedh | 0:6ed8574c6258 | 262 | #define SOF 7 |
jedh | 0:6ed8574c6258 | 263 | #define WAKFIL 6 |
jedh | 0:6ed8574c6258 | 264 | #define PHSEG22 2 |
jedh | 0:6ed8574c6258 | 265 | #define PHSEG21 1 |
jedh | 0:6ed8574c6258 | 266 | #define PHSEG20 0 |
jedh | 0:6ed8574c6258 | 267 | |
jedh | 0:6ed8574c6258 | 268 | /** CNF2 **/ |
jedh | 0:6ed8574c6258 | 269 | #define BTLMODE 7 |
jedh | 0:6ed8574c6258 | 270 | #define SAM 6 |
jedh | 0:6ed8574c6258 | 271 | #define PHSEG12 5 |
jedh | 0:6ed8574c6258 | 272 | #define PHSEG11 4 |
jedh | 0:6ed8574c6258 | 273 | #define PHSEG10 3 |
jedh | 0:6ed8574c6258 | 274 | #define PHSEG2 2 |
jedh | 0:6ed8574c6258 | 275 | #define PHSEG1 1 |
jedh | 0:6ed8574c6258 | 276 | #define PHSEG0 0 |
jedh | 0:6ed8574c6258 | 277 | |
jedh | 0:6ed8574c6258 | 278 | /** CNF1 **/ |
jedh | 0:6ed8574c6258 | 279 | #define SJW1 7 |
jedh | 0:6ed8574c6258 | 280 | #define SJW0 6 |
jedh | 0:6ed8574c6258 | 281 | #define BRP5 5 |
jedh | 0:6ed8574c6258 | 282 | #define BRP4 4 |
jedh | 0:6ed8574c6258 | 283 | #define BRP3 3 |
jedh | 0:6ed8574c6258 | 284 | #define BRP2 2 |
jedh | 0:6ed8574c6258 | 285 | #define BRP1 1 |
jedh | 0:6ed8574c6258 | 286 | #define BRP0 0 |
jedh | 0:6ed8574c6258 | 287 | |
jedh | 0:6ed8574c6258 | 288 | /** CANINTE **/ |
jedh | 0:6ed8574c6258 | 289 | #define MERRE 7 |
jedh | 0:6ed8574c6258 | 290 | #define WAKIE 6 |
jedh | 0:6ed8574c6258 | 291 | #define ERRIE 5 |
jedh | 0:6ed8574c6258 | 292 | #define TX2IE 4 |
jedh | 0:6ed8574c6258 | 293 | #define TX1IE 3 |
jedh | 0:6ed8574c6258 | 294 | #define TX0IE 2 |
jedh | 0:6ed8574c6258 | 295 | #define RX1IE 1 |
jedh | 0:6ed8574c6258 | 296 | #define RX0IE 0 |
jedh | 0:6ed8574c6258 | 297 | |
jedh | 0:6ed8574c6258 | 298 | /** CANINTF */ |
jedh | 0:6ed8574c6258 | 299 | #define MERRF 7 |
jedh | 0:6ed8574c6258 | 300 | #define WAKIF 6 |
jedh | 0:6ed8574c6258 | 301 | #define ERRIF 5 |
jedh | 0:6ed8574c6258 | 302 | #define TX2IF 4 |
jedh | 0:6ed8574c6258 | 303 | #define TX1IF 3 |
jedh | 0:6ed8574c6258 | 304 | #define TX0IF 2 |
jedh | 0:6ed8574c6258 | 305 | #define RX1IF 1 |
jedh | 0:6ed8574c6258 | 306 | #define RX0IF 0 |
jedh | 0:6ed8574c6258 | 307 | |
jedh | 0:6ed8574c6258 | 308 | /** EFLG **/ |
jedh | 0:6ed8574c6258 | 309 | #define RX1OVR 7 |
jedh | 0:6ed8574c6258 | 310 | #define RX0OVR 6 |
jedh | 0:6ed8574c6258 | 311 | #define TXB0 5 |
jedh | 0:6ed8574c6258 | 312 | #define TXEP 4 |
jedh | 0:6ed8574c6258 | 313 | #define RXEP 3 |
jedh | 0:6ed8574c6258 | 314 | #define TXWAR 2 |
jedh | 0:6ed8574c6258 | 315 | #define RXWAR 1 |
jedh | 0:6ed8574c6258 | 316 | #define EWARN 0 |
jedh | 0:6ed8574c6258 | 317 | |
jedh | 0:6ed8574c6258 | 318 | /** TXBnCTRL (n = 0, 1, 2) **/ |
jedh | 0:6ed8574c6258 | 319 | #define ABTF 6 |
jedh | 0:6ed8574c6258 | 320 | #define MLOA 5 |
jedh | 0:6ed8574c6258 | 321 | #define TXERR 4 |
jedh | 0:6ed8574c6258 | 322 | #define TXREQ 3 |
jedh | 0:6ed8574c6258 | 323 | #define TXP1 1 |
jedh | 0:6ed8574c6258 | 324 | #define TXP0 0 |
jedh | 0:6ed8574c6258 | 325 | |
jedh | 0:6ed8574c6258 | 326 | /** RXB0CTRL **/ |
jedh | 0:6ed8574c6258 | 327 | #define RXM1 6 |
jedh | 0:6ed8574c6258 | 328 | #define RXM0 5 |
jedh | 0:6ed8574c6258 | 329 | #define RXRTR 3 |
jedh | 0:6ed8574c6258 | 330 | #define BUKT 2 |
jedh | 0:6ed8574c6258 | 331 | #define BUKT1 1 |
jedh | 0:6ed8574c6258 | 332 | #define FILHIT0 0 |
jedh | 0:6ed8574c6258 | 333 | |
jedh | 0:6ed8574c6258 | 334 | /** RXB1CTRL **/ |
jedh | 0:6ed8574c6258 | 335 | #define RSM1 6 |
jedh | 0:6ed8574c6258 | 336 | #define FILHIT2 2 |
jedh | 0:6ed8574c6258 | 337 | #define FILHIT1 1 |
jedh | 0:6ed8574c6258 | 338 | |
jedh | 0:6ed8574c6258 | 339 | /** TXBnSIDL (n = 0, 1) **/ |
jedh | 0:6ed8574c6258 | 340 | #define EXIDE 3 |
jedh | 0:6ed8574c6258 | 341 | |
jedh | 0:6ed8574c6258 | 342 | /** RXBnSIDL (n = 0, 1) **/ |
jedh | 0:6ed8574c6258 | 343 | #define SRR 4 |
jedh | 0:6ed8574c6258 | 344 | #define IDE 3 |
jedh | 0:6ed8574c6258 | 345 | |
jedh | 0:6ed8574c6258 | 346 | /** RXBnDLC (n = 0, 1) / TXBnDLC **/ |
jedh | 0:6ed8574c6258 | 347 | #define RTR 6 |
jedh | 0:6ed8574c6258 | 348 | #define DLC3 3 |
jedh | 0:6ed8574c6258 | 349 | #define DLC2 2 |
jedh | 0:6ed8574c6258 | 350 | #define DLC1 1 |
jedh | 0:6ed8574c6258 | 351 | #define DLC0 0 |
jedh | 0:6ed8574c6258 | 352 | |
jedh | 0:6ed8574c6258 | 353 | |
jedh | 0:6ed8574c6258 | 354 | /****************************************************************************** |
jedh | 0:6ed8574c6258 | 355 | CAN in Automation (CiA) |
jedh | 0:6ed8574c6258 | 356 | ******************************************************************************/ |
jedh | 0:6ed8574c6258 | 357 | |
jedh | 0:6ed8574c6258 | 358 | //Standard OBD requests and responses |
jedh | 0:6ed8574c6258 | 359 | |
jedh | 0:6ed8574c6258 | 360 | #define ID_QUERY 0x7DF |
jedh | 0:6ed8574c6258 | 361 | #define ID_RESPONSE 0x7E8 |
jedh | 0:6ed8574c6258 | 362 | |
jedh | 0:6ed8574c6258 | 363 | |
jedh | 0:6ed8574c6258 | 364 | //Standars PIDs |
jedh | 0:6ed8574c6258 | 365 | |
jedh | 0:6ed8574c6258 | 366 | //Mode PID Data ret......Description...............min_val...max_val..units...formula |
jedh | 0:6ed8574c6258 | 367 | |
jedh | 0:6ed8574c6258 | 368 | #define CALC_ENGINE_LOAD 0X04 //01 04 1 Calculated engine load value 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 369 | #define ENGINE_COOLANT_TEMP 0x05 //01 05 1 Engine coolant temperature -40 215 °C A-40 |
jedh | 0:6ed8574c6258 | 370 | #define SHORT_TERM_FUEL_1 0x06 //01 06 1 Short term fuel % trim—Bank 1 -100 (Rich) 99.22 (Lean) % (A-128) * 100/128 |
jedh | 0:6ed8574c6258 | 371 | #define LONG_TERM_FUEL_1 0x07 //01 07 1 Long term fuel % trim—Bank 1 -100 (Rich) 99.22 (Lean) % (A-128) * 100/128 |
jedh | 0:6ed8574c6258 | 372 | #define SHORT_TERM_FUEL_2 0x08 //01 08 1 Short term fuel % trim—Bank 2 -100 (Rich) 99.22 (Lean) % (A-128) * 100/128 |
jedh | 0:6ed8574c6258 | 373 | #define LONG_TERM_FUEL_2 0x09 //01 09 1 Long term fuel % trim—Bank 2 -100 (Rich) 99.22 (Lean) % (A-128) * 100/128 |
jedh | 0:6ed8574c6258 | 374 | #define O2_B1_S1_VOLTAGE 0x14 //01 14 2 Bank 1, Sensor 1:Oxygen sensor voltage,Short term fuel trim 0-100(lean) 1.275 99.2(rich) Volts % A/200(B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
jedh | 0:6ed8574c6258 | 375 | #define FUEL_PRESSURE 0x0A //01 0A 1 Fuel pressure 0 765 kPa (gauge) A*3 |
jedh | 0:6ed8574c6258 | 376 | #define INTAKE_M_A_PRESSURE 0x0B //01 0B 1 Intake manifold absolute pressure 0 255 kPa (absolute) A |
jedh | 0:6ed8574c6258 | 377 | #define ENGINE_RPM 0x0C //01 0C 2 Engine RPM 0 16,383.75 rpm ((A*256)+B)/4 |
jedh | 0:6ed8574c6258 | 378 | #define VEHICLE_SPEED 0x0D //01 0D 1 Vehicle speed 0 255 km/h A |
jedh | 0:6ed8574c6258 | 379 | #define TIMING_ADVANCE 0x0E //01 0E 1 Timing advance -64 63.5 ° relative to #1 cylinder A/2 - 64 |
jedh | 0:6ed8574c6258 | 380 | #define INTAKE_AIR_TEMP 0x0F //01 0F 1 Intake air temperature -40 215 °C A-40 |
jedh | 0:6ed8574c6258 | 381 | #define MAF_AIR_FLOW_RATE 0x10 //01 10 2 MAF air flow rate 0 655.35 g/s ((A*256)+B) / 100 |
jedh | 0:6ed8574c6258 | 382 | #define THROTTLE_POSITION 0x11 //01 11 1 Throttle position 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 383 | #define RUNTIME_SINCE_START 0x1F //01 1F 2 Run time since engine start 0 65,535 seconds (A*256)+B |
jedh | 0:6ed8574c6258 | 384 | #define DISTANCE_WITH_MALF 0x21 //01 21 2 Distance traveled with malfunction indicator lamp (MIL) on 0 65,535 km (A*256)+B |
jedh | 0:6ed8574c6258 | 385 | #define FUEL_RAIL_PRESSURE_RELATIVE 0x22 //01 22 2 Fuel Rail Pressure (relative to manifold vacuum) 0 5177.265 kPa (((A*256)+B) * 10) / 128 |
jedh | 0:6ed8574c6258 | 386 | #define FUEL_RAIL_PRESSURE_DIESEL 0x23 //01 23 2 Fuel Rail Pressure (diesel) 0 655350 kPa (gauge) ((A*256)+B) * 10 |
jedh | 0:6ed8574c6258 | 387 | #define FUEL_LEVEL 0x2F //01 2F 1 Fuel Level Input 0 100 % 100*A/255 |
jedh | 0:6ed8574c6258 | 388 | #define NUM_WARMUPS_SINCE_CODES 0x30 //01 30 1 # of warm-ups since codes cleared 0 255 N/A A |
jedh | 0:6ed8574c6258 | 389 | #define DISTANCE_SINCE_CODES 0x31 //01 31 2 Distance traveled since codes cleared 0 65,535 km (A*256)+B |
jedh | 0:6ed8574c6258 | 390 | #define EVAP_SYSTEM_VAPOR_PRESSURE 0x32 //01 32 2 Evap. System Vapor Pressure -8,192 8,192 Pa ((A*256)+B)/4 (A is signed) |
jedh | 0:6ed8574c6258 | 391 | #define BAROMETRIC_PRESSURE 0x33 //01 33 1 Barometric pressure 0 255 kPa (Absolute) A |
jedh | 0:6ed8574c6258 | 392 | #define CONTROL_MODULE_VOLTAGE 0x42 //01 42 2 Control module voltage 0 65.535 V ((A*256)+B)/1000 |
jedh | 0:6ed8574c6258 | 393 | #define ABSOLUTE_LOAD_VALUE 0x43 //01 43 2 Absolute load value 0 25,700 % ((A*256)+B)*100/255 |
jedh | 0:6ed8574c6258 | 394 | #define COMMAND_EQUIV_RATIO 0x44 //01 44 2 Command equivalence ratio 0 2 N/A ((A*256)+B)/32768 |
jedh | 0:6ed8574c6258 | 395 | #define REL_THROTTLE_POSITION 0x45 //01 45 1 Relative throttle position 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 396 | #define AMBIENT_AIR_TEMPERATURE 0x46 //01 46 1 Ambient air temperature -40 215 °C A-40 |
jedh | 0:6ed8574c6258 | 397 | #define ABS_THROTTLE_POSITION_B 0x47 //01 47 1 Absolute throttle position B 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 398 | #define ABS_THROTTLE_POSITION_C 0x48 //01 48 1 Absolute throttle position C 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 399 | #define ABS_THROTTLE_POSITION_D 0x49 //01 49 1 Accelerator pedal position D 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 400 | #define ABS_THROTTLE_POSITION_E 0x4A //01 4A 1 Accelerator pedal position E 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 401 | #define ABS_THROTTLE_POSITION_F 0x4B //01 4B 1 Accelerator pedal position F 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 402 | #define COMMANDED_THROTTLE_ACTUATOR 0x4C //01 4C 1 Commanded throttle actuator 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 403 | #define TIME_RUN_WITH_MIL_ON 0x4D //01 4D 2 Time run with MIL on 0 65,535 minutes (A*256)+B |
jedh | 0:6ed8574c6258 | 404 | #define TIME_SINCE_T_CODES_CLEAR 0x4E //01 4E 2 Time since trouble codes cleared 0 65,535 minutes (A*256)+B |
jedh | 0:6ed8574c6258 | 405 | #define FUEL_TYPE 0x51 //01 51 1 Fuel Type From fuel type table see below |
jedh | 0:6ed8574c6258 | 406 | #define ETHANOL_FUEL 0x52 //01 52 1 Ethanol fuel % 0 100 % A*100/255 |
jedh | 0:6ed8574c6258 | 407 | #define ABS_EVAP_SYST_VAPOUR_PRESS 0x53 //01 53 2 Absoulute Evap system Vapour Pressure 0 327675 kpa 1/200 per bit |
jedh | 0:6ed8574c6258 | 408 | #define ENGINE_FUEL_RATE 0x5E //01 5E 2 Engine fuel rate 0 - 3212.75 L/h ((A*256)+B)*0.05 |
jedh | 0:6ed8574c6258 | 409 | |
jedh | 0:6ed8574c6258 | 410 | |
jedh | 0:6ed8574c6258 | 411 | #include <inttypes.h> |
jedh | 0:6ed8574c6258 | 412 | |
jedh | 0:6ed8574c6258 | 413 | |
jedh | 0:6ed8574c6258 | 414 | /****************************************************************************** |
jedh | 0:6ed8574c6258 | 415 | * Class |
jedh | 0:6ed8574c6258 | 416 | ******************************************************************************/ |
jedh | 0:6ed8574c6258 | 417 | |
jedh | 0:6ed8574c6258 | 418 | //! CAN Class |
jedh | 0:6ed8574c6258 | 419 | /*! |
jedh | 0:6ed8574c6258 | 420 | CAN Class defines all the variables and functions used to manage CAN-bus modules |
jedh | 0:6ed8574c6258 | 421 | */ |
jedh | 0:6ed8574c6258 | 422 | |
jedh | 0:6ed8574c6258 | 423 | class CAN |
jedh | 0:6ed8574c6258 | 424 | { |
jedh | 0:6ed8574c6258 | 425 | |
jedh | 0:6ed8574c6258 | 426 | private: |
jedh | 0:6ed8574c6258 | 427 | // Write a register of the MCP2515 using SPI |
jedh | 0:6ed8574c6258 | 428 | void writeRegister( char direction, char data ); |
jedh | 0:6ed8574c6258 | 429 | // Read a register of the MCP2515 using SPI |
jedh | 0:6ed8574c6258 | 430 | char readRegister(char direction); |
jedh | 0:6ed8574c6258 | 431 | // Modify a bit of the MCP2515 using SPI |
jedh | 0:6ed8574c6258 | 432 | void bitModify(char direction, char mask, char data); |
jedh | 0:6ed8574c6258 | 433 | // Check the status of the MCP2515 registers |
jedh | 0:6ed8574c6258 | 434 | char readStatus(char type); |
jedh | 0:6ed8574c6258 | 435 | // Check if the buffers are empty |
jedh | 0:6ed8574c6258 | 436 | bool checkFreeBuffer(void); |
jedh | 0:6ed8574c6258 | 437 | // Reset MCP2515 |
jedh | 0:6ed8574c6258 | 438 | void reset(void); |
jedh | 0:6ed8574c6258 | 439 | |
jedh | 0:6ed8574c6258 | 440 | |
jedh | 0:6ed8574c6258 | 441 | public: |
jedh | 0:6ed8574c6258 | 442 | |
jedh | 0:6ed8574c6258 | 443 | // Data structure |
jedh | 0:6ed8574c6258 | 444 | typedef struct{ |
jedh | 0:6ed8574c6258 | 445 | unsigned int id; |
jedh | 0:6ed8574c6258 | 446 | struct |
jedh | 0:6ed8574c6258 | 447 | { |
jedh | 0:6ed8574c6258 | 448 | char rtr : 1; |
jedh | 0:6ed8574c6258 | 449 | char length : 4; |
jedh | 0:6ed8574c6258 | 450 | }header; |
jedh | 0:6ed8574c6258 | 451 | |
jedh | 0:6ed8574c6258 | 452 | uint8_t data[8]; |
jedh | 0:6ed8574c6258 | 453 | }messageCAN; |
jedh | 0:6ed8574c6258 | 454 | |
jedh | 0:6ed8574c6258 | 455 | // Receive buffer |
jedh | 0:6ed8574c6258 | 456 | messageCAN messageRx; |
jedh | 0:6ed8574c6258 | 457 | // Trasmit buffer |
jedh | 0:6ed8574c6258 | 458 | messageCAN messageTx; |
jedh | 0:6ed8574c6258 | 459 | // Empty constructor |
jedh | 0:6ed8574c6258 | 460 | CAN(void); |
jedh | 0:6ed8574c6258 | 461 | // Powers the CANBus module and opens the SPI |
jedh | 0:6ed8574c6258 | 462 | bool begin(uint16_t speed); |
jedh | 0:6ed8574c6258 | 463 | // Check if there is any message |
jedh | 0:6ed8574c6258 | 464 | uint8_t messageAvailable(void); |
jedh | 0:6ed8574c6258 | 465 | // Take the CAN message |
jedh | 0:6ed8574c6258 | 466 | char getMessage(messageCAN *msje); |
jedh | 0:6ed8574c6258 | 467 | // Send the CAN message |
jedh | 0:6ed8574c6258 | 468 | char sendMessage(messageCAN *msje); |
jedh | 0:6ed8574c6258 | 469 | // CAN message print out the serial port |
jedh | 0:6ed8574c6258 | 470 | void printMessage(messageCAN *msje); |
jedh | 0:6ed8574c6258 | 471 | // Configure the MCP2515 |
jedh | 0:6ed8574c6258 | 472 | void setMode(uint8_t mode); |
jedh | 0:6ed8574c6258 | 473 | |
jedh | 0:6ed8574c6258 | 474 | /*********************************************************************** |
jedh | 0:6ed8574c6258 | 475 | CAN in Automation (CiA) |
jedh | 0:6ed8574c6258 | 476 | ***********************************************************************/ |
jedh | 0:6ed8574c6258 | 477 | |
jedh | 0:6ed8574c6258 | 478 | unsigned int getEngineLoad(); |
jedh | 0:6ed8574c6258 | 479 | unsigned int getEngineCoolantTemp(); |
jedh | 0:6ed8574c6258 | 480 | unsigned int getFuelPressure(); |
jedh | 0:6ed8574c6258 | 481 | unsigned int getIntakeMAPressure(); |
jedh | 0:6ed8574c6258 | 482 | unsigned int getEngineRPM(); |
jedh | 0:6ed8574c6258 | 483 | unsigned int getVehicleSpeed(); |
jedh | 0:6ed8574c6258 | 484 | unsigned int getTimingAdvance(); |
jedh | 0:6ed8574c6258 | 485 | unsigned int getIntankeAirTemp(); |
jedh | 0:6ed8574c6258 | 486 | unsigned int getMAFairFlowRate(); |
jedh | 0:6ed8574c6258 | 487 | unsigned int getThrottlePosition(); |
jedh | 0:6ed8574c6258 | 488 | unsigned int getFuelLevel(); |
jedh | 0:6ed8574c6258 | 489 | unsigned int getBarometricPressure(); |
jedh | 0:6ed8574c6258 | 490 | unsigned int getEngineFuelRate(); |
jedh | 0:6ed8574c6258 | 491 | |
jedh | 0:6ed8574c6258 | 492 | // General Function |
jedh | 0:6ed8574c6258 | 493 | void CiARequest(uint8_t PID); |
jedh | 0:6ed8574c6258 | 494 | |
jedh | 0:6ed8574c6258 | 495 | |
jedh | 0:6ed8574c6258 | 496 | }; |
jedh | 0:6ed8574c6258 | 497 | |
jedh | 0:6ed8574c6258 | 498 | |
jedh | 0:6ed8574c6258 | 499 | #endif |
jedh | 0:6ed8574c6258 | 500 | |
jedh | 0:6ed8574c6258 | 501 |