I2CConfig i2cconfig = { opmodeI2C, 100000, stdDutyCycle, 0, 0 }; void cba(I2CDriver* i2cp, I2CSlaveConfig* i2cscfg) { if(i2cp->id_slave_config->restart) { i2cp->id_slave_config->restart = FALSE; i2cMasterReceive(i2cp, i2cscfg); } else { i2cMasterStop(i2cp); } } void cbe(I2CDriver* i2cp, I2CSlaveConfig* i2cscfg) { while(1); } i2cblock_t rxdata[6]; i2cblock_t txdata[2] = {0x1d}; I2CSlaveConfig i2c_gyro = { cba, cbe, rxdata, 6, 6, 0, txdata, 2, 1, 0, 0x68, TRUE }; int main(void) { halInit(); chSysInit(); led_thread.start(); i2cStart(&I2CD2, &i2cconfig); while(I2CD2.id_state != I2C_READY) { chThdSleepMilliseconds(1); } palSetPadMode(GPIOB, 10, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); palSetPadMode(GPIOB, 11, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); i2cMasterTransmit(&I2CD2, &i2c_gyro); ... }