This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

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