mbed-os for GR-LYCHEE

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

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