mbed library sources for GR-PEACH rev.B.

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Wed May 07 13:30:07 2014 +0100
Revision:
182:242346c42295
Parent:
178:a873352662d8
Child:
227:7bd0639b8911
Synchronized with git revision 06edaf703a558d25d9e05e38adc502c6474a5d61

Full URL: https://github.com/mbedmicro/mbed/commit/06edaf703a558d25d9e05e38adc502c6474a5d61/

increase timeout for slow I2C slaves that make use of extensive clock stretching

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 82:0b31dbcd4769 1 /* mbed Microcontroller Library
mbed_official 82:0b31dbcd4769 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 82:0b31dbcd4769 3 *
mbed_official 82:0b31dbcd4769 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 82:0b31dbcd4769 5 * you may not use this file except in compliance with the License.
mbed_official 82:0b31dbcd4769 6 * You may obtain a copy of the License at
mbed_official 82:0b31dbcd4769 7 *
mbed_official 82:0b31dbcd4769 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 82:0b31dbcd4769 9 *
mbed_official 82:0b31dbcd4769 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 82:0b31dbcd4769 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 82:0b31dbcd4769 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 82:0b31dbcd4769 13 * See the License for the specific language governing permissions and
mbed_official 82:0b31dbcd4769 14 * limitations under the License.
mbed_official 82:0b31dbcd4769 15 */
mbed_official 82:0b31dbcd4769 16 #include "i2c_api.h"
mbed_official 82:0b31dbcd4769 17
mbed_official 82:0b31dbcd4769 18 #include "cmsis.h"
mbed_official 82:0b31dbcd4769 19 #include "pinmap.h"
mbed_official 82:0b31dbcd4769 20 #include "error.h"
mbed_official 82:0b31dbcd4769 21 #include "clk_freqs.h"
mbed_official 82:0b31dbcd4769 22 #include "PeripheralPins.h"
mbed_official 82:0b31dbcd4769 23
mbed_official 82:0b31dbcd4769 24 static const uint16_t ICR[0x40] = {
mbed_official 82:0b31dbcd4769 25 20, 22, 24, 26, 28,
mbed_official 82:0b31dbcd4769 26 30, 34, 40, 28, 32,
mbed_official 82:0b31dbcd4769 27 36, 40, 44, 48, 56,
mbed_official 82:0b31dbcd4769 28 68, 48, 56, 64, 72,
mbed_official 82:0b31dbcd4769 29 80, 88, 104, 128, 80,
mbed_official 82:0b31dbcd4769 30 96, 112, 128, 144, 160,
mbed_official 82:0b31dbcd4769 31 192, 240, 160, 192, 224,
mbed_official 82:0b31dbcd4769 32 256, 288, 320, 384, 480,
mbed_official 82:0b31dbcd4769 33 320, 384, 448, 512, 576,
mbed_official 82:0b31dbcd4769 34 640, 768, 960, 640, 768,
mbed_official 82:0b31dbcd4769 35 896, 1024, 1152, 1280, 1536,
mbed_official 82:0b31dbcd4769 36 1920, 1280, 1536, 1792, 2048,
mbed_official 82:0b31dbcd4769 37 2304, 2560, 3072, 3840
mbed_official 82:0b31dbcd4769 38 };
mbed_official 82:0b31dbcd4769 39
mbed_official 82:0b31dbcd4769 40
mbed_official 82:0b31dbcd4769 41 void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
mbed_official 82:0b31dbcd4769 42 // determine the I2C to use
mbed_official 82:0b31dbcd4769 43 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
mbed_official 82:0b31dbcd4769 44 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
mbed_official 82:0b31dbcd4769 45 obj->i2c = (I2C_Type*)pinmap_merge(i2c_sda, i2c_scl);
mbed_official 82:0b31dbcd4769 46 if ((int)obj->i2c == NC) {
mbed_official 82:0b31dbcd4769 47 error("I2C pin mapping failed");
mbed_official 82:0b31dbcd4769 48 }
mbed_official 82:0b31dbcd4769 49
mbed_official 82:0b31dbcd4769 50 // enable power
mbed_official 82:0b31dbcd4769 51 switch ((int)obj->i2c) {
mbed_official 82:0b31dbcd4769 52 case I2C_0: SIM->SCGC5 |= 1 << 13; SIM->SCGC4 |= 1 << 6; break;
mbed_official 82:0b31dbcd4769 53 case I2C_1: SIM->SCGC5 |= 1 << 11; SIM->SCGC4 |= 1 << 7; break;
mbed_official 82:0b31dbcd4769 54 }
mbed_official 82:0b31dbcd4769 55
mbed_official 82:0b31dbcd4769 56 // set default frequency at 100k
mbed_official 82:0b31dbcd4769 57 i2c_frequency(obj, 100000);
mbed_official 82:0b31dbcd4769 58
mbed_official 82:0b31dbcd4769 59 // enable I2C interface
mbed_official 82:0b31dbcd4769 60 obj->i2c->C1 |= 0x80;
mbed_official 82:0b31dbcd4769 61
mbed_official 82:0b31dbcd4769 62 pinmap_pinout(sda, PinMap_I2C_SDA);
mbed_official 82:0b31dbcd4769 63 pinmap_pinout(scl, PinMap_I2C_SCL);
mbed_official 82:0b31dbcd4769 64 }
mbed_official 82:0b31dbcd4769 65
mbed_official 82:0b31dbcd4769 66 int i2c_start(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 67 uint8_t temp;
mbed_official 82:0b31dbcd4769 68 volatile int i;
mbed_official 82:0b31dbcd4769 69 // if we are in the middle of a transaction
mbed_official 82:0b31dbcd4769 70 // activate the repeat_start flag
mbed_official 82:0b31dbcd4769 71 if (obj->i2c->S & I2C_S_BUSY_MASK) {
mbed_official 82:0b31dbcd4769 72 // KL25Z errata sheet: repeat start cannot be generated if the
mbed_official 82:0b31dbcd4769 73 // I2Cx_F[MULT] field is set to a non-zero value
mbed_official 82:0b31dbcd4769 74 temp = obj->i2c->F >> 6;
mbed_official 82:0b31dbcd4769 75 obj->i2c->F &= 0x3F;
mbed_official 82:0b31dbcd4769 76 obj->i2c->C1 |= 0x04;
mbed_official 82:0b31dbcd4769 77 for (i = 0; i < 100; i ++) __NOP();
mbed_official 82:0b31dbcd4769 78 obj->i2c->F |= temp << 6;
mbed_official 82:0b31dbcd4769 79 } else {
mbed_official 82:0b31dbcd4769 80 obj->i2c->C1 |= I2C_C1_MST_MASK;
mbed_official 82:0b31dbcd4769 81 obj->i2c->C1 |= I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 82 }
mbed_official 82:0b31dbcd4769 83 return 0;
mbed_official 82:0b31dbcd4769 84 }
mbed_official 82:0b31dbcd4769 85
mbed_official 82:0b31dbcd4769 86 int i2c_stop(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 87 volatile uint32_t n = 0;
mbed_official 82:0b31dbcd4769 88 obj->i2c->C1 &= ~I2C_C1_MST_MASK;
mbed_official 82:0b31dbcd4769 89 obj->i2c->C1 &= ~I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 90
mbed_official 82:0b31dbcd4769 91 // It seems that there are timing problems
mbed_official 82:0b31dbcd4769 92 // when there is no waiting time after a STOP.
mbed_official 82:0b31dbcd4769 93 // This wait is also included on the samples
mbed_official 82:0b31dbcd4769 94 // code provided with the freedom board
mbed_official 82:0b31dbcd4769 95 for (n = 0; n < 100; n++) __NOP();
mbed_official 82:0b31dbcd4769 96 return 0;
mbed_official 82:0b31dbcd4769 97 }
mbed_official 82:0b31dbcd4769 98
mbed_official 82:0b31dbcd4769 99 static int timeout_status_poll(i2c_t *obj, uint32_t mask) {
mbed_official 182:242346c42295 100 uint32_t i, timeout = 100000;
mbed_official 82:0b31dbcd4769 101
mbed_official 82:0b31dbcd4769 102 for (i = 0; i < timeout; i++) {
mbed_official 82:0b31dbcd4769 103 if (obj->i2c->S & mask)
mbed_official 82:0b31dbcd4769 104 return 0;
mbed_official 82:0b31dbcd4769 105 }
mbed_official 82:0b31dbcd4769 106
mbed_official 82:0b31dbcd4769 107 return 1;
mbed_official 82:0b31dbcd4769 108 }
mbed_official 82:0b31dbcd4769 109
mbed_official 82:0b31dbcd4769 110 // this function waits the end of a tx transfer and return the status of the transaction:
mbed_official 82:0b31dbcd4769 111 // 0: OK ack received
mbed_official 82:0b31dbcd4769 112 // 1: OK ack not received
mbed_official 82:0b31dbcd4769 113 // 2: failure
mbed_official 82:0b31dbcd4769 114 static int i2c_wait_end_tx_transfer(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 115
mbed_official 82:0b31dbcd4769 116 // wait for the interrupt flag
mbed_official 82:0b31dbcd4769 117 if (timeout_status_poll(obj, I2C_S_IICIF_MASK)) {
mbed_official 82:0b31dbcd4769 118 return 2;
mbed_official 82:0b31dbcd4769 119 }
mbed_official 82:0b31dbcd4769 120
mbed_official 82:0b31dbcd4769 121 obj->i2c->S |= I2C_S_IICIF_MASK;
mbed_official 82:0b31dbcd4769 122
mbed_official 82:0b31dbcd4769 123 // wait transfer complete
mbed_official 82:0b31dbcd4769 124 if (timeout_status_poll(obj, I2C_S_TCF_MASK)) {
mbed_official 82:0b31dbcd4769 125 return 2;
mbed_official 82:0b31dbcd4769 126 }
mbed_official 82:0b31dbcd4769 127
mbed_official 82:0b31dbcd4769 128 // check if we received the ACK or not
mbed_official 82:0b31dbcd4769 129 return obj->i2c->S & I2C_S_RXAK_MASK ? 1 : 0;
mbed_official 82:0b31dbcd4769 130 }
mbed_official 82:0b31dbcd4769 131
mbed_official 82:0b31dbcd4769 132 // this function waits the end of a rx transfer and return the status of the transaction:
mbed_official 82:0b31dbcd4769 133 // 0: OK
mbed_official 82:0b31dbcd4769 134 // 1: failure
mbed_official 82:0b31dbcd4769 135 static int i2c_wait_end_rx_transfer(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 136 // wait for the end of the rx transfer
mbed_official 82:0b31dbcd4769 137 if (timeout_status_poll(obj, I2C_S_IICIF_MASK)) {
mbed_official 82:0b31dbcd4769 138 return 1;
mbed_official 82:0b31dbcd4769 139 }
mbed_official 82:0b31dbcd4769 140
mbed_official 82:0b31dbcd4769 141 obj->i2c->S |= I2C_S_IICIF_MASK;
mbed_official 82:0b31dbcd4769 142
mbed_official 82:0b31dbcd4769 143 return 0;
mbed_official 82:0b31dbcd4769 144 }
mbed_official 82:0b31dbcd4769 145
mbed_official 82:0b31dbcd4769 146 static void i2c_send_nack(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 147 obj->i2c->C1 |= I2C_C1_TXAK_MASK; // NACK
mbed_official 82:0b31dbcd4769 148 }
mbed_official 82:0b31dbcd4769 149
mbed_official 82:0b31dbcd4769 150 static void i2c_send_ack(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 151 obj->i2c->C1 &= ~I2C_C1_TXAK_MASK; // ACK
mbed_official 82:0b31dbcd4769 152 }
mbed_official 82:0b31dbcd4769 153
mbed_official 82:0b31dbcd4769 154 static int i2c_do_write(i2c_t *obj, int value) {
mbed_official 82:0b31dbcd4769 155 // write the data
mbed_official 82:0b31dbcd4769 156 obj->i2c->D = value;
mbed_official 82:0b31dbcd4769 157
mbed_official 82:0b31dbcd4769 158 // init and wait the end of the transfer
mbed_official 82:0b31dbcd4769 159 return i2c_wait_end_tx_transfer(obj);
mbed_official 82:0b31dbcd4769 160 }
mbed_official 82:0b31dbcd4769 161
mbed_official 82:0b31dbcd4769 162 static int i2c_do_read(i2c_t *obj, char * data, int last) {
mbed_official 82:0b31dbcd4769 163 if (last)
mbed_official 82:0b31dbcd4769 164 i2c_send_nack(obj);
mbed_official 82:0b31dbcd4769 165 else
mbed_official 82:0b31dbcd4769 166 i2c_send_ack(obj);
mbed_official 82:0b31dbcd4769 167
mbed_official 82:0b31dbcd4769 168 *data = (obj->i2c->D & 0xFF);
mbed_official 82:0b31dbcd4769 169
mbed_official 82:0b31dbcd4769 170 // start rx transfer and wait the end of the transfer
mbed_official 82:0b31dbcd4769 171 return i2c_wait_end_rx_transfer(obj);
mbed_official 82:0b31dbcd4769 172 }
mbed_official 82:0b31dbcd4769 173
mbed_official 82:0b31dbcd4769 174 void i2c_frequency(i2c_t *obj, int hz) {
mbed_official 82:0b31dbcd4769 175 uint8_t icr = 0;
mbed_official 82:0b31dbcd4769 176 uint8_t mult = 0;
mbed_official 82:0b31dbcd4769 177 uint32_t error = 0;
mbed_official 82:0b31dbcd4769 178 uint32_t p_error = 0xffffffff;
mbed_official 82:0b31dbcd4769 179 uint32_t ref = 0;
mbed_official 82:0b31dbcd4769 180 uint8_t i, j;
mbed_official 82:0b31dbcd4769 181 // bus clk
mbed_official 82:0b31dbcd4769 182 uint32_t PCLK = bus_frequency();
mbed_official 82:0b31dbcd4769 183 uint32_t pulse = PCLK / (hz * 2);
mbed_official 82:0b31dbcd4769 184
mbed_official 82:0b31dbcd4769 185 // we look for the values that minimize the error
mbed_official 82:0b31dbcd4769 186
mbed_official 82:0b31dbcd4769 187 // test all the MULT values
mbed_official 82:0b31dbcd4769 188 for (i = 1; i < 5; i*=2) {
mbed_official 82:0b31dbcd4769 189 for (j = 0; j < 0x40; j++) {
mbed_official 82:0b31dbcd4769 190 ref = PCLK / (i*ICR[j]);
mbed_official 82:0b31dbcd4769 191 if (ref > (uint32_t)hz)
mbed_official 82:0b31dbcd4769 192 continue;
mbed_official 82:0b31dbcd4769 193 error = hz - ref;
mbed_official 82:0b31dbcd4769 194 if (error < p_error) {
mbed_official 82:0b31dbcd4769 195 icr = j;
mbed_official 82:0b31dbcd4769 196 mult = i/2;
mbed_official 82:0b31dbcd4769 197 p_error = error;
mbed_official 82:0b31dbcd4769 198 }
mbed_official 82:0b31dbcd4769 199 }
mbed_official 82:0b31dbcd4769 200 }
mbed_official 82:0b31dbcd4769 201 pulse = icr | (mult << 6);
mbed_official 82:0b31dbcd4769 202
mbed_official 82:0b31dbcd4769 203 // I2C Rate
mbed_official 82:0b31dbcd4769 204 obj->i2c->F = pulse;
mbed_official 82:0b31dbcd4769 205 }
mbed_official 82:0b31dbcd4769 206
mbed_official 82:0b31dbcd4769 207 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
mbed_official 82:0b31dbcd4769 208 int count;
mbed_official 82:0b31dbcd4769 209 char dummy_read, *ptr;
mbed_official 82:0b31dbcd4769 210
mbed_official 82:0b31dbcd4769 211 if (i2c_start(obj)) {
mbed_official 82:0b31dbcd4769 212 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 213 return I2C_ERROR_BUS_BUSY;
mbed_official 82:0b31dbcd4769 214 }
mbed_official 82:0b31dbcd4769 215
mbed_official 82:0b31dbcd4769 216 if (i2c_do_write(obj, (address | 0x01))) {
mbed_official 82:0b31dbcd4769 217 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 218 return I2C_ERROR_NO_SLAVE;
mbed_official 82:0b31dbcd4769 219 }
mbed_official 82:0b31dbcd4769 220
mbed_official 82:0b31dbcd4769 221 // set rx mode
mbed_official 82:0b31dbcd4769 222 obj->i2c->C1 &= ~I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 223
mbed_official 82:0b31dbcd4769 224 // Read in bytes
mbed_official 82:0b31dbcd4769 225 for (count = 0; count < (length); count++) {
mbed_official 82:0b31dbcd4769 226 ptr = (count == 0) ? &dummy_read : &data[count - 1];
mbed_official 82:0b31dbcd4769 227 uint8_t stop_ = (count == (length - 1)) ? 1 : 0;
mbed_official 82:0b31dbcd4769 228 if (i2c_do_read(obj, ptr, stop_)) {
mbed_official 82:0b31dbcd4769 229 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 230 return count;
mbed_official 82:0b31dbcd4769 231 }
mbed_official 82:0b31dbcd4769 232 }
mbed_official 82:0b31dbcd4769 233
mbed_official 82:0b31dbcd4769 234 // If not repeated start, send stop.
mbed_official 82:0b31dbcd4769 235 if (stop) {
mbed_official 82:0b31dbcd4769 236 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 237 }
mbed_official 82:0b31dbcd4769 238
mbed_official 82:0b31dbcd4769 239 // last read
mbed_official 82:0b31dbcd4769 240 data[count-1] = obj->i2c->D;
mbed_official 82:0b31dbcd4769 241
mbed_official 82:0b31dbcd4769 242 return length;
mbed_official 82:0b31dbcd4769 243 }
mbed_official 82:0b31dbcd4769 244 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
mbed_official 82:0b31dbcd4769 245 int i;
mbed_official 82:0b31dbcd4769 246
mbed_official 82:0b31dbcd4769 247 if (i2c_start(obj)) {
mbed_official 82:0b31dbcd4769 248 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 249 return I2C_ERROR_BUS_BUSY;
mbed_official 82:0b31dbcd4769 250 }
mbed_official 82:0b31dbcd4769 251
mbed_official 82:0b31dbcd4769 252 if (i2c_do_write(obj, (address & 0xFE))) {
mbed_official 82:0b31dbcd4769 253 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 254 return I2C_ERROR_NO_SLAVE;
mbed_official 82:0b31dbcd4769 255 }
mbed_official 82:0b31dbcd4769 256
mbed_official 82:0b31dbcd4769 257 for (i = 0; i < length; i++) {
mbed_official 82:0b31dbcd4769 258 if(i2c_do_write(obj, data[i])) {
mbed_official 82:0b31dbcd4769 259 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 260 return i;
mbed_official 82:0b31dbcd4769 261 }
mbed_official 82:0b31dbcd4769 262 }
mbed_official 82:0b31dbcd4769 263
mbed_official 82:0b31dbcd4769 264 if (stop) {
mbed_official 82:0b31dbcd4769 265 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 266 }
mbed_official 82:0b31dbcd4769 267
mbed_official 82:0b31dbcd4769 268 return length;
mbed_official 82:0b31dbcd4769 269 }
mbed_official 82:0b31dbcd4769 270
mbed_official 82:0b31dbcd4769 271 void i2c_reset(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 272 i2c_stop(obj);
mbed_official 82:0b31dbcd4769 273 }
mbed_official 82:0b31dbcd4769 274
mbed_official 82:0b31dbcd4769 275 int i2c_byte_read(i2c_t *obj, int last) {
mbed_official 82:0b31dbcd4769 276 char data;
mbed_official 82:0b31dbcd4769 277
mbed_official 82:0b31dbcd4769 278 // set rx mode
mbed_official 82:0b31dbcd4769 279 obj->i2c->C1 &= ~I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 280
mbed_official 178:a873352662d8 281 // Setup read
mbed_official 82:0b31dbcd4769 282 i2c_do_read(obj, &data, last);
mbed_official 178:a873352662d8 283
mbed_official 178:a873352662d8 284 // set tx mode
mbed_official 178:a873352662d8 285 obj->i2c->C1 |= I2C_C1_TX_MASK;
mbed_official 178:a873352662d8 286 return obj->i2c->D;
mbed_official 82:0b31dbcd4769 287 }
mbed_official 82:0b31dbcd4769 288
mbed_official 82:0b31dbcd4769 289 int i2c_byte_write(i2c_t *obj, int data) {
mbed_official 82:0b31dbcd4769 290 // set tx mode
mbed_official 82:0b31dbcd4769 291 obj->i2c->C1 |= I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 292
mbed_official 82:0b31dbcd4769 293 return !i2c_do_write(obj, (data & 0xFF));
mbed_official 82:0b31dbcd4769 294 }
mbed_official 82:0b31dbcd4769 295
mbed_official 82:0b31dbcd4769 296
mbed_official 82:0b31dbcd4769 297 #if DEVICE_I2CSLAVE
mbed_official 82:0b31dbcd4769 298 void i2c_slave_mode(i2c_t *obj, int enable_slave) {
mbed_official 82:0b31dbcd4769 299 if (enable_slave) {
mbed_official 82:0b31dbcd4769 300 // set slave mode
mbed_official 82:0b31dbcd4769 301 obj->i2c->C1 &= ~I2C_C1_MST_MASK;
mbed_official 82:0b31dbcd4769 302 obj->i2c->C1 |= I2C_C1_IICIE_MASK;
mbed_official 82:0b31dbcd4769 303 } else {
mbed_official 82:0b31dbcd4769 304 // set master mode
mbed_official 82:0b31dbcd4769 305 obj->i2c->C1 |= I2C_C1_MST_MASK;
mbed_official 82:0b31dbcd4769 306 }
mbed_official 82:0b31dbcd4769 307 }
mbed_official 82:0b31dbcd4769 308
mbed_official 82:0b31dbcd4769 309 int i2c_slave_receive(i2c_t *obj) {
mbed_official 82:0b31dbcd4769 310 switch(obj->i2c->S) {
mbed_official 82:0b31dbcd4769 311 // read addressed
mbed_official 82:0b31dbcd4769 312 case 0xE6: return 1;
mbed_official 82:0b31dbcd4769 313
mbed_official 82:0b31dbcd4769 314 // write addressed
mbed_official 82:0b31dbcd4769 315 case 0xE2: return 3;
mbed_official 82:0b31dbcd4769 316
mbed_official 82:0b31dbcd4769 317 default: return 0;
mbed_official 82:0b31dbcd4769 318 }
mbed_official 82:0b31dbcd4769 319 }
mbed_official 82:0b31dbcd4769 320
mbed_official 82:0b31dbcd4769 321 int i2c_slave_read(i2c_t *obj, char *data, int length) {
mbed_official 82:0b31dbcd4769 322 uint8_t dummy_read;
mbed_official 82:0b31dbcd4769 323 uint8_t * ptr;
mbed_official 82:0b31dbcd4769 324 int count;
mbed_official 82:0b31dbcd4769 325
mbed_official 82:0b31dbcd4769 326 // set rx mode
mbed_official 82:0b31dbcd4769 327 obj->i2c->C1 &= ~I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 328
mbed_official 82:0b31dbcd4769 329 // first dummy read
mbed_official 82:0b31dbcd4769 330 dummy_read = obj->i2c->D;
mbed_official 82:0b31dbcd4769 331 if(i2c_wait_end_rx_transfer(obj)) {
mbed_official 82:0b31dbcd4769 332 return 0;
mbed_official 82:0b31dbcd4769 333 }
mbed_official 82:0b31dbcd4769 334
mbed_official 82:0b31dbcd4769 335 // read address
mbed_official 82:0b31dbcd4769 336 dummy_read = obj->i2c->D;
mbed_official 82:0b31dbcd4769 337 if(i2c_wait_end_rx_transfer(obj)) {
mbed_official 82:0b31dbcd4769 338 return 0;
mbed_official 82:0b31dbcd4769 339 }
mbed_official 82:0b31dbcd4769 340
mbed_official 82:0b31dbcd4769 341 // read (length - 1) bytes
mbed_official 82:0b31dbcd4769 342 for (count = 0; count < (length - 1); count++) {
mbed_official 82:0b31dbcd4769 343 data[count] = obj->i2c->D;
mbed_official 82:0b31dbcd4769 344 if(i2c_wait_end_rx_transfer(obj)) {
mbed_official 82:0b31dbcd4769 345 return count;
mbed_official 82:0b31dbcd4769 346 }
mbed_official 82:0b31dbcd4769 347 }
mbed_official 82:0b31dbcd4769 348
mbed_official 82:0b31dbcd4769 349 // read last byte
mbed_official 82:0b31dbcd4769 350 ptr = (length == 0) ? &dummy_read : (uint8_t *)&data[count];
mbed_official 82:0b31dbcd4769 351 *ptr = obj->i2c->D;
mbed_official 82:0b31dbcd4769 352
mbed_official 82:0b31dbcd4769 353 return (length) ? (count + 1) : 0;
mbed_official 82:0b31dbcd4769 354 }
mbed_official 82:0b31dbcd4769 355
mbed_official 82:0b31dbcd4769 356 int i2c_slave_write(i2c_t *obj, const char *data, int length) {
mbed_official 82:0b31dbcd4769 357 int i, count = 0;
mbed_official 82:0b31dbcd4769 358
mbed_official 82:0b31dbcd4769 359 // set tx mode
mbed_official 82:0b31dbcd4769 360 obj->i2c->C1 |= I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 361
mbed_official 82:0b31dbcd4769 362 for (i = 0; i < length; i++) {
mbed_official 82:0b31dbcd4769 363 if(i2c_do_write(obj, data[count++]) == 2) {
mbed_official 82:0b31dbcd4769 364 return i;
mbed_official 82:0b31dbcd4769 365 }
mbed_official 82:0b31dbcd4769 366 }
mbed_official 82:0b31dbcd4769 367
mbed_official 82:0b31dbcd4769 368 // set rx mode
mbed_official 82:0b31dbcd4769 369 obj->i2c->C1 &= ~I2C_C1_TX_MASK;
mbed_official 82:0b31dbcd4769 370
mbed_official 82:0b31dbcd4769 371 // dummy rx transfer needed
mbed_official 82:0b31dbcd4769 372 // otherwise the master cannot generate a stop bit
mbed_official 82:0b31dbcd4769 373 obj->i2c->D;
mbed_official 82:0b31dbcd4769 374 if(i2c_wait_end_rx_transfer(obj) == 2) {
mbed_official 82:0b31dbcd4769 375 return count;
mbed_official 82:0b31dbcd4769 376 }
mbed_official 82:0b31dbcd4769 377
mbed_official 82:0b31dbcd4769 378 return count;
mbed_official 82:0b31dbcd4769 379 }
mbed_official 82:0b31dbcd4769 380
mbed_official 82:0b31dbcd4769 381 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) {
mbed_official 82:0b31dbcd4769 382 obj->i2c->A1 = address & 0xfe;
mbed_official 82:0b31dbcd4769 383 }
mbed_official 82:0b31dbcd4769 384 #endif
mbed_official 82:0b31dbcd4769 385