Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

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