Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic
Fork of mbed-src by
Diff: common/I2C.cpp
- Revision:
- 525:c320967f86b9
- Parent:
- 212:34d62c0b2af6
- Child:
- 563:536c9fb088a0
diff -r c0134becc221 -r c320967f86b9 common/I2C.cpp --- a/common/I2C.cpp Mon Apr 27 09:45:08 2015 +0100 +++ b/common/I2C.cpp Tue Apr 28 11:45:12 2015 +0100 @@ -1,5 +1,5 @@ /* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited + * Copyright (c) 2006-2015 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,11 @@ I2C *I2C::_owner = NULL; -I2C::I2C(PinName sda, PinName scl) : _i2c(), _hz(100000) { +I2C::I2C(PinName sda, PinName scl) : +#if DEVICE_I2C_ASYNCH + _irq(this), _usage(DMA_USAGE_NEVER), +#endif + _i2c(), _hz(100000) { // The init function also set the frequency to 100000 i2c_init(&_i2c, sda, scl); @@ -86,6 +90,39 @@ i2c_stop(&_i2c); } +#if DEVICE_I2C_ASYNCH + +int I2C::transfer(int address, char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t& callback, int event, bool repeated) +{ + if (i2c_active(&_i2c)) { + return -1; // transaction ongoing + } + aquire(); + + _callback = callback; + int stop = (repeated) ? 0 : 1; + _irq.callback(&I2C::irq_handler_asynch); + i2c_transfer_asynch(&_i2c, (void *)tx_buffer, tx_length, (void *)rx_buffer, rx_length, address, stop, _irq.entry(), event, _usage); + return 0; +} + +void I2C::abort_transfer(void) +{ + i2c_abort_asynch(&_i2c); +} + +void I2C::irq_handler_asynch(void) +{ + int event = i2c_irq_handler_asynch(&_i2c); + if (_callback && event) { + _callback.call(event); + } + +} + + +#endif + } // namespace mbed #endif