mbed SDK library sources

Fork of mbed-src by mbed official

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:
Wed Sep 25 10:30:04 2013 +0100
Revision:
30:91c1d09ada54
Synchronized with git revision 8f57c1e84759991fa81ede0da2b4aabe8530fa09

Who changed what in which revision?

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