From Ben Katz mbed-dev library. Removed unnecessary target files to reduce the overall size by a factor of 10 to make it easier to import into the online IDE.

Dependents:   motor_driver motor_driver_screaming_fix

Committer:
saloutos
Date:
Thu Nov 26 04:08:56 2020 +0000
Revision:
0:083111ae2a11
first commit of leaned mbed dev lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
saloutos 0:083111ae2a11 1 /* mbed Microcontroller Library
saloutos 0:083111ae2a11 2 * Copyright (c) 2006-2015 ARM Limited
saloutos 0:083111ae2a11 3 *
saloutos 0:083111ae2a11 4 * Licensed under the Apache License, Version 2.0 (the "License");
saloutos 0:083111ae2a11 5 * you may not use this file except in compliance with the License.
saloutos 0:083111ae2a11 6 * You may obtain a copy of the License at
saloutos 0:083111ae2a11 7 *
saloutos 0:083111ae2a11 8 * http://www.apache.org/licenses/LICENSE-2.0
saloutos 0:083111ae2a11 9 *
saloutos 0:083111ae2a11 10 * Unless required by applicable law or agreed to in writing, software
saloutos 0:083111ae2a11 11 * distributed under the License is distributed on an "AS IS" BASIS,
saloutos 0:083111ae2a11 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
saloutos 0:083111ae2a11 13 * See the License for the specific language governing permissions and
saloutos 0:083111ae2a11 14 * limitations under the License.
saloutos 0:083111ae2a11 15 */
saloutos 0:083111ae2a11 16 #ifndef MBED_I2C_H
saloutos 0:083111ae2a11 17 #define MBED_I2C_H
saloutos 0:083111ae2a11 18
saloutos 0:083111ae2a11 19 #include "platform/platform.h"
saloutos 0:083111ae2a11 20
saloutos 0:083111ae2a11 21 #if defined (DEVICE_I2C) || defined(DOXYGEN_ONLY)
saloutos 0:083111ae2a11 22
saloutos 0:083111ae2a11 23 #include "hal/i2c_api.h"
saloutos 0:083111ae2a11 24 #include "platform/SingletonPtr.h"
saloutos 0:083111ae2a11 25 #include "platform/PlatformMutex.h"
saloutos 0:083111ae2a11 26 #include "platform/NonCopyable.h"
saloutos 0:083111ae2a11 27
saloutos 0:083111ae2a11 28 #if DEVICE_I2C_ASYNCH
saloutos 0:083111ae2a11 29 #include "platform/CThunk.h"
saloutos 0:083111ae2a11 30 #include "hal/dma_api.h"
saloutos 0:083111ae2a11 31 #include "platform/FunctionPointer.h"
saloutos 0:083111ae2a11 32 #endif
saloutos 0:083111ae2a11 33
saloutos 0:083111ae2a11 34 namespace mbed {
saloutos 0:083111ae2a11 35 /** \addtogroup drivers */
saloutos 0:083111ae2a11 36
saloutos 0:083111ae2a11 37 /** An I2C Master, used for communicating with I2C slave devices
saloutos 0:083111ae2a11 38 *
saloutos 0:083111ae2a11 39 * @note Synchronization level: Thread safe
saloutos 0:083111ae2a11 40 *
saloutos 0:083111ae2a11 41 * Example:
saloutos 0:083111ae2a11 42 * @code
saloutos 0:083111ae2a11 43 * // Read from I2C slave at address 0x62
saloutos 0:083111ae2a11 44 *
saloutos 0:083111ae2a11 45 * #include "mbed.h"
saloutos 0:083111ae2a11 46 *
saloutos 0:083111ae2a11 47 * I2C i2c(p28, p27);
saloutos 0:083111ae2a11 48 *
saloutos 0:083111ae2a11 49 * int main() {
saloutos 0:083111ae2a11 50 * int address = 0x62;
saloutos 0:083111ae2a11 51 * char data[2];
saloutos 0:083111ae2a11 52 * i2c.read(address, data, 2);
saloutos 0:083111ae2a11 53 * }
saloutos 0:083111ae2a11 54 * @endcode
saloutos 0:083111ae2a11 55 * @ingroup drivers
saloutos 0:083111ae2a11 56 */
saloutos 0:083111ae2a11 57 class I2C : private NonCopyable<I2C> {
saloutos 0:083111ae2a11 58
saloutos 0:083111ae2a11 59 public:
saloutos 0:083111ae2a11 60 enum RxStatus {
saloutos 0:083111ae2a11 61 NoData,
saloutos 0:083111ae2a11 62 MasterGeneralCall,
saloutos 0:083111ae2a11 63 MasterWrite,
saloutos 0:083111ae2a11 64 MasterRead
saloutos 0:083111ae2a11 65 };
saloutos 0:083111ae2a11 66
saloutos 0:083111ae2a11 67 enum Acknowledge {
saloutos 0:083111ae2a11 68 NoACK = 0,
saloutos 0:083111ae2a11 69 ACK = 1
saloutos 0:083111ae2a11 70 };
saloutos 0:083111ae2a11 71
saloutos 0:083111ae2a11 72 /** Create an I2C Master interface, connected to the specified pins
saloutos 0:083111ae2a11 73 *
saloutos 0:083111ae2a11 74 * @param sda I2C data line pin
saloutos 0:083111ae2a11 75 * @param scl I2C clock line pin
saloutos 0:083111ae2a11 76 */
saloutos 0:083111ae2a11 77 I2C(PinName sda, PinName scl);
saloutos 0:083111ae2a11 78
saloutos 0:083111ae2a11 79 /** Set the frequency of the I2C interface
saloutos 0:083111ae2a11 80 *
saloutos 0:083111ae2a11 81 * @param hz The bus frequency in hertz
saloutos 0:083111ae2a11 82 */
saloutos 0:083111ae2a11 83 void frequency(int hz);
saloutos 0:083111ae2a11 84
saloutos 0:083111ae2a11 85 /** Read from an I2C slave
saloutos 0:083111ae2a11 86 *
saloutos 0:083111ae2a11 87 * Performs a complete read transaction. The bottom bit of
saloutos 0:083111ae2a11 88 * the address is forced to 1 to indicate a read.
saloutos 0:083111ae2a11 89 *
saloutos 0:083111ae2a11 90 * @param address 8-bit I2C slave address [ addr | 1 ]
saloutos 0:083111ae2a11 91 * @param data Pointer to the byte-array to read data in to
saloutos 0:083111ae2a11 92 * @param length Number of bytes to read
saloutos 0:083111ae2a11 93 * @param repeated Repeated start, true - don't send stop at end
saloutos 0:083111ae2a11 94 *
saloutos 0:083111ae2a11 95 * @returns
saloutos 0:083111ae2a11 96 * 0 on success (ack),
saloutos 0:083111ae2a11 97 * non-0 on failure (nack)
saloutos 0:083111ae2a11 98 */
saloutos 0:083111ae2a11 99 int read(int address, char *data, int length, bool repeated = false);
saloutos 0:083111ae2a11 100
saloutos 0:083111ae2a11 101 /** Read a single byte from the I2C bus
saloutos 0:083111ae2a11 102 *
saloutos 0:083111ae2a11 103 * @param ack indicates if the byte is to be acknowledged (1 = acknowledge)
saloutos 0:083111ae2a11 104 *
saloutos 0:083111ae2a11 105 * @returns
saloutos 0:083111ae2a11 106 * the byte read
saloutos 0:083111ae2a11 107 */
saloutos 0:083111ae2a11 108 int read(int ack);
saloutos 0:083111ae2a11 109
saloutos 0:083111ae2a11 110 /** Write to an I2C slave
saloutos 0:083111ae2a11 111 *
saloutos 0:083111ae2a11 112 * Performs a complete write transaction. The bottom bit of
saloutos 0:083111ae2a11 113 * the address is forced to 0 to indicate a write.
saloutos 0:083111ae2a11 114 *
saloutos 0:083111ae2a11 115 * @param address 8-bit I2C slave address [ addr | 0 ]
saloutos 0:083111ae2a11 116 * @param data Pointer to the byte-array data to send
saloutos 0:083111ae2a11 117 * @param length Number of bytes to send
saloutos 0:083111ae2a11 118 * @param repeated Repeated start, true - do not send stop at end
saloutos 0:083111ae2a11 119 *
saloutos 0:083111ae2a11 120 * @returns
saloutos 0:083111ae2a11 121 * 0 on success (ack),
saloutos 0:083111ae2a11 122 * non-0 on failure (nack)
saloutos 0:083111ae2a11 123 */
saloutos 0:083111ae2a11 124 int write(int address, const char *data, int length, bool repeated = false);
saloutos 0:083111ae2a11 125
saloutos 0:083111ae2a11 126 /** Write single byte out on the I2C bus
saloutos 0:083111ae2a11 127 *
saloutos 0:083111ae2a11 128 * @param data data to write out on bus
saloutos 0:083111ae2a11 129 *
saloutos 0:083111ae2a11 130 * @returns
saloutos 0:083111ae2a11 131 * '0' - NAK was received
saloutos 0:083111ae2a11 132 * '1' - ACK was received,
saloutos 0:083111ae2a11 133 * '2' - timeout
saloutos 0:083111ae2a11 134 */
saloutos 0:083111ae2a11 135 int write(int data);
saloutos 0:083111ae2a11 136
saloutos 0:083111ae2a11 137 /** Creates a start condition on the I2C bus
saloutos 0:083111ae2a11 138 */
saloutos 0:083111ae2a11 139
saloutos 0:083111ae2a11 140 void start(void);
saloutos 0:083111ae2a11 141
saloutos 0:083111ae2a11 142 /** Creates a stop condition on the I2C bus
saloutos 0:083111ae2a11 143 */
saloutos 0:083111ae2a11 144 void stop(void);
saloutos 0:083111ae2a11 145
saloutos 0:083111ae2a11 146 /** Acquire exclusive access to this I2C bus
saloutos 0:083111ae2a11 147 */
saloutos 0:083111ae2a11 148 virtual void lock(void);
saloutos 0:083111ae2a11 149
saloutos 0:083111ae2a11 150 /** Release exclusive access to this I2C bus
saloutos 0:083111ae2a11 151 */
saloutos 0:083111ae2a11 152 virtual void unlock(void);
saloutos 0:083111ae2a11 153
saloutos 0:083111ae2a11 154 virtual ~I2C() {
saloutos 0:083111ae2a11 155 // Do nothing
saloutos 0:083111ae2a11 156 }
saloutos 0:083111ae2a11 157
saloutos 0:083111ae2a11 158 #if DEVICE_I2C_ASYNCH
saloutos 0:083111ae2a11 159
saloutos 0:083111ae2a11 160 /** Start non-blocking I2C transfer.
saloutos 0:083111ae2a11 161 *
saloutos 0:083111ae2a11 162 * This function locks the deep sleep until any event has occured
saloutos 0:083111ae2a11 163 *
saloutos 0:083111ae2a11 164 * @param address 8/10 bit I2c slave address
saloutos 0:083111ae2a11 165 * @param tx_buffer The TX buffer with data to be transfered
saloutos 0:083111ae2a11 166 * @param tx_length The length of TX buffer in bytes
saloutos 0:083111ae2a11 167 * @param rx_buffer The RX buffer which is used for received data
saloutos 0:083111ae2a11 168 * @param rx_length The length of RX buffer in bytes
saloutos 0:083111ae2a11 169 * @param event The logical OR of events to modify
saloutos 0:083111ae2a11 170 * @param callback The event callback function
saloutos 0:083111ae2a11 171 * @param repeated Repeated start, true - do not send stop at end
saloutos 0:083111ae2a11 172 * @return Zero if the transfer has started, or -1 if I2C peripheral is busy
saloutos 0:083111ae2a11 173 */
saloutos 0:083111ae2a11 174 int transfer(int address, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t& callback, int event = I2C_EVENT_TRANSFER_COMPLETE, bool repeated = false);
saloutos 0:083111ae2a11 175
saloutos 0:083111ae2a11 176 /** Abort the on-going I2C transfer
saloutos 0:083111ae2a11 177 */
saloutos 0:083111ae2a11 178 void abort_transfer();
saloutos 0:083111ae2a11 179 protected:
saloutos 0:083111ae2a11 180 void irq_handler_asynch(void);
saloutos 0:083111ae2a11 181 event_callback_t _callback;
saloutos 0:083111ae2a11 182 CThunk<I2C> _irq;
saloutos 0:083111ae2a11 183 DMAUsage _usage;
saloutos 0:083111ae2a11 184 #endif
saloutos 0:083111ae2a11 185
saloutos 0:083111ae2a11 186 protected:
saloutos 0:083111ae2a11 187 void aquire();
saloutos 0:083111ae2a11 188
saloutos 0:083111ae2a11 189 i2c_t _i2c;
saloutos 0:083111ae2a11 190 static I2C *_owner;
saloutos 0:083111ae2a11 191 int _hz;
saloutos 0:083111ae2a11 192 static SingletonPtr<PlatformMutex> _mutex;
saloutos 0:083111ae2a11 193 };
saloutos 0:083111ae2a11 194
saloutos 0:083111ae2a11 195 } // namespace mbed
saloutos 0:083111ae2a11 196
saloutos 0:083111ae2a11 197 #endif
saloutos 0:083111ae2a11 198
saloutos 0:083111ae2a11 199 #endif