IoAbstraction 2.0 onwards has core I2C/Wire functionality provided by several functions, these abstract the use of I2C over Arduino and mbed, and over time the implementation of these will be improved, such that asynchronous behaviour will be possible on certain boards.
Prior to 2.0, we had conditional I2C code scattered around the project, but now nearly all such functionality is separated out by platform, and sometimes even by board, we’ve made this available through the API, so you can use it too.
We wrap up the wire object with WireType
; which on Arduino it is a TwoWire pointer and on mbed it is an I2C pointer. For example the default wire type on Arduino would be &Wire
. Be aware that this is not a complete replacement for Wire/I2C, it is a simple set of calls for reading and write from I2C where the device is master. It works on a very wide range of boards without needing code changes.
To initialise the I2C layer, on mbed you call the following providing the I2C object to use:
void ioaWireBegin(I2C* pI2cToUse);
For Arduino boards you would call the following to use the Wire
default:
void ioaWireBegin();
To set the speed at which the bus runs, set the frequency such as 100000, 400000:
void ioaWireSetSpeed(WireType pI2c, long frequency);
To check if the bus can be used at the moment for a given address:
bool ioaWireReady(WireType wire, int address);
On all boards there is a lock around the i2c bus, this ensures that only one thread deals with the bus at once.
extern SimpleSpinLock i2cLock;
To read bytes from the bus:
bool ioaWireRead(WireType wire, int address, uint8_t* buffer, size_t len);
Where:
WireType
as described above. EG &Wire
on Arduino.bool ioaWireWriteWithRetry(WireType pI2c, int address, const uint8_t* buffer,
size_t len, int retriesAllowed = 0, bool sendStop = true);
Where:
WireType
as described above. EG &Wire
on Arduino.