mbed library sources for GR-PEACH rev.B.

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Jan 31 10:00:06 2014 +0000
Revision:
82:0b31dbcd4769
Child:
178:a873352662d8
Synchronized with git revision 74409cbd593d1daab530a57baaa563f30b04b018

Full URL: https://github.com/mbedmicro/mbed/commit/74409cbd593d1daab530a57baaa563f30b04b018/

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