temp

Dependencies:   mbed SDFileSystem MS5607 ADXL345_I2C FATFileSystem

Committer:
IKobayashi
Date:
Mon Mar 16 23:37:42 2020 +0900
Revision:
0:c88c3b616c00
copy

Who changed what in which revision?

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