eeprom adding

Fork of SEEED_CAN by Sophie Dexter

Committer:
Just4pLeisure
Date:
Tue Nov 12 20:54:16 2013 +0000
Revision:
2:fd026fcfde94
Parent:
1:ad71faa09868
Child:
3:29448355ef3a
Updated 12-11-2013 - attach functions are now usable. Changes to allow the the library to be used with more mbeds (e.g. LPC1768). I have also added new functions/methods which give more information about errors and interrupts.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 0:f5d099885d3d 1 /* seeed_can.h
Just4pLeisure 0:f5d099885d3d 2 * Copyright (c) 2013 Sophie Dexter
Just4pLeisure 0:f5d099885d3d 3 *
Just4pLeisure 0:f5d099885d3d 4 * Licensed under the Apache License, Version 2.0 (the "License");
Just4pLeisure 0:f5d099885d3d 5 * you may not use this file except in compliance with the License.
Just4pLeisure 0:f5d099885d3d 6 * You may obtain a copy of the License at
Just4pLeisure 0:f5d099885d3d 7 *
Just4pLeisure 0:f5d099885d3d 8 * http://www.apache.org/licenses/LICENSE-2.0
Just4pLeisure 0:f5d099885d3d 9 *
Just4pLeisure 0:f5d099885d3d 10 * Unless required by applicable law or agreed to in writing, software
Just4pLeisure 0:f5d099885d3d 11 * distributed under the License is distributed on an "AS IS" BASIS,
Just4pLeisure 0:f5d099885d3d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Just4pLeisure 0:f5d099885d3d 13 * See the License for the specific language governing permissions and
Just4pLeisure 0:f5d099885d3d 14 * limitations under the License.
Just4pLeisure 0:f5d099885d3d 15 */
Just4pLeisure 0:f5d099885d3d 16 #ifndef _SEEED_CAN_H_
Just4pLeisure 0:f5d099885d3d 17 #define _SEEED_CAN_H_
Just4pLeisure 0:f5d099885d3d 18
Just4pLeisure 0:f5d099885d3d 19 #include "seeed_can_api.h"
Just4pLeisure 0:f5d099885d3d 20
Just4pLeisure 0:f5d099885d3d 21 // if print debug information
Just4pLeisure 0:f5d099885d3d 22 #define DEBUG
Just4pLeisure 0:f5d099885d3d 23
Just4pLeisure 0:f5d099885d3d 24 /** CANMessage class
Just4pLeisure 0:f5d099885d3d 25 */
Just4pLeisure 0:f5d099885d3d 26 class SEEED_CANMessage : public CAN_Message
Just4pLeisure 0:f5d099885d3d 27 {
Just4pLeisure 0:f5d099885d3d 28
Just4pLeisure 0:f5d099885d3d 29 public:
Just4pLeisure 0:f5d099885d3d 30 /** Creates empty CAN message.
Just4pLeisure 0:f5d099885d3d 31 */
Just4pLeisure 0:f5d099885d3d 32 SEEED_CANMessage() {
Just4pLeisure 0:f5d099885d3d 33 id = 0;
Just4pLeisure 0:f5d099885d3d 34 memset(data, 0, 8);
Just4pLeisure 0:f5d099885d3d 35 len = 8;
Just4pLeisure 0:f5d099885d3d 36 type = CANData;
Just4pLeisure 0:f5d099885d3d 37 format = CANStandard;
Just4pLeisure 0:f5d099885d3d 38 }
Just4pLeisure 0:f5d099885d3d 39
Just4pLeisure 0:f5d099885d3d 40 /** Creates CAN message with specific content.
Just4pLeisure 0:f5d099885d3d 41 */
Just4pLeisure 0:f5d099885d3d 42 SEEED_CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
Just4pLeisure 0:f5d099885d3d 43 id = _id;
Just4pLeisure 0:f5d099885d3d 44 memcpy(data, _data, _len);
Just4pLeisure 0:f5d099885d3d 45 len = _len & 0xF;
Just4pLeisure 0:f5d099885d3d 46 type = _type;
Just4pLeisure 0:f5d099885d3d 47 format = _format;
Just4pLeisure 0:f5d099885d3d 48 }
Just4pLeisure 0:f5d099885d3d 49
Just4pLeisure 0:f5d099885d3d 50 /** Creates CAN remote message.
Just4pLeisure 0:f5d099885d3d 51 */
Just4pLeisure 0:f5d099885d3d 52 SEEED_CANMessage(int _id, CANFormat _format = CANStandard) {
Just4pLeisure 0:f5d099885d3d 53 id = _id;
Just4pLeisure 0:f5d099885d3d 54 memset(data, 0, 8);
Just4pLeisure 0:f5d099885d3d 55 len = 0;
Just4pLeisure 0:f5d099885d3d 56 type = CANRemote;
Just4pLeisure 0:f5d099885d3d 57 format = _format;
Just4pLeisure 0:f5d099885d3d 58 }
Just4pLeisure 0:f5d099885d3d 59 };
Just4pLeisure 0:f5d099885d3d 60
Just4pLeisure 0:f5d099885d3d 61
Just4pLeisure 0:f5d099885d3d 62 /** A can bus client, used for communicating with Seeed Studios' CAN-BUS Arduino Shield.
Just4pLeisure 0:f5d099885d3d 63 */
Just4pLeisure 0:f5d099885d3d 64 class SEEED_CAN
Just4pLeisure 0:f5d099885d3d 65 {
Just4pLeisure 0:f5d099885d3d 66 public:
Just4pLeisure 1:ad71faa09868 67 /** Seeed Studios CAN-BUS Shield Constructor - Create a SEEED_CAN interface connected to the specified pins.
Just4pLeisure 0:f5d099885d3d 68 *
Just4pLeisure 2:fd026fcfde94 69 * The Seeed Studio CAN-BUS shield is an Arduino compatible shield and connects to the FRDM-KL25Z SPI0 interface using pins PTD2 (mosi) PTD3 (miso) PTD1 (clk). The Active low chip select normally connects to the FRDM-KL25Z's PTD0 pin, but there is an option on the Seeed Studio CAN-BUS shield to connect to the PTD5 pin. The CAN-BUS shield uses the FRDM-KL25Z's PTD4 pin for its (active low) interrupt capability. The defaults allow you to plug the Seeed Studios' CAN-BUS Shield into a FRDM-KL25Z mbed and it to work without specifying any parameters.
Just4pLeisure 0:f5d099885d3d 70 *
Just4pLeisure 2:fd026fcfde94 71 * @param ncs Active low chip select, @b default: @p SEEED_CAN_CS is FRDM-KL25Z PTD0 pin (p9 on LPC1768).
Just4pLeisure 2:fd026fcfde94 72 * @n If you change the link on the Seeed Studios CAN-BUS shield you should use a value of SEEED_CAN_IO9 or PTD5 instead.
Just4pLeisure 2:fd026fcfde94 73 * @param irq Active low interrupt pin, @b default: @p SEEED_CAN_IRQ is FRDM-KL25Z PTD4 pin (p10 on LPC1768).
Just4pLeisure 2:fd026fcfde94 74 * @param mosi SPI Master Out, Slave In pin, @b default: @p SEEED_CAN_MOSI is FRDM-KL25Z PTD2 pin (p11 on LPC1768).
Just4pLeisure 2:fd026fcfde94 75 * @param miso SPI Master In, Slave Out pin, @b default: :p SEEED_CAN_MISO is FRDM-KL25Z PTD3 pin (p12 on LPC1768).
Just4pLeisure 2:fd026fcfde94 76 * @param clk SPI Clock pin, @b default: @p SEEED_CAN_MISO is FRDM-KL25Z PTD1 pin (p13 on LPC1768).
Just4pLeisure 2:fd026fcfde94 77 * @param spiBitrate SPI Clock frequency, @b default: @p 1000000 (1 MHz).
Just4pLeisure 0:f5d099885d3d 78 */
Just4pLeisure 2:fd026fcfde94 79 #if defined MKL25Z4_H_ // defined in MKL25Z4.h
Just4pLeisure 1:ad71faa09868 80 SEEED_CAN(PinName ncs=SEEED_CAN_CS, PinName irq=SEEED_CAN_IRQ, PinName mosi=SEEED_CAN_MOSI, PinName miso=SEEED_CAN_MISO, PinName clk=SEEED_CAN_CLK, int spiBitrate=1000000);
Just4pLeisure 2:fd026fcfde94 81 #elif defined __LPC17xx_H__ // defined in LPC17xx.h
Just4pLeisure 2:fd026fcfde94 82 SEEED_CAN(PinName ncs=p9, PinName irq=p10, PinName mosi=p11, PinName miso=p12, PinName clk=p13, int spiBitrate=1000000);
Just4pLeisure 2:fd026fcfde94 83 #else // No default constructor for other...
Just4pLeisure 2:fd026fcfde94 84 SEEED_CAN(PinName ncs, PinName irq, PinName mosi, PinName miso, PinName clk, int spiBitrate=1000000);
Just4pLeisure 2:fd026fcfde94 85 #endif
Just4pLeisure 0:f5d099885d3d 86 // virtual ~SEEED_CAN(); // !!! Need a de-constructor for the interrrupt pin !!!
Just4pLeisure 0:f5d099885d3d 87
Just4pLeisure 2:fd026fcfde94 88 enum Mode {
Just4pLeisure 2:fd026fcfde94 89 Normal = 0,
Just4pLeisure 2:fd026fcfde94 90 Sleep,
Just4pLeisure 2:fd026fcfde94 91 Loopback,
Just4pLeisure 2:fd026fcfde94 92 Monitor,
Just4pLeisure 2:fd026fcfde94 93 Config,
Just4pLeisure 2:fd026fcfde94 94 Reset
Just4pLeisure 2:fd026fcfde94 95 };
Just4pLeisure 2:fd026fcfde94 96
Just4pLeisure 1:ad71faa09868 97 /** Open initialises the Seeed Studios CAN-BUS Shield.
Just4pLeisure 1:ad71faa09868 98 *
Just4pLeisure 2:fd026fcfde94 99 * @param canBitrate CAN Bus Clock frequency, @b default: @p 100000 (100 kHz).
Just4pLeisure 2:fd026fcfde94 100 * @param mode The initial operation mode, @b default: @p Normal.
Just4pLeisure 2:fd026fcfde94 101 * @n @p SEEED_CAN::Normal - Normal mode is the standard operating mode,
Just4pLeisure 2:fd026fcfde94 102 * @n @p SEEED_CAN::Monitor - This mode can be used for bus monitor applications.
Just4pLeisure 2:fd026fcfde94 103 * @n @p SEEED_CAN::Sleep - This mode can be used to minimize the current consumption,
Just4pLeisure 2:fd026fcfde94 104 * @n @p SEEED_CAN::Loopback - This mode can be used in system development and testing.
Just4pLeisure 2:fd026fcfde94 105 * @n @p SEEED_CAN::Config - Open with this mode to prevent unwanted messages being received while you configure Filters.
Just4pLeisure 1:ad71faa09868 106 *
Just4pLeisure 1:ad71faa09868 107 * @returns
Just4pLeisure 2:fd026fcfde94 108 * 1 if successful,
Just4pLeisure 2:fd026fcfde94 109 * @n 0 otherwise
Just4pLeisure 2:fd026fcfde94 110 */
Just4pLeisure 2:fd026fcfde94 111 int open(int canBitrate=100000, Mode mode = Normal);
Just4pLeisure 2:fd026fcfde94 112
Just4pLeisure 2:fd026fcfde94 113 /** Puts or removes the Seeed Studios CAN-BUS shield into or from silent monitoring mode.
Just4pLeisure 2:fd026fcfde94 114 *
Just4pLeisure 2:fd026fcfde94 115 * @param silent boolean indicating whether to go into silent mode or not.
Just4pLeisure 1:ad71faa09868 116 */
Just4pLeisure 2:fd026fcfde94 117 void monitor(bool silent);
Just4pLeisure 2:fd026fcfde94 118
Just4pLeisure 2:fd026fcfde94 119 /** Change the Seeed Studios CAN-BUS shield CAN operation mode.
Just4pLeisure 2:fd026fcfde94 120 *
Just4pLeisure 2:fd026fcfde94 121 * @param mode The new operation mode
Just4pLeisure 2:fd026fcfde94 122 * @n @p SEEED_CAN::Normal - Normal mode is the standard operating mode,
Just4pLeisure 2:fd026fcfde94 123 * @n @p SEEED_CAN::Monitor - This mode can be used for bus monitor applications.
Just4pLeisure 2:fd026fcfde94 124 * @n @p SEEED_CAN::Sleep - This mode can be used to minimize the current consumption,
Just4pLeisure 2:fd026fcfde94 125 * @n @p SEEED_CAN::Loopback - This mode can be used in system development and testing.
Just4pLeisure 2:fd026fcfde94 126 * @n @p SEEED_CAN::Reset - Reset the MCP2515 device and stay in Configuration mode.
Just4pLeisure 2:fd026fcfde94 127 *
Just4pLeisure 2:fd026fcfde94 128 * @returns
Just4pLeisure 2:fd026fcfde94 129 * 1 if mode change was successful
Just4pLeisure 2:fd026fcfde94 130 * @n 0 if mode change failed or unsupported,
Just4pLeisure 2:fd026fcfde94 131 */
Just4pLeisure 2:fd026fcfde94 132 int mode(Mode mode);
Just4pLeisure 1:ad71faa09868 133
Just4pLeisure 1:ad71faa09868 134 /** Set the CAN bus frequency (Bit Rate)
Just4pLeisure 0:f5d099885d3d 135 *
Just4pLeisure 0:f5d099885d3d 136 * @param hz The bus frequency in Hertz
Just4pLeisure 0:f5d099885d3d 137 *
Just4pLeisure 0:f5d099885d3d 138 * @returns
Just4pLeisure 2:fd026fcfde94 139 * 1 if successful,
Just4pLeisure 2:fd026fcfde94 140 * @n 0 otherwise
Just4pLeisure 0:f5d099885d3d 141 */
Just4pLeisure 1:ad71faa09868 142 int frequency(int canBitRate);
Just4pLeisure 0:f5d099885d3d 143
Just4pLeisure 1:ad71faa09868 144 /** Read a CAN bus message from the MCP2515 (if one has been received)
Just4pLeisure 1:ad71faa09868 145 *
Just4pLeisure 1:ad71faa09868 146 * @param msg A CANMessage to read to.
Just4pLeisure 1:ad71faa09868 147 *
Just4pLeisure 1:ad71faa09868 148 * @returns
Just4pLeisure 2:fd026fcfde94 149 * 1 if any messages have arrived
Just4pLeisure 2:fd026fcfde94 150 * @n 0 if no message arrived,
Just4pLeisure 1:ad71faa09868 151 */
Just4pLeisure 1:ad71faa09868 152 int read(SEEED_CANMessage &msg);
Just4pLeisure 1:ad71faa09868 153
Just4pLeisure 1:ad71faa09868 154 /** Write a CAN bus message to the MCP2515 (if there is a free message buffer)
Just4pLeisure 0:f5d099885d3d 155 *
Just4pLeisure 0:f5d099885d3d 156 * @param msg The CANMessage to write.
Just4pLeisure 0:f5d099885d3d 157 *
Just4pLeisure 0:f5d099885d3d 158 * @returns
Just4pLeisure 2:fd026fcfde94 159 * 1 if write was successful
Just4pLeisure 2:fd026fcfde94 160 * @n 0 if write failed,
Just4pLeisure 0:f5d099885d3d 161 */
Just4pLeisure 0:f5d099885d3d 162 int write(SEEED_CANMessage msg);
Just4pLeisure 0:f5d099885d3d 163
Just4pLeisure 0:f5d099885d3d 164 /** Configure one of the Accpetance Masks (0 or 1)
Just4pLeisure 0:f5d099885d3d 165 *
Just4pLeisure 0:f5d099885d3d 166 * @param maskNum The number of the Acceptance Mask to configure (Acceptance Mask 0 is associated with Filters 0 and 1, Acceptance Mask 1 is associated with Filters 2 through 5).
Just4pLeisure 0:f5d099885d3d 167 * @param canId CAN Id Mask bits (Acceptance Filters are only compared against bits that are set to '1' in an Acceptance Mask (e.g. mask 0x07F0 and filter 0x03F0 would allow through messages with CAN Id's 0x03F0 through 0x03FF because the 4 LSBs of the CAN Id are not filtered).
Just4pLeisure 2:fd026fcfde94 168 * @param format Describes if the Acceptance Mask is for a standard (CANStandard) or extended (CANExtended) CAN message frame format, @b default: @p CANStandard.
Just4pLeisure 0:f5d099885d3d 169 *
Just4pLeisure 0:f5d099885d3d 170 * @returns
Just4pLeisure 2:fd026fcfde94 171 * 1 if Acceptance Mask was set
Just4pLeisure 2:fd026fcfde94 172 * @n 0 if the Acceptance Mask could not be set
Just4pLeisure 0:f5d099885d3d 173 */
Just4pLeisure 1:ad71faa09868 174 int mask(int maskNum, int canId, CANFormat format = CANStandard);
Just4pLeisure 0:f5d099885d3d 175
Just4pLeisure 0:f5d099885d3d 176 /** Configure one of the Acceptance Filters (0 through 5)
Just4pLeisure 0:f5d099885d3d 177 *
Just4pLeisure 0:f5d099885d3d 178 * @param filterNum The number of the Acceptance Filter to configure (Acceptance Filters 0 and 1 are associated with Mask 0, Acceptance Filters 2 through 5 are associated with Mask 1).
Just4pLeisure 0:f5d099885d3d 179 * @param canId CAN Id Filter bits (Acceptance Filters are only compared against bits that are set to '1' in an Acceptance Mask (e.g. mask 0x07F0 and filter 0x03F0 would allow through messages with CAN Id's 0x03F0 through 0x03FF because the 4 LSBs of the CAN Id are not filtered).
Just4pLeisure 2:fd026fcfde94 180 * @param format Describes if the Acceptance Filter is for a standard (CANStandard) or extended (CANExtended) CAN message frame format, @b default: @p CANStandard.
Just4pLeisure 0:f5d099885d3d 181 *
Just4pLeisure 0:f5d099885d3d 182 * @returns
Just4pLeisure 2:fd026fcfde94 183 * 1 if Acceptance Filter was set
Just4pLeisure 2:fd026fcfde94 184 * @n 0 if the Acceptance Filter could not be set
Just4pLeisure 0:f5d099885d3d 185 */
Just4pLeisure 1:ad71faa09868 186 int filter(int filterNum, int canId, CANFormat format = CANStandard);
Just4pLeisure 0:f5d099885d3d 187
Just4pLeisure 0:f5d099885d3d 188 /** Returns number of message reception (read) errors to detect read overflow errors.
Just4pLeisure 1:ad71faa09868 189 *
Just4pLeisure 1:ad71faa09868 190 * @returns
Just4pLeisure 1:ad71faa09868 191 * Number of reception errors
Just4pLeisure 0:f5d099885d3d 192 */
Just4pLeisure 0:f5d099885d3d 193 unsigned char rderror(void);
Just4pLeisure 0:f5d099885d3d 194
Just4pLeisure 0:f5d099885d3d 195 /** Returns number of message transmission (write) errors to detect write overflow errors.
Just4pLeisure 1:ad71faa09868 196 *
Just4pLeisure 1:ad71faa09868 197 * @returns
Just4pLeisure 1:ad71faa09868 198 * Number of transmission errors
Just4pLeisure 0:f5d099885d3d 199 */
Just4pLeisure 0:f5d099885d3d 200 unsigned char tderror(void);
Just4pLeisure 0:f5d099885d3d 201
Just4pLeisure 2:fd026fcfde94 202 enum ErrorType {
Just4pLeisure 2:fd026fcfde94 203 AnyError = 0,
Just4pLeisure 2:fd026fcfde94 204 Errors,
Just4pLeisure 2:fd026fcfde94 205 Warnings,
Just4pLeisure 2:fd026fcfde94 206 Rx1Ovr,
Just4pLeisure 2:fd026fcfde94 207 Rx0Ovr,
Just4pLeisure 2:fd026fcfde94 208 TxBOff,
Just4pLeisure 2:fd026fcfde94 209 TxPasv,
Just4pLeisure 2:fd026fcfde94 210 RxPasv,
Just4pLeisure 2:fd026fcfde94 211 TxWarn,
Just4pLeisure 2:fd026fcfde94 212 RxWarn,
Just4pLeisure 2:fd026fcfde94 213 EWarn
Just4pLeisure 2:fd026fcfde94 214 };
Just4pLeisure 2:fd026fcfde94 215
Just4pLeisure 1:ad71faa09868 216 /** Check if any type of error has been detected on the CAN bus
Just4pLeisure 0:f5d099885d3d 217 *
Just4pLeisure 2:fd026fcfde94 218 * @param error Specify which type of error to report on, @b default: @p AnyError.
Just4pLeisure 2:fd026fcfde94 219 * @n @p SEEED_CAN::AnyError - Any one or more of the following errors and warnings:
Just4pLeisure 2:fd026fcfde94 220 * @n @p SEEED_CAN::Errors - Any one or more of the 5 errors:
Just4pLeisure 2:fd026fcfde94 221 * @n @p SEEED_CAN::Rx1Ovr - Receive Buffer 1 Overflow Flag bit,
Just4pLeisure 2:fd026fcfde94 222 * @n @p SEEED_CAN::Rx0Ovr - Receive Buffer 0 Overflow Flag bit,
Just4pLeisure 2:fd026fcfde94 223 * @n @p SEEED_CAN::TxBOff - Bus-Off Error Flag bit,
Just4pLeisure 2:fd026fcfde94 224 * @n @p SEEED_CAN::TxPasv - Transmit Error-Passive Flag bit,
Just4pLeisure 2:fd026fcfde94 225 * @n @p SEEED_CAN::RxPasv - Receive Error-Passive Flag bit,
Just4pLeisure 2:fd026fcfde94 226 * @n @p SEEED_CAN::Warnings - Any one or more of the 3 warnings:
Just4pLeisure 2:fd026fcfde94 227 * @n @p SEEED_CAN::TxWarn - Transmit Error Warning Flag bit,
Just4pLeisure 2:fd026fcfde94 228 * @n @p SEEED_CAN::RxWarn - Receive Error Warning Flag bit,
Just4pLeisure 2:fd026fcfde94 229 * @n @p SEEED_CAN::EWarn - Error Warning Flag bit.
Just4pLeisure 2:fd026fcfde94 230 *
Just4pLeisure 0:f5d099885d3d 231 * @returns
Just4pLeisure 2:fd026fcfde94 232 * 1 if specified type of error has been detected
Just4pLeisure 2:fd026fcfde94 233 * @n 0 if no errors
Just4pLeisure 0:f5d099885d3d 234 */
Just4pLeisure 2:fd026fcfde94 235 int errors(ErrorType type = AnyError);
Just4pLeisure 0:f5d099885d3d 236
Just4pLeisure 2:fd026fcfde94 237 /** Returns the contents of the MCP2515's Error Flag register
Just4pLeisure 0:f5d099885d3d 238 *
Just4pLeisure 0:f5d099885d3d 239 * @returns
Just4pLeisure 2:fd026fcfde94 240 * @b Bit_7 - RX1OVR: Receive Buffer 1 Overflow Flag bit - Set when a valid message is received for RXB1 and CANINTF.RX1IF = 1 - Must be reset by MCU,
Just4pLeisure 2:fd026fcfde94 241 * @n @b Bit_6 - RX0OVR: Receive Buffer 1 Overflow Flag bit - Set when a valid message is received for RXB0 and CANINTF.RX0IF = 1 - Must be reset by MCU,
Just4pLeisure 2:fd026fcfde94 242 * @n @b Bit_5 - TXBO: Bus-Off Error Flag bit - Bit set when TEC reaches 255 - Reset after a successful bus recovery sequence,
Just4pLeisure 2:fd026fcfde94 243 * @n @b Bit_4 - TXEP: Transmit Error-Passive Flag bit - Set when TEC is >= 128 - Reset when TEC is less than 128,
Just4pLeisure 2:fd026fcfde94 244 * @n @b Bit_3 - RXEP: Receive Error-Passive Flag bit - Set when REC is >= 128 - Reset when REC is less than 128,
Just4pLeisure 2:fd026fcfde94 245 * @n @b Bit_2 - TXWAR: Transmit Error Warning Flag bit - Set when TEC is >= 96 - Reset when TEC is less than 96,
Just4pLeisure 2:fd026fcfde94 246 * @n @b Bit_1 - RXWAR: Receive Error Warning Flag bit - Set when REC is >= 96 - Reset when REC is less than 96,
Just4pLeisure 2:fd026fcfde94 247 * @n @b Bit_0 - EWARN: Error Warning Flag bit - Set when TEC or REC is >= 96 (TXWAR or RXWAR = 1) - Reset when both REC and TEC are < 96.
Just4pLeisure 0:f5d099885d3d 248 */
Just4pLeisure 2:fd026fcfde94 249 unsigned char errorFlags(void);
Just4pLeisure 0:f5d099885d3d 250
Just4pLeisure 0:f5d099885d3d 251 enum IrqType {
Just4pLeisure 2:fd026fcfde94 252 None = 0,
Just4pLeisure 2:fd026fcfde94 253 AnyIrq,
Just4pLeisure 2:fd026fcfde94 254 RxAny,
Just4pLeisure 2:fd026fcfde94 255 TxAny,
Just4pLeisure 2:fd026fcfde94 256 Rx0Fill,
Just4pLeisure 2:fd026fcfde94 257 Rx1Full,
Just4pLeisure 2:fd026fcfde94 258 Tx0Free,
Just4pLeisure 2:fd026fcfde94 259 Tx1Free,
Just4pLeisure 2:fd026fcfde94 260 Tx2Free,
Just4pLeisure 2:fd026fcfde94 261 Error,
Just4pLeisure 2:fd026fcfde94 262 Wake,
Just4pLeisure 2:fd026fcfde94 263 MsgError,
Just4pLeisure 0:f5d099885d3d 264 };
Just4pLeisure 0:f5d099885d3d 265
Just4pLeisure 1:ad71faa09868 266 /** Attach a function to call whenever a CAN frame received interrupt is generated.
Just4pLeisure 0:f5d099885d3d 267 *
Just4pLeisure 2:fd026fcfde94 268 * @param fptr A pointer to a void function, or 0 to set as none.
Just4pLeisure 2:fd026fcfde94 269 * @param event Which CAN interrupt to attach the member function to, @b default: @p RxAny
Just4pLeisure 2:fd026fcfde94 270 * @n @p SEEED_CAN::None - Disable all interrupt sources,
Just4pLeisure 2:fd026fcfde94 271 * @n @p SEEED_CAN::AnyIrq - Enable all interrupt sources,
Just4pLeisure 2:fd026fcfde94 272 * @n @p SEEED_CAN::RxAny - Any full RX buffer can generate an interrupt,
Just4pLeisure 2:fd026fcfde94 273 * @n @p SEEED_CAN::TxAny - Any empty TX buffer can generate an interrupt,
Just4pLeisure 2:fd026fcfde94 274 * @n @p SEEED_CAN::Rx0Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 275 * @n @p SEEED_CAN::Rx1Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 276 * @n @p SEEED_CAN::Tx0Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 277 * @n @p SEEED_CAN::Tx1Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 278 * @n @p SEEED_CAN::Tx2Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 279 * @n @p SEEED_CAN::Error - Error (multiple sources in EFLG register),
Just4pLeisure 2:fd026fcfde94 280 * @n @p SEEED_CAN::Wake - Wakeup,
Just4pLeisure 2:fd026fcfde94 281 * @n @p SEEED_CAN::MsgError - Message Error,
Just4pLeisure 0:f5d099885d3d 282 */
Just4pLeisure 2:fd026fcfde94 283 void attach(void (*fptr)(void), IrqType event=RxAny);
Just4pLeisure 0:f5d099885d3d 284
Just4pLeisure 1:ad71faa09868 285 /** Attach a member function to call whenever a CAN frame received interrupt is generated.
Just4pLeisure 0:f5d099885d3d 286 *
Just4pLeisure 2:fd026fcfde94 287 * @param tptr pointer to the object to call the member function on.
Just4pLeisure 2:fd026fcfde94 288 * @param mptr pointer to the member function to be called.
Just4pLeisure 2:fd026fcfde94 289 * @param event Which CAN interrupt to attach the member function to, @b default: @p RxAny
Just4pLeisure 2:fd026fcfde94 290 * @n @p SEEED_CAN::None - Disable all interrupt sources,
Just4pLeisure 2:fd026fcfde94 291 * @n @p SEEED_CAN::AnyIrq - Enable all interrupt sources,
Just4pLeisure 2:fd026fcfde94 292 * @n @p SEEED_CAN::RxAny - Any full RX buffer can generate an interrupt,
Just4pLeisure 2:fd026fcfde94 293 * @n @p SEEED_CAN::TxAny - Any empty TX buffer can generate an interrupt,
Just4pLeisure 2:fd026fcfde94 294 * @n @p SEEED_CAN::Rx0Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 295 * @n @p SEEED_CAN::Rx1Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 296 * @n @p SEEED_CAN::Tx0Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 297 * @n @p SEEED_CAN::Tx1Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 298 * @n @p SEEED_CAN::Tx2Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 299 * @n @p SEEED_CAN::Error - Error (multiple sources in EFLG register),
Just4pLeisure 2:fd026fcfde94 300 * @n @p SEEED_CAN::Wake - Wakeup,
Just4pLeisure 2:fd026fcfde94 301 * @n @p SEEED_CAN::MsgError - Message Error,
Just4pLeisure 0:f5d099885d3d 302 */
Just4pLeisure 0:f5d099885d3d 303 template<typename T>
Just4pLeisure 2:fd026fcfde94 304 void attach(T* tptr, void (T::*mptr)(void), IrqType event=RxAny) {
Just4pLeisure 1:ad71faa09868 305 _callback_irq.attach(tptr, mptr);
Just4pLeisure 2:fd026fcfde94 306 mcpSetInterrupts(&_can, (CANIrqs)event);
Just4pLeisure 2:fd026fcfde94 307 if((mptr != NULL) && (tptr != NULL)) {
Just4pLeisure 2:fd026fcfde94 308 _callback_irq.attach(tptr, mptr);
Just4pLeisure 2:fd026fcfde94 309 mcpSetInterrupts(&_can, (CANIrqs)event);
Just4pLeisure 2:fd026fcfde94 310 // _irq[type].attach(tptr, mptr);
Just4pLeisure 2:fd026fcfde94 311 // can_irq_set(&_can, (CanIrqType)type, 1);
Just4pLeisure 2:fd026fcfde94 312 } else {
Just4pLeisure 2:fd026fcfde94 313 mcpSetInterrupts(&_can, (CANIrqs)SEEED_CAN::None);
Just4pLeisure 2:fd026fcfde94 314 // can_irq_set(&_can, (CanIrqType)type, 0);
Just4pLeisure 2:fd026fcfde94 315 }
Just4pLeisure 0:f5d099885d3d 316 }
Just4pLeisure 0:f5d099885d3d 317
Just4pLeisure 2:fd026fcfde94 318 void call_irq(void);
Just4pLeisure 1:ad71faa09868 319
Just4pLeisure 2:fd026fcfde94 320 /** Check if the specified interrupt event has occurred
Just4pLeisure 2:fd026fcfde94 321 *
Just4pLeisure 2:fd026fcfde94 322 * @param event Which CAN interrupt to attach the member function to
Just4pLeisure 2:fd026fcfde94 323 * @n @p SEEED_CAN::RxAny - At least 1 RX buffer is full,
Just4pLeisure 2:fd026fcfde94 324 * @n @p SEEED_CAN::TxAny - At least 1 TX buffer is empty,
Just4pLeisure 2:fd026fcfde94 325 * @n @p SEEED_CAN::Rx0Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 326 * @n @p SEEED_CAN::Rx1Full - Receive buffer 1 full,
Just4pLeisure 2:fd026fcfde94 327 * @n @p SEEED_CAN::Tx0Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 328 * @n @p SEEED_CAN::Tx1Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 329 * @n @p SEEED_CAN::Tx2Free - Transmit buffer 2 empty,
Just4pLeisure 2:fd026fcfde94 330 * @n @p SEEED_CAN::Error - Error (multiple sources in EFLG register),
Just4pLeisure 2:fd026fcfde94 331 * @n @p SEEED_CAN::Wake - Wakeup,
Just4pLeisure 2:fd026fcfde94 332 * @n @p SEEED_CAN::MsgError - Message Error,
Just4pLeisure 2:fd026fcfde94 333 *
Just4pLeisure 2:fd026fcfde94 334 * @returns
Just4pLeisure 2:fd026fcfde94 335 * 1 if specified interrupt event has occurred
Just4pLeisure 2:fd026fcfde94 336 * @n 0 if no errors
Just4pLeisure 2:fd026fcfde94 337 */
Just4pLeisure 2:fd026fcfde94 338 int interrupts(IrqType type);
Just4pLeisure 2:fd026fcfde94 339
Just4pLeisure 2:fd026fcfde94 340 /** Returns the contents of the MCP2515's Interrupt Flag register
Just4pLeisure 2:fd026fcfde94 341 *
Just4pLeisure 2:fd026fcfde94 342 * @returns
Just4pLeisure 2:fd026fcfde94 343 * @b Bit_7 - MERRF: Message Error Interrupt Flag,
Just4pLeisure 2:fd026fcfde94 344 * @n @b Bit_6 - WAKIF: Wake-up Interrupt Flag,
Just4pLeisure 2:fd026fcfde94 345 * @n @b Bit_5 - ERRIF: Error Interrupt Flag (multiple sources in EFLG register, see errorFlags)
Just4pLeisure 2:fd026fcfde94 346 * @n @b Bit_4 - TX2IF: Transmit Buffer 2 Empty Interrupt Flag
Just4pLeisure 2:fd026fcfde94 347 * @n @b Bit_3 - TX1IF: Transmit Buffer 1 Empty Interrupt Flag
Just4pLeisure 2:fd026fcfde94 348 * @n @b Bit_2 - TX0IF: Transmit Buffer 0 Empty Interrupt Flag
Just4pLeisure 2:fd026fcfde94 349 * @n @b Bit_1 - RX1IF: Receive Buffer 1 Full Interrupt Flag
Just4pLeisure 2:fd026fcfde94 350 * @n @b Bit_0 - RX0IF: Receive Buffer 0 Full Interrupt Flag
Just4pLeisure 2:fd026fcfde94 351 * @n Bits are set (1) when interrupt pending, clear (0) when no interrupt pending.
Just4pLeisure 2:fd026fcfde94 352 * @n Bits must be cleared by MCU to reset interrupt condition.
Just4pLeisure 2:fd026fcfde94 353 */
Just4pLeisure 2:fd026fcfde94 354 unsigned char interruptFlags(void);
Just4pLeisure 2:fd026fcfde94 355
Just4pLeisure 0:f5d099885d3d 356 protected:
Just4pLeisure 1:ad71faa09868 357 SPI _spi;
Just4pLeisure 2:fd026fcfde94 358 mcp_can_t _can;
Just4pLeisure 2:fd026fcfde94 359 InterruptIn _irqpin;
Just4pLeisure 1:ad71faa09868 360 FunctionPointer _callback_irq;
Just4pLeisure 0:f5d099885d3d 361
Just4pLeisure 0:f5d099885d3d 362 };
Just4pLeisure 0:f5d099885d3d 363
Just4pLeisure 0:f5d099885d3d 364 #endif // SEEED_CAN_H