for (i = 0; i < I2C_HW_FIFO_SIZE; i++) {
                if (bus->slv_wr_size >= I2C_HW_FIFO_SIZE)
                        break;
-               i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value);
+               if (bus->state == I2C_SLAVE_MATCH) {
+                       i2c_slave_event(bus->slave, I2C_SLAVE_READ_REQUESTED, &value);
+                       bus->state = I2C_OPER_STARTED;
+               } else {
+                       i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value);
+               }
                ind = (bus->slv_wr_ind + bus->slv_wr_size) % I2C_HW_FIFO_SIZE;
                bus->slv_wr_buf[ind] = value;
                bus->slv_wr_size++;
-               i2c_slave_event(bus->slave, I2C_SLAVE_READ_PROCESSED, &value);
        }
        return I2C_HW_FIFO_SIZE - ret;
 }
        if (nwrite == 0)
                return;
 
-       bus->state = I2C_OPER_STARTED;
        bus->operation = I2C_WRITE_OPER;
 
        /* get the next buffer */