mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Sep 11 09:30:09 2015 +0100
Revision:
621:9c82b0f79f3d
Parent:
554:edd95c0879f8
Synchronized with git revision 6c1d63e069ab9bd86de92e8296ca783681257538

Full URL: https://github.com/mbedmicro/mbed/commit/6c1d63e069ab9bd86de92e8296ca783681257538/

ignore target files not supported by the yotta module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 554:edd95c0879f8 1 /* mbed Microcontroller Library
mbed_official 554:edd95c0879f8 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 554:edd95c0879f8 3 *
mbed_official 554:edd95c0879f8 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 554:edd95c0879f8 5 * you may not use this file except in compliance with the License.
mbed_official 554:edd95c0879f8 6 * You may obtain a copy of the License at
mbed_official 554:edd95c0879f8 7 *
mbed_official 554:edd95c0879f8 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 554:edd95c0879f8 9 *
mbed_official 554:edd95c0879f8 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 554:edd95c0879f8 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 554:edd95c0879f8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 554:edd95c0879f8 13 * See the License for the specific language governing permissions and
mbed_official 554:edd95c0879f8 14 * limitations under the License.
mbed_official 554:edd95c0879f8 15 */
mbed_official 554:edd95c0879f8 16 #include "i2c_api.h"
mbed_official 554:edd95c0879f8 17 #include "cmsis.h"
mbed_official 554:edd95c0879f8 18 #include "pinmap.h"
mbed_official 554:edd95c0879f8 19
mbed_official 554:edd95c0879f8 20 static const PinMap PinMap_I2C_SDA[] = {
mbed_official 554:edd95c0879f8 21 {P0_0 , I2C_1, 3},
mbed_official 554:edd95c0879f8 22 {P0_10, I2C_2, 2},
mbed_official 554:edd95c0879f8 23 {P0_19, I2C_1, 3},
mbed_official 554:edd95c0879f8 24 {P0_27, I2C_0, 1},
mbed_official 554:edd95c0879f8 25 {P2_14, I2C_1, 3},
mbed_official 554:edd95c0879f8 26 {P2_30, I2C_2, 3},
mbed_official 554:edd95c0879f8 27 {P4_20, I2C_2, 2},
mbed_official 554:edd95c0879f8 28 {NC , NC , 0}
mbed_official 554:edd95c0879f8 29 };
mbed_official 554:edd95c0879f8 30
mbed_official 554:edd95c0879f8 31 static const PinMap PinMap_I2C_SCL[] = {
mbed_official 554:edd95c0879f8 32 {P0_1 , I2C_1, 3},
mbed_official 554:edd95c0879f8 33 {P0_11, I2C_2, 2},
mbed_official 554:edd95c0879f8 34 {P0_20, I2C_1, 3},
mbed_official 554:edd95c0879f8 35 {P0_28, I2C_0, 1},
mbed_official 554:edd95c0879f8 36 {P2_15, I2C_1, 3},
mbed_official 554:edd95c0879f8 37 {P2_31, I2C_2, 3},
mbed_official 554:edd95c0879f8 38 {P4_21, I2C_2, 2},
mbed_official 554:edd95c0879f8 39 {NC , NC, 0}
mbed_official 554:edd95c0879f8 40 };
mbed_official 554:edd95c0879f8 41
mbed_official 554:edd95c0879f8 42 #define I2C_CONSET(x) (x->i2c->I2CONSET)
mbed_official 554:edd95c0879f8 43 #define I2C_CONCLR(x) (x->i2c->I2CONCLR)
mbed_official 554:edd95c0879f8 44 #define I2C_STAT(x) (x->i2c->I2STAT)
mbed_official 554:edd95c0879f8 45 #define I2C_DAT(x) (x->i2c->I2DAT)
mbed_official 554:edd95c0879f8 46 #define I2C_SCLL(x, val) (x->i2c->I2SCLL = val)
mbed_official 554:edd95c0879f8 47 #define I2C_SCLH(x, val) (x->i2c->I2SCLH = val)
mbed_official 554:edd95c0879f8 48
mbed_official 554:edd95c0879f8 49 static const uint32_t I2C_addr_offset[2][4] = {
mbed_official 554:edd95c0879f8 50 {0x0C, 0x20, 0x24, 0x28},
mbed_official 554:edd95c0879f8 51 {0x30, 0x34, 0x38, 0x3C}
mbed_official 554:edd95c0879f8 52 };
mbed_official 554:edd95c0879f8 53
mbed_official 554:edd95c0879f8 54 static inline void i2c_conclr(i2c_t *obj, int start, int stop, int interrupt, int acknowledge) {
mbed_official 554:edd95c0879f8 55 I2C_CONCLR(obj) = (start << 5)
mbed_official 554:edd95c0879f8 56 | (stop << 4)
mbed_official 554:edd95c0879f8 57 | (interrupt << 3)
mbed_official 554:edd95c0879f8 58 | (acknowledge << 2);
mbed_official 554:edd95c0879f8 59 }
mbed_official 554:edd95c0879f8 60
mbed_official 554:edd95c0879f8 61 static inline void i2c_conset(i2c_t *obj, int start, int stop, int interrupt, int acknowledge) {
mbed_official 554:edd95c0879f8 62 I2C_CONSET(obj) = (start << 5)
mbed_official 554:edd95c0879f8 63 | (stop << 4)
mbed_official 554:edd95c0879f8 64 | (interrupt << 3)
mbed_official 554:edd95c0879f8 65 | (acknowledge << 2);
mbed_official 554:edd95c0879f8 66 }
mbed_official 554:edd95c0879f8 67
mbed_official 554:edd95c0879f8 68 // Clear the Serial Interrupt (SI)
mbed_official 554:edd95c0879f8 69 static inline void i2c_clear_SI(i2c_t *obj) {
mbed_official 554:edd95c0879f8 70 i2c_conclr(obj, 0, 0, 1, 0);
mbed_official 554:edd95c0879f8 71 }
mbed_official 554:edd95c0879f8 72
mbed_official 554:edd95c0879f8 73 static inline int i2c_status(i2c_t *obj) {
mbed_official 554:edd95c0879f8 74 return I2C_STAT(obj);
mbed_official 554:edd95c0879f8 75 }
mbed_official 554:edd95c0879f8 76
mbed_official 554:edd95c0879f8 77 // Wait until the Serial Interrupt (SI) is set
mbed_official 554:edd95c0879f8 78 static int i2c_wait_SI(i2c_t *obj) {
mbed_official 554:edd95c0879f8 79 int timeout = 0;
mbed_official 554:edd95c0879f8 80 while (!(I2C_CONSET(obj) & (1 << 3))) {
mbed_official 554:edd95c0879f8 81 timeout++;
mbed_official 554:edd95c0879f8 82 if (timeout > 100000) return -1;
mbed_official 554:edd95c0879f8 83 }
mbed_official 554:edd95c0879f8 84 return 0;
mbed_official 554:edd95c0879f8 85 }
mbed_official 554:edd95c0879f8 86
mbed_official 554:edd95c0879f8 87 static inline void i2c_interface_enable(i2c_t *obj) {
mbed_official 554:edd95c0879f8 88 I2C_CONSET(obj) = 0x40;
mbed_official 554:edd95c0879f8 89 }
mbed_official 554:edd95c0879f8 90
mbed_official 554:edd95c0879f8 91 static inline void i2c_power_enable(i2c_t *obj) {
mbed_official 554:edd95c0879f8 92 switch ((int)obj->i2c) {
mbed_official 554:edd95c0879f8 93 case I2C_0: LPC_SC->PCONP |= 1 << PCI2C0; break;
mbed_official 554:edd95c0879f8 94 case I2C_1: LPC_SC->PCONP |= 1 << PCI2C1; break;
mbed_official 554:edd95c0879f8 95 case I2C_2: LPC_SC->PCONP |= 1 << PCI2C2; break;
mbed_official 554:edd95c0879f8 96 }
mbed_official 554:edd95c0879f8 97 }
mbed_official 554:edd95c0879f8 98
mbed_official 554:edd95c0879f8 99 void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
mbed_official 554:edd95c0879f8 100 // determine the SPI to use
mbed_official 554:edd95c0879f8 101 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
mbed_official 554:edd95c0879f8 102 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
mbed_official 554:edd95c0879f8 103 obj->i2c = (LPC_I2C_TypeDef *)pinmap_merge(i2c_sda, i2c_scl);
mbed_official 554:edd95c0879f8 104 MBED_ASSERT((int)obj->i2c != NC);
mbed_official 554:edd95c0879f8 105
mbed_official 554:edd95c0879f8 106 // enable power
mbed_official 554:edd95c0879f8 107 i2c_power_enable(obj);
mbed_official 554:edd95c0879f8 108
mbed_official 554:edd95c0879f8 109 // set default frequency at 100k
mbed_official 554:edd95c0879f8 110 i2c_frequency(obj, 100000);
mbed_official 554:edd95c0879f8 111 i2c_conclr(obj, 1, 1, 1, 1);
mbed_official 554:edd95c0879f8 112 i2c_interface_enable(obj);
mbed_official 554:edd95c0879f8 113
mbed_official 554:edd95c0879f8 114 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 554:edd95c0879f8 115 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 554:edd95c0879f8 116 }
mbed_official 554:edd95c0879f8 117
mbed_official 554:edd95c0879f8 118 inline int i2c_start(i2c_t *obj) {
mbed_official 554:edd95c0879f8 119 int status = 0;
mbed_official 554:edd95c0879f8 120 // 8.1 Before master mode can be entered, I2CON must be initialised to:
mbed_official 554:edd95c0879f8 121 // - I2EN STA STO SI AA - -
mbed_official 554:edd95c0879f8 122 // - 1 0 0 0 x - -
mbed_official 554:edd95c0879f8 123 // if AA = 0, it can't enter slave mode
mbed_official 554:edd95c0879f8 124 i2c_conclr(obj, 1, 1, 1, 1);
mbed_official 554:edd95c0879f8 125
mbed_official 554:edd95c0879f8 126 // The master mode may now be entered by setting the STA bit
mbed_official 554:edd95c0879f8 127 // this will generate a start condition when the bus becomes free
mbed_official 554:edd95c0879f8 128 i2c_conset(obj, 1, 0, 0, 1);
mbed_official 554:edd95c0879f8 129
mbed_official 554:edd95c0879f8 130 i2c_wait_SI(obj);
mbed_official 554:edd95c0879f8 131 status = i2c_status(obj);
mbed_official 554:edd95c0879f8 132
mbed_official 554:edd95c0879f8 133 // Clear start bit now transmitted, and interrupt bit
mbed_official 554:edd95c0879f8 134 i2c_conclr(obj, 1, 0, 0, 0);
mbed_official 554:edd95c0879f8 135 return status;
mbed_official 554:edd95c0879f8 136 }
mbed_official 554:edd95c0879f8 137
mbed_official 554:edd95c0879f8 138 inline int i2c_stop(i2c_t *obj) {
mbed_official 554:edd95c0879f8 139 int timeout = 0;
mbed_official 554:edd95c0879f8 140
mbed_official 554:edd95c0879f8 141 // write the stop bit
mbed_official 554:edd95c0879f8 142 i2c_conset(obj, 0, 1, 0, 0);
mbed_official 554:edd95c0879f8 143 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 144
mbed_official 554:edd95c0879f8 145 // wait for STO bit to reset
mbed_official 554:edd95c0879f8 146 while (I2C_CONSET(obj) & (1 << 4)) {
mbed_official 554:edd95c0879f8 147 timeout ++;
mbed_official 554:edd95c0879f8 148 if (timeout > 100000) return 1;
mbed_official 554:edd95c0879f8 149 }
mbed_official 554:edd95c0879f8 150
mbed_official 554:edd95c0879f8 151 return 0;
mbed_official 554:edd95c0879f8 152 }
mbed_official 554:edd95c0879f8 153
mbed_official 554:edd95c0879f8 154 static inline int i2c_do_write(i2c_t *obj, int value, uint8_t addr) {
mbed_official 554:edd95c0879f8 155 // write the data
mbed_official 554:edd95c0879f8 156 I2C_DAT(obj) = value;
mbed_official 554:edd95c0879f8 157
mbed_official 554:edd95c0879f8 158 // clear SI to init a send
mbed_official 554:edd95c0879f8 159 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 160
mbed_official 554:edd95c0879f8 161 // wait and return status
mbed_official 554:edd95c0879f8 162 i2c_wait_SI(obj);
mbed_official 554:edd95c0879f8 163 return i2c_status(obj);
mbed_official 554:edd95c0879f8 164 }
mbed_official 554:edd95c0879f8 165
mbed_official 554:edd95c0879f8 166 static inline int i2c_do_read(i2c_t *obj, int last) {
mbed_official 554:edd95c0879f8 167 // we are in state 0x40 (SLA+R tx'd) or 0x50 (data rx'd and ack)
mbed_official 554:edd95c0879f8 168 if (last) {
mbed_official 554:edd95c0879f8 169 i2c_conclr(obj, 0, 0, 0, 1); // send a NOT ACK
mbed_official 554:edd95c0879f8 170 } else {
mbed_official 554:edd95c0879f8 171 i2c_conset(obj, 0, 0, 0, 1); // send a ACK
mbed_official 554:edd95c0879f8 172 }
mbed_official 554:edd95c0879f8 173
mbed_official 554:edd95c0879f8 174 // accept byte
mbed_official 554:edd95c0879f8 175 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 176
mbed_official 554:edd95c0879f8 177 // wait for it to arrive
mbed_official 554:edd95c0879f8 178 i2c_wait_SI(obj);
mbed_official 554:edd95c0879f8 179
mbed_official 554:edd95c0879f8 180 // return the data
mbed_official 554:edd95c0879f8 181 return (I2C_DAT(obj) & 0xFF);
mbed_official 554:edd95c0879f8 182 }
mbed_official 554:edd95c0879f8 183
mbed_official 554:edd95c0879f8 184 void i2c_frequency(i2c_t *obj, int hz) {
mbed_official 554:edd95c0879f8 185 // [TODO] set pclk to /4
mbed_official 554:edd95c0879f8 186 uint32_t PCLK = SystemCoreClock / 4;
mbed_official 554:edd95c0879f8 187
mbed_official 554:edd95c0879f8 188 uint32_t pulse = PCLK / (hz * 2);
mbed_official 554:edd95c0879f8 189
mbed_official 554:edd95c0879f8 190 // I2C Rate
mbed_official 554:edd95c0879f8 191 I2C_SCLL(obj, pulse);
mbed_official 554:edd95c0879f8 192 I2C_SCLH(obj, pulse);
mbed_official 554:edd95c0879f8 193 }
mbed_official 554:edd95c0879f8 194
mbed_official 554:edd95c0879f8 195 // The I2C does a read or a write as a whole operation
mbed_official 554:edd95c0879f8 196 // There are two types of error conditions it can encounter
mbed_official 554:edd95c0879f8 197 // 1) it can not obtain the bus
mbed_official 554:edd95c0879f8 198 // 2) it gets error responses at part of the transmission
mbed_official 554:edd95c0879f8 199 //
mbed_official 554:edd95c0879f8 200 // We tackle them as follows:
mbed_official 554:edd95c0879f8 201 // 1) we retry until we get the bus. we could have a "timeout" if we can not get it
mbed_official 554:edd95c0879f8 202 // which basically turns it in to a 2)
mbed_official 554:edd95c0879f8 203 // 2) on error, we use the standard error mechanisms to report/debug
mbed_official 554:edd95c0879f8 204 //
mbed_official 554:edd95c0879f8 205 // Therefore an I2C transaction should always complete. If it doesn't it is usually
mbed_official 554:edd95c0879f8 206 // because something is setup wrong (e.g. wiring), and we don't need to programatically
mbed_official 554:edd95c0879f8 207 // check for that
mbed_official 554:edd95c0879f8 208 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
mbed_official 554:edd95c0879f8 209 int count, status;
mbed_official 554:edd95c0879f8 210
mbed_official 554:edd95c0879f8 211 status = i2c_start(obj);
mbed_official 554:edd95c0879f8 212
mbed_official 554:edd95c0879f8 213 if ((status != 0x10) && (status != 0x08)) {
mbed_official 554:edd95c0879f8 214 i2c_stop(obj);
mbed_official 554:edd95c0879f8 215 return I2C_ERROR_BUS_BUSY;
mbed_official 554:edd95c0879f8 216 }
mbed_official 554:edd95c0879f8 217
mbed_official 554:edd95c0879f8 218 status = i2c_do_write(obj, (address | 0x01), 1);
mbed_official 554:edd95c0879f8 219 if (status != 0x40) {
mbed_official 554:edd95c0879f8 220 i2c_stop(obj);
mbed_official 554:edd95c0879f8 221 return I2C_ERROR_NO_SLAVE;
mbed_official 554:edd95c0879f8 222 }
mbed_official 554:edd95c0879f8 223
mbed_official 554:edd95c0879f8 224 // Read in all except last byte
mbed_official 554:edd95c0879f8 225 for (count = 0; count < (length - 1); count++) {
mbed_official 554:edd95c0879f8 226 int value = i2c_do_read(obj, 0);
mbed_official 554:edd95c0879f8 227 status = i2c_status(obj);
mbed_official 554:edd95c0879f8 228 if (status != 0x50) {
mbed_official 554:edd95c0879f8 229 i2c_stop(obj);
mbed_official 554:edd95c0879f8 230 return count;
mbed_official 554:edd95c0879f8 231 }
mbed_official 554:edd95c0879f8 232 data[count] = (char) value;
mbed_official 554:edd95c0879f8 233 }
mbed_official 554:edd95c0879f8 234
mbed_official 554:edd95c0879f8 235 // read in last byte
mbed_official 554:edd95c0879f8 236 int value = i2c_do_read(obj, 1);
mbed_official 554:edd95c0879f8 237 status = i2c_status(obj);
mbed_official 554:edd95c0879f8 238 if (status != 0x58) {
mbed_official 554:edd95c0879f8 239 i2c_stop(obj);
mbed_official 554:edd95c0879f8 240 return length - 1;
mbed_official 554:edd95c0879f8 241 }
mbed_official 554:edd95c0879f8 242
mbed_official 554:edd95c0879f8 243 data[count] = (char) value;
mbed_official 554:edd95c0879f8 244
mbed_official 554:edd95c0879f8 245 // If not repeated start, send stop.
mbed_official 554:edd95c0879f8 246 if (stop) {
mbed_official 554:edd95c0879f8 247 i2c_stop(obj);
mbed_official 554:edd95c0879f8 248 }
mbed_official 554:edd95c0879f8 249
mbed_official 554:edd95c0879f8 250 return length;
mbed_official 554:edd95c0879f8 251 }
mbed_official 554:edd95c0879f8 252
mbed_official 554:edd95c0879f8 253 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
mbed_official 554:edd95c0879f8 254 int i, status;
mbed_official 554:edd95c0879f8 255
mbed_official 554:edd95c0879f8 256 status = i2c_start(obj);
mbed_official 554:edd95c0879f8 257
mbed_official 554:edd95c0879f8 258 if ((status != 0x10) && (status != 0x08)) {
mbed_official 554:edd95c0879f8 259 i2c_stop(obj);
mbed_official 554:edd95c0879f8 260 return I2C_ERROR_BUS_BUSY;
mbed_official 554:edd95c0879f8 261 }
mbed_official 554:edd95c0879f8 262
mbed_official 554:edd95c0879f8 263 status = i2c_do_write(obj, (address & 0xFE), 1);
mbed_official 554:edd95c0879f8 264 if (status != 0x18) {
mbed_official 554:edd95c0879f8 265 i2c_stop(obj);
mbed_official 554:edd95c0879f8 266 return I2C_ERROR_NO_SLAVE;
mbed_official 554:edd95c0879f8 267 }
mbed_official 554:edd95c0879f8 268
mbed_official 554:edd95c0879f8 269 for (i=0; i<length; i++) {
mbed_official 554:edd95c0879f8 270 status = i2c_do_write(obj, data[i], 0);
mbed_official 554:edd95c0879f8 271 if (status != 0x28) {
mbed_official 554:edd95c0879f8 272 i2c_stop(obj);
mbed_official 554:edd95c0879f8 273 return i;
mbed_official 554:edd95c0879f8 274 }
mbed_official 554:edd95c0879f8 275 }
mbed_official 554:edd95c0879f8 276
mbed_official 554:edd95c0879f8 277 // clearing the serial interrupt here might cause an unintended rewrite of the last byte
mbed_official 554:edd95c0879f8 278 // see also issue report https://mbed.org/users/mbed_official/code/mbed/issues/1
mbed_official 554:edd95c0879f8 279 // i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 280
mbed_official 554:edd95c0879f8 281 // If not repeated start, send stop.
mbed_official 554:edd95c0879f8 282 if (stop) {
mbed_official 554:edd95c0879f8 283 i2c_stop(obj);
mbed_official 554:edd95c0879f8 284 }
mbed_official 554:edd95c0879f8 285
mbed_official 554:edd95c0879f8 286 return length;
mbed_official 554:edd95c0879f8 287 }
mbed_official 554:edd95c0879f8 288
mbed_official 554:edd95c0879f8 289 void i2c_reset(i2c_t *obj) {
mbed_official 554:edd95c0879f8 290 i2c_stop(obj);
mbed_official 554:edd95c0879f8 291 }
mbed_official 554:edd95c0879f8 292
mbed_official 554:edd95c0879f8 293 int i2c_byte_read(i2c_t *obj, int last) {
mbed_official 554:edd95c0879f8 294 return (i2c_do_read(obj, last) & 0xFF);
mbed_official 554:edd95c0879f8 295 }
mbed_official 554:edd95c0879f8 296
mbed_official 554:edd95c0879f8 297 int i2c_byte_write(i2c_t *obj, int data) {
mbed_official 554:edd95c0879f8 298 int ack;
mbed_official 554:edd95c0879f8 299 int status = i2c_do_write(obj, (data & 0xFF), 0);
mbed_official 554:edd95c0879f8 300
mbed_official 554:edd95c0879f8 301 switch(status) {
mbed_official 554:edd95c0879f8 302 case 0x18: case 0x28: // Master transmit ACKs
mbed_official 554:edd95c0879f8 303 ack = 1;
mbed_official 554:edd95c0879f8 304 break;
mbed_official 554:edd95c0879f8 305
mbed_official 554:edd95c0879f8 306 case 0x40: // Master receive address transmitted ACK
mbed_official 554:edd95c0879f8 307 ack = 1;
mbed_official 554:edd95c0879f8 308 break;
mbed_official 554:edd95c0879f8 309
mbed_official 554:edd95c0879f8 310 case 0xB8: // Slave transmit ACK
mbed_official 554:edd95c0879f8 311 ack = 1;
mbed_official 554:edd95c0879f8 312 break;
mbed_official 554:edd95c0879f8 313
mbed_official 554:edd95c0879f8 314 default:
mbed_official 554:edd95c0879f8 315 ack = 0;
mbed_official 554:edd95c0879f8 316 break;
mbed_official 554:edd95c0879f8 317 }
mbed_official 554:edd95c0879f8 318
mbed_official 554:edd95c0879f8 319 return ack;
mbed_official 554:edd95c0879f8 320 }
mbed_official 554:edd95c0879f8 321
mbed_official 554:edd95c0879f8 322 void i2c_slave_mode(i2c_t *obj, int enable_slave) {
mbed_official 554:edd95c0879f8 323 if (enable_slave != 0) {
mbed_official 554:edd95c0879f8 324 i2c_conclr(obj, 1, 1, 1, 0);
mbed_official 554:edd95c0879f8 325 i2c_conset(obj, 0, 0, 0, 1);
mbed_official 554:edd95c0879f8 326 } else {
mbed_official 554:edd95c0879f8 327 i2c_conclr(obj, 1, 1, 1, 1);
mbed_official 554:edd95c0879f8 328 }
mbed_official 554:edd95c0879f8 329 }
mbed_official 554:edd95c0879f8 330
mbed_official 554:edd95c0879f8 331 int i2c_slave_receive(i2c_t *obj) {
mbed_official 554:edd95c0879f8 332 int status;
mbed_official 554:edd95c0879f8 333 int retval;
mbed_official 554:edd95c0879f8 334
mbed_official 554:edd95c0879f8 335 status = i2c_status(obj);
mbed_official 554:edd95c0879f8 336 switch(status) {
mbed_official 554:edd95c0879f8 337 case 0x60: retval = 3; break;
mbed_official 554:edd95c0879f8 338 case 0x70: retval = 2; break;
mbed_official 554:edd95c0879f8 339 case 0xA8: retval = 1; break;
mbed_official 554:edd95c0879f8 340 default : retval = 0; break;
mbed_official 554:edd95c0879f8 341 }
mbed_official 554:edd95c0879f8 342
mbed_official 554:edd95c0879f8 343 return(retval);
mbed_official 554:edd95c0879f8 344 }
mbed_official 554:edd95c0879f8 345
mbed_official 554:edd95c0879f8 346 int i2c_slave_read(i2c_t *obj, char *data, int length) {
mbed_official 554:edd95c0879f8 347 int count = 0;
mbed_official 554:edd95c0879f8 348 int status;
mbed_official 554:edd95c0879f8 349
mbed_official 554:edd95c0879f8 350 do {
mbed_official 554:edd95c0879f8 351 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 352 i2c_wait_SI(obj);
mbed_official 554:edd95c0879f8 353 status = i2c_status(obj);
mbed_official 554:edd95c0879f8 354 if((status == 0x80) || (status == 0x90)) {
mbed_official 554:edd95c0879f8 355 data[count] = I2C_DAT(obj) & 0xFF;
mbed_official 554:edd95c0879f8 356 }
mbed_official 554:edd95c0879f8 357 count++;
mbed_official 554:edd95c0879f8 358 } while (((status == 0x80) || (status == 0x90) ||
mbed_official 554:edd95c0879f8 359 (status == 0x060) || (status == 0x70)) && (count < length));
mbed_official 554:edd95c0879f8 360
mbed_official 554:edd95c0879f8 361 if(status != 0xA0) {
mbed_official 554:edd95c0879f8 362 i2c_stop(obj);
mbed_official 554:edd95c0879f8 363 }
mbed_official 554:edd95c0879f8 364
mbed_official 554:edd95c0879f8 365 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 366
mbed_official 554:edd95c0879f8 367 return count;
mbed_official 554:edd95c0879f8 368 }
mbed_official 554:edd95c0879f8 369
mbed_official 554:edd95c0879f8 370 int i2c_slave_write(i2c_t *obj, const char *data, int length) {
mbed_official 554:edd95c0879f8 371 int count = 0;
mbed_official 554:edd95c0879f8 372 int status;
mbed_official 554:edd95c0879f8 373
mbed_official 554:edd95c0879f8 374 if(length <= 0) {
mbed_official 554:edd95c0879f8 375 return(0);
mbed_official 554:edd95c0879f8 376 }
mbed_official 554:edd95c0879f8 377
mbed_official 554:edd95c0879f8 378 do {
mbed_official 554:edd95c0879f8 379 status = i2c_do_write(obj, data[count], 0);
mbed_official 554:edd95c0879f8 380 count++;
mbed_official 554:edd95c0879f8 381 } while ((count < length) && (status == 0xB8));
mbed_official 554:edd95c0879f8 382
mbed_official 554:edd95c0879f8 383 if((status != 0xC0) && (status != 0xC8)) {
mbed_official 554:edd95c0879f8 384 i2c_stop(obj);
mbed_official 554:edd95c0879f8 385 }
mbed_official 554:edd95c0879f8 386
mbed_official 554:edd95c0879f8 387 i2c_clear_SI(obj);
mbed_official 554:edd95c0879f8 388
mbed_official 554:edd95c0879f8 389 return(count);
mbed_official 554:edd95c0879f8 390 }
mbed_official 554:edd95c0879f8 391
mbed_official 554:edd95c0879f8 392 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) {
mbed_official 554:edd95c0879f8 393 uint32_t addr;
mbed_official 554:edd95c0879f8 394
mbed_official 554:edd95c0879f8 395 if ((idx >= 0) && (idx <= 3)) {
mbed_official 554:edd95c0879f8 396 addr = ((uint32_t)obj->i2c) + I2C_addr_offset[0][idx];
mbed_official 554:edd95c0879f8 397 *((uint32_t *) addr) = address & 0xFF;
mbed_official 554:edd95c0879f8 398 }
mbed_official 554:edd95c0879f8 399 }