Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

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