IoAbstraction has core I2C/Wire and SPI functionality provided by several functions, these abstract the use of I2C and SPI over Arduino, mbed, PicoSDK and other supported platforms. 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 simplifying access.
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.You can use SPI regardless of platform using the SPI abstraction. This is used in a few places within IoAbstraction so is already quite stable.
In order to create an instance, you first need to create an SPIWithSettings
object:
SPIWithSettings spiObj(&SPIBus, csPin);
Then in your code somewhere:
spiObj.init();
Where:
&SPI
for example.The class is quite small and has copy constructors, so you can safely copy it over by value, and this is often how its used within IoAbstraction.
Normally on SPI you read and write data at the same time, therefore to transfer
data call the following method that will first select the chip, do the transfer, and then deselect the chip:
uint8_t readWriteData[dataSize];
bool ok = spiObj.transferSPI(readWriteData, dataSize);
Where