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
IKobayashi 0:c88c3b616c00 2 /** \addtogroup hal */
IKobayashi 0:c88c3b616c00 3 /** @{*/
IKobayashi 0:c88c3b616c00 4 /* mbed Microcontroller Library
IKobayashi 0:c88c3b616c00 5 * Copyright (c) 2006-2015 ARM Limited
IKobayashi 0:c88c3b616c00 6 *
IKobayashi 0:c88c3b616c00 7 * Licensed under the Apache License, Version 2.0 (the "License");
IKobayashi 0:c88c3b616c00 8 * you may not use this file except in compliance with the License.
IKobayashi 0:c88c3b616c00 9 * You may obtain a copy of the License at
IKobayashi 0:c88c3b616c00 10 *
IKobayashi 0:c88c3b616c00 11 * http://www.apache.org/licenses/LICENSE-2.0
IKobayashi 0:c88c3b616c00 12 *
IKobayashi 0:c88c3b616c00 13 * Unless required by applicable law or agreed to in writing, software
IKobayashi 0:c88c3b616c00 14 * distributed under the License is distributed on an "AS IS" BASIS,
IKobayashi 0:c88c3b616c00 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
IKobayashi 0:c88c3b616c00 16 * See the License for the specific language governing permissions and
IKobayashi 0:c88c3b616c00 17 * limitations under the License.
IKobayashi 0:c88c3b616c00 18 */
IKobayashi 0:c88c3b616c00 19 #ifndef MBED_I2C_API_H
IKobayashi 0:c88c3b616c00 20 #define MBED_I2C_API_H
IKobayashi 0:c88c3b616c00 21
IKobayashi 0:c88c3b616c00 22 #include "device.h"
IKobayashi 0:c88c3b616c00 23 #include "hal/buffer.h"
IKobayashi 0:c88c3b616c00 24
IKobayashi 0:c88c3b616c00 25 #if DEVICE_I2C_ASYNCH
IKobayashi 0:c88c3b616c00 26 #include "hal/dma_api.h"
IKobayashi 0:c88c3b616c00 27 #endif
IKobayashi 0:c88c3b616c00 28
IKobayashi 0:c88c3b616c00 29 #if DEVICE_I2C
IKobayashi 0:c88c3b616c00 30
IKobayashi 0:c88c3b616c00 31 /**
IKobayashi 0:c88c3b616c00 32 * @defgroup hal_I2CEvents I2C Events Macros
IKobayashi 0:c88c3b616c00 33 *
IKobayashi 0:c88c3b616c00 34 * @{
IKobayashi 0:c88c3b616c00 35 */
IKobayashi 0:c88c3b616c00 36 #define I2C_EVENT_ERROR (1 << 1)
IKobayashi 0:c88c3b616c00 37 #define I2C_EVENT_ERROR_NO_SLAVE (1 << 2)
IKobayashi 0:c88c3b616c00 38 #define I2C_EVENT_TRANSFER_COMPLETE (1 << 3)
IKobayashi 0:c88c3b616c00 39 #define I2C_EVENT_TRANSFER_EARLY_NACK (1 << 4)
IKobayashi 0:c88c3b616c00 40 #define I2C_EVENT_ALL (I2C_EVENT_ERROR | I2C_EVENT_TRANSFER_COMPLETE | I2C_EVENT_ERROR_NO_SLAVE | I2C_EVENT_TRANSFER_EARLY_NACK)
IKobayashi 0:c88c3b616c00 41
IKobayashi 0:c88c3b616c00 42 /**@}*/
IKobayashi 0:c88c3b616c00 43
IKobayashi 0:c88c3b616c00 44 #if DEVICE_I2C_ASYNCH
IKobayashi 0:c88c3b616c00 45 /** Asynch I2C HAL structure
IKobayashi 0:c88c3b616c00 46 */
IKobayashi 0:c88c3b616c00 47 typedef struct {
IKobayashi 0:c88c3b616c00 48 struct i2c_s i2c; /**< Target specific I2C structure */
IKobayashi 0:c88c3b616c00 49 struct buffer_s tx_buff; /**< Tx buffer */
IKobayashi 0:c88c3b616c00 50 struct buffer_s rx_buff; /**< Rx buffer */
IKobayashi 0:c88c3b616c00 51 } i2c_t;
IKobayashi 0:c88c3b616c00 52
IKobayashi 0:c88c3b616c00 53 #else
IKobayashi 0:c88c3b616c00 54 /** Non-asynch I2C HAL structure
IKobayashi 0:c88c3b616c00 55 */
IKobayashi 0:c88c3b616c00 56 typedef struct i2c_s i2c_t;
IKobayashi 0:c88c3b616c00 57
IKobayashi 0:c88c3b616c00 58 #endif
IKobayashi 0:c88c3b616c00 59
IKobayashi 0:c88c3b616c00 60 enum {
IKobayashi 0:c88c3b616c00 61 I2C_ERROR_NO_SLAVE = -1,
IKobayashi 0:c88c3b616c00 62 I2C_ERROR_BUS_BUSY = -2
IKobayashi 0:c88c3b616c00 63 };
IKobayashi 0:c88c3b616c00 64
IKobayashi 0:c88c3b616c00 65 #ifdef __cplusplus
IKobayashi 0:c88c3b616c00 66 extern "C" {
IKobayashi 0:c88c3b616c00 67 #endif
IKobayashi 0:c88c3b616c00 68
IKobayashi 0:c88c3b616c00 69 /**
IKobayashi 0:c88c3b616c00 70 * \defgroup hal_GeneralI2C I2C Configuration Functions
IKobayashi 0:c88c3b616c00 71 * @{
IKobayashi 0:c88c3b616c00 72 */
IKobayashi 0:c88c3b616c00 73
IKobayashi 0:c88c3b616c00 74 /** Initialize the I2C peripheral. It sets the default parameters for I2C
IKobayashi 0:c88c3b616c00 75 * peripheral, and configures its specifieds pins.
IKobayashi 0:c88c3b616c00 76 *
IKobayashi 0:c88c3b616c00 77 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 78 * @param sda The sda pin
IKobayashi 0:c88c3b616c00 79 * @param scl The scl pin
IKobayashi 0:c88c3b616c00 80 */
IKobayashi 0:c88c3b616c00 81 void i2c_init(i2c_t *obj, PinName sda, PinName scl);
IKobayashi 0:c88c3b616c00 82
IKobayashi 0:c88c3b616c00 83 /** Configure the I2C frequency
IKobayashi 0:c88c3b616c00 84 *
IKobayashi 0:c88c3b616c00 85 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 86 * @param hz Frequency in Hz
IKobayashi 0:c88c3b616c00 87 */
IKobayashi 0:c88c3b616c00 88 void i2c_frequency(i2c_t *obj, int hz);
IKobayashi 0:c88c3b616c00 89
IKobayashi 0:c88c3b616c00 90 /** Send START command
IKobayashi 0:c88c3b616c00 91 *
IKobayashi 0:c88c3b616c00 92 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 93 */
IKobayashi 0:c88c3b616c00 94 int i2c_start(i2c_t *obj);
IKobayashi 0:c88c3b616c00 95
IKobayashi 0:c88c3b616c00 96 /** Send STOP command
IKobayashi 0:c88c3b616c00 97 *
IKobayashi 0:c88c3b616c00 98 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 99 */
IKobayashi 0:c88c3b616c00 100 int i2c_stop(i2c_t *obj);
IKobayashi 0:c88c3b616c00 101
IKobayashi 0:c88c3b616c00 102 /** Blocking reading data
IKobayashi 0:c88c3b616c00 103 *
IKobayashi 0:c88c3b616c00 104 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 105 * @param address 7-bit address (last bit is 1)
IKobayashi 0:c88c3b616c00 106 * @param data The buffer for receiving
IKobayashi 0:c88c3b616c00 107 * @param length Number of bytes to read
IKobayashi 0:c88c3b616c00 108 * @param stop Stop to be generated after the transfer is done
IKobayashi 0:c88c3b616c00 109 * @return Number of read bytes
IKobayashi 0:c88c3b616c00 110 */
IKobayashi 0:c88c3b616c00 111 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop);
IKobayashi 0:c88c3b616c00 112
IKobayashi 0:c88c3b616c00 113 /** Blocking sending data
IKobayashi 0:c88c3b616c00 114 *
IKobayashi 0:c88c3b616c00 115 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 116 * @param address 7-bit address (last bit is 0)
IKobayashi 0:c88c3b616c00 117 * @param data The buffer for sending
IKobayashi 0:c88c3b616c00 118 * @param length Number of bytes to write
IKobayashi 0:c88c3b616c00 119 * @param stop Stop to be generated after the transfer is done
IKobayashi 0:c88c3b616c00 120 * @return
IKobayashi 0:c88c3b616c00 121 * zero or non-zero - Number of written bytes
IKobayashi 0:c88c3b616c00 122 * negative - I2C_ERROR_XXX status
IKobayashi 0:c88c3b616c00 123 */
IKobayashi 0:c88c3b616c00 124 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop);
IKobayashi 0:c88c3b616c00 125
IKobayashi 0:c88c3b616c00 126 /** Reset I2C peripheral. TODO: The action here. Most of the implementation sends stop()
IKobayashi 0:c88c3b616c00 127 *
IKobayashi 0:c88c3b616c00 128 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 129 */
IKobayashi 0:c88c3b616c00 130 void i2c_reset(i2c_t *obj);
IKobayashi 0:c88c3b616c00 131
IKobayashi 0:c88c3b616c00 132 /** Read one byte
IKobayashi 0:c88c3b616c00 133 *
IKobayashi 0:c88c3b616c00 134 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 135 * @param last Acknoledge
IKobayashi 0:c88c3b616c00 136 * @return The read byte
IKobayashi 0:c88c3b616c00 137 */
IKobayashi 0:c88c3b616c00 138 int i2c_byte_read(i2c_t *obj, int last);
IKobayashi 0:c88c3b616c00 139
IKobayashi 0:c88c3b616c00 140 /** Write one byte
IKobayashi 0:c88c3b616c00 141 *
IKobayashi 0:c88c3b616c00 142 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 143 * @param data Byte to be written
IKobayashi 0:c88c3b616c00 144 * @return 0 if NAK was received, 1 if ACK was received, 2 for timeout.
IKobayashi 0:c88c3b616c00 145 */
IKobayashi 0:c88c3b616c00 146 int i2c_byte_write(i2c_t *obj, int data);
IKobayashi 0:c88c3b616c00 147
IKobayashi 0:c88c3b616c00 148 /**@}*/
IKobayashi 0:c88c3b616c00 149
IKobayashi 0:c88c3b616c00 150 #if DEVICE_I2CSLAVE
IKobayashi 0:c88c3b616c00 151
IKobayashi 0:c88c3b616c00 152 /**
IKobayashi 0:c88c3b616c00 153 * \defgroup SynchI2C Synchronous I2C Hardware Abstraction Layer for slave
IKobayashi 0:c88c3b616c00 154 * @{
IKobayashi 0:c88c3b616c00 155 */
IKobayashi 0:c88c3b616c00 156
IKobayashi 0:c88c3b616c00 157 /** Configure I2C as slave or master.
IKobayashi 0:c88c3b616c00 158 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 159 * @return non-zero if a value is available
IKobayashi 0:c88c3b616c00 160 */
IKobayashi 0:c88c3b616c00 161 void i2c_slave_mode(i2c_t *obj, int enable_slave);
IKobayashi 0:c88c3b616c00 162
IKobayashi 0:c88c3b616c00 163 /** Check to see if the I2C slave has been addressed.
IKobayashi 0:c88c3b616c00 164 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 165 * @return The status - 1 - read addresses, 2 - write to all slaves,
IKobayashi 0:c88c3b616c00 166 * 3 write addressed, 0 - the slave has not been addressed
IKobayashi 0:c88c3b616c00 167 */
IKobayashi 0:c88c3b616c00 168 int i2c_slave_receive(i2c_t *obj);
IKobayashi 0:c88c3b616c00 169
IKobayashi 0:c88c3b616c00 170 /** Configure I2C as slave or master.
IKobayashi 0:c88c3b616c00 171 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 172 * @return non-zero if a value is available
IKobayashi 0:c88c3b616c00 173 */
IKobayashi 0:c88c3b616c00 174 int i2c_slave_read(i2c_t *obj, char *data, int length);
IKobayashi 0:c88c3b616c00 175
IKobayashi 0:c88c3b616c00 176 /** Configure I2C as slave or master.
IKobayashi 0:c88c3b616c00 177 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 178 * @return non-zero if a value is available
IKobayashi 0:c88c3b616c00 179 */
IKobayashi 0:c88c3b616c00 180 int i2c_slave_write(i2c_t *obj, const char *data, int length);
IKobayashi 0:c88c3b616c00 181
IKobayashi 0:c88c3b616c00 182 /** Configure I2C address.
IKobayashi 0:c88c3b616c00 183 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 184 * @param idx Currently not used
IKobayashi 0:c88c3b616c00 185 * @param address The address to be set
IKobayashi 0:c88c3b616c00 186 * @param mask Currently not used
IKobayashi 0:c88c3b616c00 187 */
IKobayashi 0:c88c3b616c00 188 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask);
IKobayashi 0:c88c3b616c00 189
IKobayashi 0:c88c3b616c00 190 #endif
IKobayashi 0:c88c3b616c00 191
IKobayashi 0:c88c3b616c00 192 /**@}*/
IKobayashi 0:c88c3b616c00 193
IKobayashi 0:c88c3b616c00 194 #if DEVICE_I2C_ASYNCH
IKobayashi 0:c88c3b616c00 195
IKobayashi 0:c88c3b616c00 196 /**
IKobayashi 0:c88c3b616c00 197 * \defgroup hal_AsynchI2C Asynchronous I2C Hardware Abstraction Layer
IKobayashi 0:c88c3b616c00 198 * @{
IKobayashi 0:c88c3b616c00 199 */
IKobayashi 0:c88c3b616c00 200
IKobayashi 0:c88c3b616c00 201 /** Start I2C asynchronous transfer
IKobayashi 0:c88c3b616c00 202 *
IKobayashi 0:c88c3b616c00 203 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 204 * @param tx The transmit buffer
IKobayashi 0:c88c3b616c00 205 * @param tx_length The number of bytes to transmit
IKobayashi 0:c88c3b616c00 206 * @param rx The receive buffer
IKobayashi 0:c88c3b616c00 207 * @param rx_length The number of bytes to receive
IKobayashi 0:c88c3b616c00 208 * @param address The address to be set - 7bit or 9bit
IKobayashi 0:c88c3b616c00 209 * @param stop If true, stop will be generated after the transfer is done
IKobayashi 0:c88c3b616c00 210 * @param handler The I2C IRQ handler to be set
IKobayashi 0:c88c3b616c00 211 * @param hint DMA hint usage
IKobayashi 0:c88c3b616c00 212 */
IKobayashi 0:c88c3b616c00 213 void i2c_transfer_asynch(i2c_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint32_t address, uint32_t stop, uint32_t handler, uint32_t event, DMAUsage hint);
IKobayashi 0:c88c3b616c00 214
IKobayashi 0:c88c3b616c00 215 /** The asynchronous IRQ handler
IKobayashi 0:c88c3b616c00 216 *
IKobayashi 0:c88c3b616c00 217 * @param obj The I2C object which holds the transfer information
IKobayashi 0:c88c3b616c00 218 * @return Event flags if a transfer termination condition was met, otherwise return 0.
IKobayashi 0:c88c3b616c00 219 */
IKobayashi 0:c88c3b616c00 220 uint32_t i2c_irq_handler_asynch(i2c_t *obj);
IKobayashi 0:c88c3b616c00 221
IKobayashi 0:c88c3b616c00 222 /** Attempts to determine if the I2C peripheral is already in use
IKobayashi 0:c88c3b616c00 223 *
IKobayashi 0:c88c3b616c00 224 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 225 * @return Non-zero if the I2C module is active or zero if it is not
IKobayashi 0:c88c3b616c00 226 */
IKobayashi 0:c88c3b616c00 227 uint8_t i2c_active(i2c_t *obj);
IKobayashi 0:c88c3b616c00 228
IKobayashi 0:c88c3b616c00 229 /** Abort asynchronous transfer
IKobayashi 0:c88c3b616c00 230 *
IKobayashi 0:c88c3b616c00 231 * This function does not perform any check - that should happen in upper layers.
IKobayashi 0:c88c3b616c00 232 * @param obj The I2C object
IKobayashi 0:c88c3b616c00 233 */
IKobayashi 0:c88c3b616c00 234 void i2c_abort_asynch(i2c_t *obj);
IKobayashi 0:c88c3b616c00 235
IKobayashi 0:c88c3b616c00 236 #endif
IKobayashi 0:c88c3b616c00 237
IKobayashi 0:c88c3b616c00 238 /**@}*/
IKobayashi 0:c88c3b616c00 239
IKobayashi 0:c88c3b616c00 240 #ifdef __cplusplus
IKobayashi 0:c88c3b616c00 241 }
IKobayashi 0:c88c3b616c00 242 #endif
IKobayashi 0:c88c3b616c00 243
IKobayashi 0:c88c3b616c00 244 #endif
IKobayashi 0:c88c3b616c00 245
IKobayashi 0:c88c3b616c00 246 #endif
IKobayashi 0:c88c3b616c00 247
IKobayashi 0:c88c3b616c00 248 /** @}*/