/* * Copyright (c) 2021 Valentin Milea * * SPDX-License-Identifier: MIT */ #ifndef _I2C_SLAVE_H_ #define _I2C_SLAVE_H_ #include #include #ifdef __cplusplus extern "C" { #endif /** \file i2c_slave.h * * \brief I2C slave setup. */ /** * \brief I2C slave event types. */ typedef enum i2c_slave_event_t { I2C_SLAVE_RECEIVE, /**< Data from master is available for reading. Slave must read from Rx FIFO. */ I2C_SLAVE_REQUEST, /**< Master is requesting data. Slave must write into Tx FIFO. */ I2C_SLAVE_FINISH, /**< Master has sent a Stop or Restart signal. Slave may prepare for the next transfer. */ } i2c_slave_event_t; /** * \brief I2C slave event handler * * The event handler will run from the I2C ISR, so it should return quickly (under 25 us at 400 kb/s). * Avoid blocking inside the handler and split large data transfers across multiple calls for best results. * When sending data to master, up to `i2c_get_write_available()` bytes can be written without blocking. * When receiving data from master, up to `i2c_get_read_available()` bytes can be read without blocking. * * \param i2c Slave I2C instance. * \param event Event type. */ typedef void (*i2c_slave_handler_t)(i2c_inst_t *i2c, i2c_slave_event_t event); /** * \brief Configure I2C instance for slave mode. * * \param i2c I2C instance. * \param address 7-bit slave address. * \param handler Called on events from I2C master. It will run from the I2C ISR, on the CPU core * where the slave was initialized. */ void i2c_slave_init(i2c_inst_t *i2c, uint8_t address, i2c_slave_handler_t handler); /** * \brief Restore I2C instance to master mode. * * \param i2c I2C instance. */ void i2c_slave_deinit(i2c_inst_t *i2c); #ifdef __cplusplus } #endif #endif // _I2C_SLAVE_H_