Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
Child:
1:9db0e321a9f4
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /* mbed Microcontroller Library
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2006-2013 ARM Limited
kenjiArai 0:5b88d5760320 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 4 *
kenjiArai 0:5b88d5760320 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 6 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 7 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 8 *
kenjiArai 0:5b88d5760320 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 14 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 15 * limitations under the License.
kenjiArai 0:5b88d5760320 16 */
kenjiArai 0:5b88d5760320 17 #ifndef MBED_CAN_H
kenjiArai 0:5b88d5760320 18 #define MBED_CAN_H
kenjiArai 0:5b88d5760320 19
kenjiArai 0:5b88d5760320 20 #include "platform/platform.h"
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #if DEVICE_CAN || defined(DOXYGEN_ONLY)
kenjiArai 0:5b88d5760320 23
kenjiArai 0:5b88d5760320 24 #include "hal/can_api.h"
kenjiArai 0:5b88d5760320 25 #include "platform/Callback.h"
kenjiArai 0:5b88d5760320 26 #include "platform/PlatformMutex.h"
kenjiArai 0:5b88d5760320 27 #include "platform/NonCopyable.h"
kenjiArai 0:5b88d5760320 28
kenjiArai 0:5b88d5760320 29 namespace mbed {
kenjiArai 0:5b88d5760320 30 /** \addtogroup drivers */
kenjiArai 0:5b88d5760320 31
kenjiArai 0:5b88d5760320 32 /** CANMessage class
kenjiArai 0:5b88d5760320 33 *
kenjiArai 0:5b88d5760320 34 * @note Synchronization level: Thread safe
kenjiArai 0:5b88d5760320 35 * @ingroup drivers
kenjiArai 0:5b88d5760320 36 */
kenjiArai 0:5b88d5760320 37 class CANMessage : public CAN_Message {
kenjiArai 0:5b88d5760320 38
kenjiArai 0:5b88d5760320 39 public:
kenjiArai 0:5b88d5760320 40 /** Creates empty CAN message.
kenjiArai 0:5b88d5760320 41 */
kenjiArai 0:5b88d5760320 42 CANMessage() : CAN_Message()
kenjiArai 0:5b88d5760320 43 {
kenjiArai 0:5b88d5760320 44 len = 8U;
kenjiArai 0:5b88d5760320 45 type = CANData;
kenjiArai 0:5b88d5760320 46 format = CANStandard;
kenjiArai 0:5b88d5760320 47 id = 0U;
kenjiArai 0:5b88d5760320 48 memset(data, 0, 8);
kenjiArai 0:5b88d5760320 49 }
kenjiArai 0:5b88d5760320 50
kenjiArai 0:5b88d5760320 51 /** Creates CAN message with specific content.
kenjiArai 0:5b88d5760320 52 *
kenjiArai 0:5b88d5760320 53 * @param _id Message ID
kenjiArai 0:5b88d5760320 54 * @param _data Mesaage Data
kenjiArai 0:5b88d5760320 55 * @param _len Message Data length
kenjiArai 0:5b88d5760320 56 * @param _type Type of Data: Use enum CANType for valid parameter values
kenjiArai 0:5b88d5760320 57 * @param _format Data Format: Use enum CANFormat for valid parameter values
kenjiArai 0:5b88d5760320 58 */
kenjiArai 0:5b88d5760320 59 CANMessage(unsigned int _id, const unsigned char *_data, unsigned char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard)
kenjiArai 0:5b88d5760320 60 {
kenjiArai 0:5b88d5760320 61 len = _len & 0xF;
kenjiArai 0:5b88d5760320 62 type = _type;
kenjiArai 0:5b88d5760320 63 format = _format;
kenjiArai 0:5b88d5760320 64 id = _id;
kenjiArai 0:5b88d5760320 65 memcpy(data, _data, _len);
kenjiArai 0:5b88d5760320 66 }
kenjiArai 0:5b88d5760320 67
kenjiArai 0:5b88d5760320 68
kenjiArai 0:5b88d5760320 69 /** Creates CAN message with specific content.
kenjiArai 0:5b88d5760320 70 *
kenjiArai 0:5b88d5760320 71 * @param _id Message ID
kenjiArai 0:5b88d5760320 72 * @param _data Mesaage Data
kenjiArai 0:5b88d5760320 73 * @param _len Message Data length
kenjiArai 0:5b88d5760320 74 * @param _type Type of Data: Use enum CANType for valid parameter values
kenjiArai 0:5b88d5760320 75 * @param _format Data Format: Use enum CANFormat for valid parameter values
kenjiArai 0:5b88d5760320 76 */
kenjiArai 0:5b88d5760320 77 CANMessage(unsigned int _id, const char *_data, unsigned char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard)
kenjiArai 0:5b88d5760320 78 {
kenjiArai 0:5b88d5760320 79 len = _len & 0xF;
kenjiArai 0:5b88d5760320 80 type = _type;
kenjiArai 0:5b88d5760320 81 format = _format;
kenjiArai 0:5b88d5760320 82 id = _id;
kenjiArai 0:5b88d5760320 83 memcpy(data, _data, _len);
kenjiArai 0:5b88d5760320 84 }
kenjiArai 0:5b88d5760320 85
kenjiArai 0:5b88d5760320 86 /** Creates CAN remote message.
kenjiArai 0:5b88d5760320 87 *
kenjiArai 0:5b88d5760320 88 * @param _id Message ID
kenjiArai 0:5b88d5760320 89 * @param _format Data Format: Use enum CANType for valid parameter values
kenjiArai 0:5b88d5760320 90 */
kenjiArai 0:5b88d5760320 91 CANMessage(unsigned int _id, CANFormat _format = CANStandard)
kenjiArai 0:5b88d5760320 92 {
kenjiArai 0:5b88d5760320 93 len = 0;
kenjiArai 0:5b88d5760320 94 type = CANRemote;
kenjiArai 0:5b88d5760320 95 format = _format;
kenjiArai 0:5b88d5760320 96 id = _id;
kenjiArai 0:5b88d5760320 97 memset(data, 0, 8);
kenjiArai 0:5b88d5760320 98 }
kenjiArai 0:5b88d5760320 99 };
kenjiArai 0:5b88d5760320 100
kenjiArai 0:5b88d5760320 101 /** A can bus client, used for communicating with can devices
kenjiArai 0:5b88d5760320 102 * @ingroup drivers
kenjiArai 0:5b88d5760320 103 */
kenjiArai 0:5b88d5760320 104 class CAN : private NonCopyable<CAN> {
kenjiArai 0:5b88d5760320 105
kenjiArai 0:5b88d5760320 106 public:
kenjiArai 0:5b88d5760320 107 /** Creates a CAN interface connected to specific pins.
kenjiArai 0:5b88d5760320 108 *
kenjiArai 0:5b88d5760320 109 * @param rd read from transmitter
kenjiArai 0:5b88d5760320 110 * @param td transmit to transmitter
kenjiArai 0:5b88d5760320 111 *
kenjiArai 0:5b88d5760320 112 * Example:
kenjiArai 0:5b88d5760320 113 * @code
kenjiArai 0:5b88d5760320 114 * #include "mbed.h"
kenjiArai 0:5b88d5760320 115 *
kenjiArai 0:5b88d5760320 116 *
kenjiArai 0:5b88d5760320 117 * Ticker ticker;
kenjiArai 0:5b88d5760320 118 * DigitalOut led1(LED1);
kenjiArai 0:5b88d5760320 119 * DigitalOut led2(LED2);
kenjiArai 0:5b88d5760320 120 * //The constructor takes in RX, and TX pin respectively.
kenjiArai 0:5b88d5760320 121 * //These pins, for this example, are defined in mbed_app.json
kenjiArai 0:5b88d5760320 122 * CAN can1(MBED_CONF_APP_CAN1_RD, MBED_CONF_APP_CAN1_TD);
kenjiArai 0:5b88d5760320 123 * CAN can2(MBED_CONF_APP_CAN2_RD, MBED_CONF_APP_CAN2_TD);
kenjiArai 0:5b88d5760320 124 *
kenjiArai 0:5b88d5760320 125 * unsigned char counter = 0;
kenjiArai 0:5b88d5760320 126 *
kenjiArai 0:5b88d5760320 127 * void send() {
kenjiArai 0:5b88d5760320 128 * if(can1.write(CANMessage(1337U, &counter, 1))) {
kenjiArai 0:5b88d5760320 129 * printf("Message sent: %d\n", counter);
kenjiArai 0:5b88d5760320 130 * counter++;
kenjiArai 0:5b88d5760320 131 * }
kenjiArai 0:5b88d5760320 132 * led1 = !led1;
kenjiArai 0:5b88d5760320 133 * }
kenjiArai 0:5b88d5760320 134 *
kenjiArai 0:5b88d5760320 135 * int main() {
kenjiArai 0:5b88d5760320 136 * ticker.attach(&send, 1);
kenjiArai 0:5b88d5760320 137 * CANMessage msg;
kenjiArai 0:5b88d5760320 138 * while(1) {
kenjiArai 0:5b88d5760320 139 * if(can2.read(msg)) {
kenjiArai 0:5b88d5760320 140 * printf("Message received: %d\n\n", msg.data[0]);
kenjiArai 0:5b88d5760320 141 * led2 = !led2;
kenjiArai 0:5b88d5760320 142 * }
kenjiArai 0:5b88d5760320 143 * wait(0.2);
kenjiArai 0:5b88d5760320 144 * }
kenjiArai 0:5b88d5760320 145 * }
kenjiArai 0:5b88d5760320 146 *
kenjiArai 0:5b88d5760320 147 * @endcode
kenjiArai 0:5b88d5760320 148 */
kenjiArai 0:5b88d5760320 149 CAN(PinName rd, PinName td);
kenjiArai 0:5b88d5760320 150
kenjiArai 0:5b88d5760320 151 /** Initialize CAN interface and set the frequency
kenjiArai 0:5b88d5760320 152 *
kenjiArai 0:5b88d5760320 153 * @param rd the read pin
kenjiArai 0:5b88d5760320 154 * @param td the transmit pin
kenjiArai 0:5b88d5760320 155 * @param hz the bus frequency in hertz
kenjiArai 0:5b88d5760320 156 */
kenjiArai 0:5b88d5760320 157 CAN(PinName rd, PinName td, int hz);
kenjiArai 0:5b88d5760320 158
kenjiArai 0:5b88d5760320 159 virtual ~CAN();
kenjiArai 0:5b88d5760320 160
kenjiArai 0:5b88d5760320 161 /** Set the frequency of the CAN interface
kenjiArai 0:5b88d5760320 162 *
kenjiArai 0:5b88d5760320 163 * @param hz The bus frequency in hertz
kenjiArai 0:5b88d5760320 164 *
kenjiArai 0:5b88d5760320 165 * @returns
kenjiArai 0:5b88d5760320 166 * 1 if successful,
kenjiArai 0:5b88d5760320 167 * 0 otherwise
kenjiArai 0:5b88d5760320 168 */
kenjiArai 0:5b88d5760320 169 int frequency(int hz);
kenjiArai 0:5b88d5760320 170
kenjiArai 0:5b88d5760320 171 /** Write a CANMessage to the bus.
kenjiArai 0:5b88d5760320 172 *
kenjiArai 0:5b88d5760320 173 * @param msg The CANMessage to write.
kenjiArai 0:5b88d5760320 174 *
kenjiArai 0:5b88d5760320 175 * @returns
kenjiArai 0:5b88d5760320 176 * 0 if write failed,
kenjiArai 0:5b88d5760320 177 * 1 if write was successful
kenjiArai 0:5b88d5760320 178 */
kenjiArai 0:5b88d5760320 179 int write(CANMessage msg);
kenjiArai 0:5b88d5760320 180
kenjiArai 0:5b88d5760320 181 /** Read a CANMessage from the bus.
kenjiArai 0:5b88d5760320 182 *
kenjiArai 0:5b88d5760320 183 * @param msg A CANMessage to read to.
kenjiArai 0:5b88d5760320 184 * @param handle message filter handle (0 for any message)
kenjiArai 0:5b88d5760320 185 *
kenjiArai 0:5b88d5760320 186 * @returns
kenjiArai 0:5b88d5760320 187 * 0 if no message arrived,
kenjiArai 0:5b88d5760320 188 * 1 if message arrived
kenjiArai 0:5b88d5760320 189 */
kenjiArai 0:5b88d5760320 190 int read(CANMessage &msg, int handle = 0);
kenjiArai 0:5b88d5760320 191
kenjiArai 0:5b88d5760320 192 /** Reset CAN interface.
kenjiArai 0:5b88d5760320 193 *
kenjiArai 0:5b88d5760320 194 * To use after error overflow.
kenjiArai 0:5b88d5760320 195 */
kenjiArai 0:5b88d5760320 196 void reset();
kenjiArai 0:5b88d5760320 197
kenjiArai 0:5b88d5760320 198 /** Puts or removes the CAN interface into silent monitoring mode
kenjiArai 0:5b88d5760320 199 *
kenjiArai 0:5b88d5760320 200 * @param silent boolean indicating whether to go into silent mode or not
kenjiArai 0:5b88d5760320 201 */
kenjiArai 0:5b88d5760320 202 void monitor(bool silent);
kenjiArai 0:5b88d5760320 203
kenjiArai 0:5b88d5760320 204 enum Mode {
kenjiArai 0:5b88d5760320 205 Reset = 0,
kenjiArai 0:5b88d5760320 206 Normal,
kenjiArai 0:5b88d5760320 207 Silent,
kenjiArai 0:5b88d5760320 208 LocalTest,
kenjiArai 0:5b88d5760320 209 GlobalTest,
kenjiArai 0:5b88d5760320 210 SilentTest
kenjiArai 0:5b88d5760320 211 };
kenjiArai 0:5b88d5760320 212
kenjiArai 0:5b88d5760320 213 /** Change CAN operation to the specified mode
kenjiArai 0:5b88d5760320 214 *
kenjiArai 0:5b88d5760320 215 * @param mode The new operation mode (CAN::Normal, CAN::Silent, CAN::LocalTest, CAN::GlobalTest, CAN::SilentTest)
kenjiArai 0:5b88d5760320 216 *
kenjiArai 0:5b88d5760320 217 * @returns
kenjiArai 0:5b88d5760320 218 * 0 if mode change failed or unsupported,
kenjiArai 0:5b88d5760320 219 * 1 if mode change was successful
kenjiArai 0:5b88d5760320 220 */
kenjiArai 0:5b88d5760320 221 int mode(Mode mode);
kenjiArai 0:5b88d5760320 222
kenjiArai 0:5b88d5760320 223 /** Filter out incoming messages
kenjiArai 0:5b88d5760320 224 *
kenjiArai 0:5b88d5760320 225 * @param id the id to filter on
kenjiArai 0:5b88d5760320 226 * @param mask the mask applied to the id
kenjiArai 0:5b88d5760320 227 * @param format format to filter on (Default CANAny)
kenjiArai 0:5b88d5760320 228 * @param handle message filter handle (Optional)
kenjiArai 0:5b88d5760320 229 *
kenjiArai 0:5b88d5760320 230 * @returns
kenjiArai 0:5b88d5760320 231 * 0 if filter change failed or unsupported,
kenjiArai 0:5b88d5760320 232 * new filter handle if successful
kenjiArai 0:5b88d5760320 233 */
kenjiArai 0:5b88d5760320 234 int filter(unsigned int id, unsigned int mask, CANFormat format = CANAny, int handle = 0);
kenjiArai 0:5b88d5760320 235
kenjiArai 0:5b88d5760320 236 /** Detects read errors - Used to detect read overflow errors.
kenjiArai 0:5b88d5760320 237 *
kenjiArai 0:5b88d5760320 238 * @returns number of read errors
kenjiArai 0:5b88d5760320 239 */
kenjiArai 0:5b88d5760320 240 unsigned char rderror();
kenjiArai 0:5b88d5760320 241
kenjiArai 0:5b88d5760320 242 /** Detects write errors - Used to detect write overflow errors.
kenjiArai 0:5b88d5760320 243 *
kenjiArai 0:5b88d5760320 244 * @returns number of write errors
kenjiArai 0:5b88d5760320 245 */
kenjiArai 0:5b88d5760320 246 unsigned char tderror();
kenjiArai 0:5b88d5760320 247
kenjiArai 0:5b88d5760320 248 enum IrqType {
kenjiArai 0:5b88d5760320 249 RxIrq = 0,
kenjiArai 0:5b88d5760320 250 TxIrq,
kenjiArai 0:5b88d5760320 251 EwIrq,
kenjiArai 0:5b88d5760320 252 DoIrq,
kenjiArai 0:5b88d5760320 253 WuIrq,
kenjiArai 0:5b88d5760320 254 EpIrq,
kenjiArai 0:5b88d5760320 255 AlIrq,
kenjiArai 0:5b88d5760320 256 BeIrq,
kenjiArai 0:5b88d5760320 257 IdIrq,
kenjiArai 0:5b88d5760320 258
kenjiArai 0:5b88d5760320 259 IrqCnt
kenjiArai 0:5b88d5760320 260 };
kenjiArai 0:5b88d5760320 261
kenjiArai 0:5b88d5760320 262 /** Attach a function to call whenever a CAN frame received interrupt is
kenjiArai 0:5b88d5760320 263 * generated.
kenjiArai 0:5b88d5760320 264 *
kenjiArai 0:5b88d5760320 265 * This function locks the deep sleep while a callback is attached
kenjiArai 0:5b88d5760320 266 *
kenjiArai 0:5b88d5760320 267 * @param func A pointer to a void function, or 0 to set as none
kenjiArai 0:5b88d5760320 268 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, CAN::TxIrq for transmitted or aborted, CAN::EwIrq for error warning, CAN::DoIrq for data overrun, CAN::WuIrq for wake-up, CAN::EpIrq for error passive, CAN::AlIrq for arbitration lost, CAN::BeIrq for bus error)
kenjiArai 0:5b88d5760320 269 */
kenjiArai 0:5b88d5760320 270 void attach(Callback<void()> func, IrqType type = RxIrq);
kenjiArai 0:5b88d5760320 271
kenjiArai 0:5b88d5760320 272 /** Attach a member function to call whenever a CAN frame received interrupt
kenjiArai 0:5b88d5760320 273 * is generated.
kenjiArai 0:5b88d5760320 274 *
kenjiArai 0:5b88d5760320 275 * @param obj pointer to the object to call the member function on
kenjiArai 0:5b88d5760320 276 * @param method pointer to the member function to be called
kenjiArai 0:5b88d5760320 277 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
kenjiArai 0:5b88d5760320 278 * @deprecated
kenjiArai 0:5b88d5760320 279 * The attach function does not support cv-qualifiers. Replaced by
kenjiArai 0:5b88d5760320 280 * attach(callback(obj, method), type).
kenjiArai 0:5b88d5760320 281 */
kenjiArai 0:5b88d5760320 282 template<typename T>
kenjiArai 0:5b88d5760320 283 MBED_DEPRECATED_SINCE("mbed-os-5.1",
kenjiArai 0:5b88d5760320 284 "The attach function does not support cv-qualifiers. Replaced by "
kenjiArai 0:5b88d5760320 285 "attach(callback(obj, method), type).")
kenjiArai 0:5b88d5760320 286 void attach(T *obj, void (T::*method)(), IrqType type = RxIrq)
kenjiArai 0:5b88d5760320 287 {
kenjiArai 0:5b88d5760320 288 // Underlying call thread safe
kenjiArai 0:5b88d5760320 289 attach(callback(obj, method), type);
kenjiArai 0:5b88d5760320 290 }
kenjiArai 0:5b88d5760320 291
kenjiArai 0:5b88d5760320 292 /** Attach a member function to call whenever a CAN frame received interrupt
kenjiArai 0:5b88d5760320 293 * is generated.
kenjiArai 0:5b88d5760320 294 *
kenjiArai 0:5b88d5760320 295 * @param obj pointer to the object to call the member function on
kenjiArai 0:5b88d5760320 296 * @param method pointer to the member function to be called
kenjiArai 0:5b88d5760320 297 * @param type Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
kenjiArai 0:5b88d5760320 298 * @deprecated
kenjiArai 0:5b88d5760320 299 * The attach function does not support cv-qualifiers. Replaced by
kenjiArai 0:5b88d5760320 300 * attach(callback(obj, method), type).
kenjiArai 0:5b88d5760320 301 */
kenjiArai 0:5b88d5760320 302 template<typename T>
kenjiArai 0:5b88d5760320 303 MBED_DEPRECATED_SINCE("mbed-os-5.1",
kenjiArai 0:5b88d5760320 304 "The attach function does not support cv-qualifiers. Replaced by "
kenjiArai 0:5b88d5760320 305 "attach(callback(obj, method), type).")
kenjiArai 0:5b88d5760320 306 void attach(T *obj, void (*method)(T *), IrqType type = RxIrq)
kenjiArai 0:5b88d5760320 307 {
kenjiArai 0:5b88d5760320 308 // Underlying call thread safe
kenjiArai 0:5b88d5760320 309 attach(callback(obj, method), type);
kenjiArai 0:5b88d5760320 310 }
kenjiArai 0:5b88d5760320 311
kenjiArai 0:5b88d5760320 312 static void _irq_handler(uint32_t id, CanIrqType type);
kenjiArai 0:5b88d5760320 313
kenjiArai 0:5b88d5760320 314 #if !defined(DOXYGEN_ONLY)
kenjiArai 0:5b88d5760320 315 protected:
kenjiArai 0:5b88d5760320 316 virtual void lock();
kenjiArai 0:5b88d5760320 317 virtual void unlock();
kenjiArai 0:5b88d5760320 318 can_t _can;
kenjiArai 0:5b88d5760320 319 Callback<void()> _irq[IrqCnt];
kenjiArai 0:5b88d5760320 320 PlatformMutex _mutex;
kenjiArai 0:5b88d5760320 321 #endif
kenjiArai 0:5b88d5760320 322 };
kenjiArai 0:5b88d5760320 323
kenjiArai 0:5b88d5760320 324 } // namespace mbed
kenjiArai 0:5b88d5760320 325
kenjiArai 0:5b88d5760320 326 #endif
kenjiArai 0:5b88d5760320 327
kenjiArai 0:5b88d5760320 328 #endif // MBED_CAN_H
kenjiArai 0:5b88d5760320 329