I2C

To use the hardware I2C, include it in your code:

#include "Wire.h"

The first I2C object is explicitly created, and is connected to the I2C1 instance.

Please check your board documentation to see which pins is I2C connected to by default.

To use additional I2C, use the constructors to create your object, or the stm32SetInstance() method.

begin()

Start the I2C in master mode with default 100Khz speed.

begin(uint8_t address)

Start the I2C in slave mode with default 100Khz speed. Slave mode currently does not work in F1 chips.

beginTransmission(uint8_t address)

Set the address for the next transmission.

write(uint8_t data)

Master mode: writes the data into a buffer to be send out in endTransmission.

Slave mode: Send response to master. Currently can only be used inside the onRequest callback.

endTransmission()

Send the buffer to the slave.

uint8_t requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop)

Requests data from the slave. Returns the number of bytes read into the receive buffer.

The data then can be retrieved using read().

int available()

Returns data available in the receive buffer.

int read()

Returns the next byte in the receive buffer, or -1, if no more data available.

SetClock(uint32_t frequency)

Set the I2C clock frequency, and reinitializes the I2C peripheral.

onReceive(void (*callback)(int))

Sets the callback function in slave mode. When data is received, this will be called.

The current implementation calls this for every byte received.

onRequest(void (*callback)(void))

Sets the callback function in slave mode. When data is requested, this will be called.

You can respond to the master using the write() method.

stm32SetSDA(uint8_t pin);

Set the SDA pin used by this I2C.

This method must be called before begin()!

stm32SetSCL(uint8_t pin);

Set the alternative SCL pin used by this I2C.

This method must be called before begin()!

stm32SetInstance(I2C_TypeDef *instance);

Set the alternative I2C instance (I2C1/I2C2/...) used by this object.

This method must be called before begin()!

Example: If you want to use a library that has hardcoded I2C in it, but you want to use I2C2:

#include "Wire.h"

void setup() {
    Wire.stm32SetInstance(I2C2);
    Wire.stm32SetSDA(sda);
    Wire.stm32SetSCL(scl);
    ...
    library.begin();
}