CDY version that shares functionality with Counter

Dependencies:   SDFileSystem_HelloWorld mbed FATFileSystem

Committer:
Charles David Young
Date:
Sun Nov 04 18:44:51 2018 -0700
Revision:
0:aa13e1c335cd
create new repo for show2me

Who changed what in which revision?

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