title: I2C slave receiver on stm32f4
body: <p>I try to implement a i2c slave receiver interrupt service routine on a stm32f4. 
  Here is my smart piece of code. </p>
  
  <pre><code>void I2C2_EV_IRQHandler()
    {
      switch (I2C_GetLastEvent(I2C2))
      {
      //The address sent by the master matches the own address of the peripheral
      case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
          //The slave stretches SCL low until ADDR is
          //cleared and DR filled with the data to be sent
          I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
          break;
  
      //The application is expecting a data byte to be received
      case I2C_EVENT_SLAVE_BYTE_RECEIVED:
          I2C_ReceiveData(I2C2);
          break;
  
      //The application is expecting the end of the communication
      //Make sure that both ADDR and STOPF flags are cleared
      //if both are found set.
      case I2C_EVENT_SLAVE_STOP_DETECTED:
          if(I2C_GetFlagStatus(I2C2,I2C_FLAG_ADDR) == SET)
              I2C_ClearFlag(I2C2,I2C_FLAG_ADDR);
          if(I2C_GetFlagStatus(I2C2,I2C_FLAG_STOPF) == SET)
              I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);
  }
  </code></pre>
  
  <p>}</p>
  
  <p>The interrupt becomes called and I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED case is entered. 
  The SCL is low now. The reference manual says if I clear the address flag, the clock will continue and data will be sent (Page 579 - Slave receiver). In my opinion the interrupt always becomes called if any data arrives and next state will be I2C_EVENT_SLAVE_BYTE_RECEIVED.</p>
  
  <p>I can not find any example from stm or via google. Can anybody help me or show me an example. </p>